私のクラスの1つを10秒間私のウィンドウに点滅する赤線で描画しようとしていますが、graphics.DrawLine
にSystem.ArgumentException: parameter is not valid
というエラーが表示されます。問題を見つけようとすると、最小限の部品を含めて再現しています。 red
とdark
関数は、タイマーのaTick
イベントの外で線を完全に描画しますが、それによってアクティブ化されている間は上記のエラーが発生します。グラフィックスやペンオブジェクトが無効なときにこのエラーが発生する人もいますが、私にとってはこれは当てはまりません。タイマーのgraphics.DrawLineで 'System.ArgumentExceptionパラメータが有効ではありません'
私のコードについて:私は非常に最近になってプログラミングを始めました。データバインディングに関する伝説だけを聞いたことがあり、コードを簡略化できたと思いますが、それは私の能力の範囲外です。 boolがtrueになったときにアクションを実行してから(それをfalseに戻す)回避策があります。これは私が点滅を開始するために、またタイマーの各ティックで私のグラフィックスを再描画するために使用しているものです。 aTick
イベントの最後にredraw
を変更しようとしたときに、Cannot use ref or out parameter 'redraw' inside an anonymous method, lambda expression, or query expression
と表示されていたので、私はまた2番目のRedraw
ブールが必要でした。あなたが見るように、私はその2番目のブールを追加することでその周りに取り組みましたが、なぜそれが起こっているのか、それに対してより良い解決策があるのかを私に説明することができれば素晴らしいでしょう。ここで
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GrafikaTeszt
{
public partial class Form1 : Form
{
bool flash = false; //can we draw the line?
bool redraw = false; //should we redraw?
public Form1()
{
InitializeComponent();
}
Class1 classic = new Class1();
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (flash)
{
classic.makeitflash(e.Graphics, out redraw);
if (redraw)
{
Invalidate();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
flash = true;
Invalidate();
}
}
}
そして、ここで私は線を描画しようとしている元のクラスからのコードです:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace GrafikaTeszt
{
class Class1
{
Timer clock;
int ticks;
public void makeitflash(Graphics g, out bool redraw)
{
redraw = false;
bool Redraw = false;
ticks = 0;
clock.Start();
clock.Tick += new EventHandler(aTick);
void aTick(object sender, EventArgs e)
{
if (ticks % 2 == 0)
{
red(); //draw a red line
}
else
{
dark(); //draw a darkred line
}
if (ticks == 20)
{
clock.Stop();
}
ticks++;
Redraw = true;
}
void red() { g.DrawLine(Pens.Red, 100, 100, 500, 500); }
void dark() { g.DrawLine(Pens.DarkRed, 100, 100, 500, 500); }
redraw = Redraw;
}
public Class1()
{
clock = new Timer();
clock.Interval = 200;
}
}
}
最近追加されたC#言語機能がスパゲッティコードの書き方にどれほど最近追加されたかを知ることができます。 Paintイベントが発生した後、e.Graphicsオブジェクトが無効になるため、クラッシュします。まともなチュートリアルやWinformsプログラミングの入門書が役立ちます。 –