MessageBox.showメソッドを実行するとMessageBoxが表示されます。そしてボタンをクリックしないと次の処理がおこなわれません。だから以下のコードを実行してもMessageBoxが一気に10個表示されることはありません。
1 2 |
for (int i = 0; i < 10; i++) MessageBox.Show("メッセージを表示"); |
ところがTimerを使う場合は違ってきます。以下のコードを実行すると0.1秒おきにMessageBoxが表示され続けます。しかも操作を受け付けるのは最後に表示されたMessageBoxだけなので、ミスに気づいたとしてもFormを閉じることができません。ゲームをつくる場合、デバッグ目的でMessageBoxを表示させる場合は注意しないと死ぬことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { Timer Timer = new Timer(); int TickCount = 0; public Form1() { InitializeComponent(); Timer.Interval = 100; Timer.Tick += Timer_Tick; Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { // 無限に表示され続けると収拾がつかなくなるので10回で終わりにする TickCount++; if (TickCount >= 10) Timer.Stop(); MessageBox.Show("メッセージを表示"); } } |
上記のコードは無限に表示され続けると収拾がつかなくなるので10回で終わりにしていますが、以下のコードでは10個以上のMessageBoxが表示されます。理由はボタンをクリックしないと次の処理がおこなわれず、TickCountがインクリメントされないからです。実際には次々と表示されるMessageBoxを10回消すとTickCountが10になるので一応ストップさせることができます。
1 2 3 4 5 6 7 8 9 |
private void Timer_Tick(object sender, EventArgs e) { MessageBox.Show("メッセージを表示"); // MessageBoxを消さないと以下のコードは実行されない TickCount++; if (TickCount >= 10) Timer.Stop(); } |
以下のコードは0.1秒ごとにTickCountの値をタイトルバーに表示させるプログラムです。ボタンをクリックするとMessageBoxが表示されます。[OK]をクリックしてMessageBoxを消さないと他の処理ができないのですが、表示させているあいだもタイトルバーの数字は増加しつづけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public partial class Form1 : Form { Timer Timer = new Timer(); int TickCount = 0; public Form1() { InitializeComponent(); Timer.Interval = 100; Timer.Tick += Timer_Tick; Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { TickCount++; Text = TickCount.ToString(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("メッセージを表示"); } } |
Timer1_Tick内でMessageBoxを処理した場合の質問です。
管理人より。管理人でないとHTMLタグをつかっても反映されないようです。同じ質問内容を管理人の名前でコメントしなおしました。
Timer1_Tick内でMessageBoxを処理した場合の質問です。
プログラムの内容としましては、ドアが開いてるかどうかを検知して開いていればメッセージボックスに”ドアが開きました!”と表示するものです。
メッセージボックスの表示は1度のみにしたいので、表示したかどうかのフラグをつける事にしました。ソースが以下です。(コメント欄で改行崩れて見にくいかもしれません)
このようにする事でメッセージボックスを1度のみ表示する事ができました。
ただこれを
このように、MessageBoxFlag = true;をMessageBox.Showの下に書いてしまうと、メッセージボックスが何度も表示されてしまいます。これはなぜでしょうか?
メッセージボックスが表示後はフラグがtrueになると思うのですが…2度目が表示されるのが何故かわからないです。
お助けいただけますでしょうか。
質問に対する回答ですが、MessageBoxが表示された場合、ボタンをクリックして消さないとそれより下の処理が実行されません。
MessageBoxが表示されている限り、MessageBoxFlag = true;の部分は実行されません。
だからフラグの変更はMessageBox.Show()の前に実行しなければなりません。
なるほど…
MessageBox.Showはメッセージボックスを表示した時点で処理が完了しているものだと思っていました。
閉じるまでは処理が完了していないという事なんですね。
納得しました。ありがとうございました。