MessageBox.showメソッドを実行するとMessageBoxが表示されます。そしてボタンをクリックしないと次の処理がおこなわれません。だから以下のコードを実行してもMessageBoxが一気に10個表示されることはありません。
for ( int i = 0 ; i < 10 ; i ++)
MessageBox . Show ( "メッセージを表示" ) ;
ところがTimerを使う場合は違ってきます。以下のコードを実行すると0.1秒おきにMessageBoxが表示され続けます。しかも操作を受け付けるのは最後に表示されたMessageBoxだけなので、ミスに気づいたとしてもFormを閉じることができません。ゲームをつくる場合、デバッグ目的でMessageBoxを表示させる場合は注意しないと死ぬことになります。
VIDEO
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になるので一応ストップさせることができます。
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 ( "メッセージを表示" ) ;
}
}
鳩でも分かるC#管理人からのお願い
できる仕事であれば請け負います。鳩でもわかるC#管理人はクラウドワークスに在宅ワーカーとして登録しています。お仕事の依頼もお待ちしております。
⇒ 仕事を依頼する
コメントについて
コメントで英語などの外国語でコメントをされる方がいますが、管理人は日本語以外はわからないので基本的に内容が理解できず、承認することもありません。それからへんな薬を売っているサイトやリンク先のサイトが存在しないというスパムコメントも多々あります。
Some people make comments in foreign languages such as English, but since the manager does not understand anything other than Japanese, he basically cannot understand the content and does not approve it. Please use Japanese when making comments.
そんななか日本語のコメントもいただけるようになりました。「○○という変数はどこで宣言されているのか?」「××というメソッドはどこにあるのか」「例外が発生する」「いっそのことソース丸ごとくれ」という質問ですが、管理人としては嬉しく思います。「自分が書いた記事は読まれているんだな」と。疑問点には可能な限り答えます。記事に問題があれば修正いたします。
そのうえでお願いがあります。「匿名」という味も素っ気もない名前ではなく、捨てハンでいいのでなにかハンドルネームをつくってほしいと思います。
管理人のモチベーションアップのために
よろしければご支援お願いします。
⇒ 管理人の物乞いリスト
Timer1_Tick内でMessageBoxを処理した場合の質問です。
管理人より。管理人でないとHTMLタグをつかっても反映されないようです。同じ質問内容を管理人の名前でコメントしなおしました。
Timer1_Tick内でMessageBoxを処理した場合の質問です。
プログラムの内容としましては、ドアが開いてるかどうかを検知して開いていればメッセージボックスに”ドアが開きました!”と表示するものです。
メッセージボックスの表示は1度のみにしたいので、表示したかどうかのフラグをつける事にしました。ソースが以下です。(コメント欄で改行崩れて見にくいかもしれません)
このようにする事でメッセージボックスを1度のみ表示する事ができました。
ただこれを
このように、MessageBoxFlag = true;をMessageBox.Showの下に書いてしまうと、メッセージボックスが何度も表示されてしまいます。これはなぜでしょうか?
メッセージボックスが表示後はフラグがtrueになると思うのですが…2度目が表示されるのが何故かわからないです。
お助けいただけますでしょうか。
質問に対する回答ですが、MessageBoxが表示された場合、ボタンをクリックして消さないとそれより下の処理が実行されません。
MessageBoxが表示されている限り、MessageBoxFlag = true;の部分は実行されません。
だからフラグの変更はMessageBox.Show()の前に実行しなければなりません。
なるほど…
MessageBox.Showはメッセージボックスを表示した時点で処理が完了しているものだと思っていました。
閉じるまでは処理が完了していないという事なんですね。
納得しました。ありがとうございました。