アプリ版:「スタンプのみでお礼する」機能のリリースについて

C#で、例えばForm2をForm1から開き、ある問題があってForm2のボタンを押すとForm2のラベルに正解と表示されます。
その文字が表示されたら数秒後に自動でForm2が閉じられるプログラムを書きたいのですがうまくいきません。

現在、こう書いています。3秒後とします。
using System.Threading;は宣言しています。

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if(label1.Text=="正解です。")
{
Thread.Sleep(3000);
e.Cancel= false;
}

こうするといつまでも閉じてくれません。

ボタンクリックプログラムに、if文で、~ならば正解です、~ならば間違いです、などとふり分けている中、正解のところに

label1.Text="正解です。";
Thread.Sleep(3000);
this.Close();

などとすると、ボタンを押したら、ラベルには何も表示されずに3秒後に閉じます。

どうすればいいでしょうか?

A 回答 (2件)

というワケで簡単に。


# 手動で閉じた場合だとか、タイマーのキャンセルしてないとか…まあ、いろいろありますけど。
全角スペースでインデントしていますので、コピペする際にはご注意を。

public partial class Form1 : Form
{
 private Timer CloseTimer;

 public Form1()
 {
  InitializeComponent();
  CloseTimer = new Timer();
  CloseTimer.Stop();
  CloseTimer.Interval = 3000;
  CloseTimer.Tick += new EventHandler(CloseTimer_Tick);
 }

 void CloseTimer_Tick(object sender, EventArgs e)
 {
  this.Close();
 }

 private void button1_Click(object sender, EventArgs e)
 {
  label1.Text = "正解です。";
  CloseTimer.Start();
 }

 private void button2_Click(object sender, EventArgs e)
 {
  label1.Text = "間違いです。";
 }
}
    • good
    • 0

>その文字が表示されたら数秒後に自動でForm2が閉じられるプログラムを書きたいのですがうまくいきません。



フォームにTimerクラスのフィールドを追加して、「正解」の文字列をラベルに設定したらタイマースタート。
タイマーの満了で自分自身でClose()メソッド呼べばいいんじゃないですかね?

http://msdn.microsoft.com/ja-jp/library/system.w …


>などとすると、ボタンを押したら、ラベルには何も表示されずに3秒後に閉じます。

イベントハンドラから抜けるまで3秒掛かります。
で、そのイベントハンドラを抜けた時点で
label1.Text="正解です。";
の描画が実行され、その直後に閉じます。

イベントハンドラ内で時間のかかる作業を行ってはいけません。
# と言いつつ、仕事で作ったヤツはしばらく時間かかる処理やってますけどね。
# おかげでプログラムがフリーズしたかのような反応になることも……。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。後日、実践してみます。

お礼日時:2014/11/08 00:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A