- ベストアンサー
C#のlabelの表示について
- C#のlabelを使用して時刻を表示するプログラムで、秒が0になると分の位の画像が移動して元の位置に戻る際に、秒が00ではなく59のままになってしまう問題が発生しています。
- また、0.8秒かかるループ中にタイマーの呼び出しが実行されているかどうかも不明です。
- labelとpictureBoxを重ねて配置している際、labelの位置も一緒に移動するようにするために、labelの親コントロールをpictureBoxに変更しました。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>そのとき秒が「00」とはならず「59」のままで、このループが終わると「00」を飛ばして「01」となります。 グラフィックやPCの処理速度によって、状態が異なると思います。 for (a = 0; a < 10; a++) { System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { System.Threading.Thread.Sleep(10); } 単純にループだけで0.8秒を使用しています。 さらにオブジェクトの座標が描画されるのでそれ+αが、この間に要します。 59→01は、単に処理が追い付いていないだけだと思います。 処理を占有させずに、ピクチャボックスの座標を変更させるように改造をすると良いと思います。 注意すべきは、割り込みを考慮することです。 改造サンプルは、タイマーのTagを利用しています。 private void Form1_Load(object sender, EventArgs e) { this.timer1.Tag = ""; } private void timer1_Tick(object sender, EventArgs e) { //現在の時刻を取得 DateTime dt = DateTime.Now; int Second_1 = dt.Second % 10; ~略~ label6.Text = Hour_2.ToString(); if (dt.Second == 0 && (this.timer1.Tag.ToString() != dt.ToString("mmss"))) { this.timer1.Tag = dt.ToString("mmss"); 描画(); } } private void 描画() { Application.DoEvents(); int a; for (a = 0; a < 10; a++) { pictureBox4.Top += 1; System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { pictureBox4.Top += 5; System.Threading.Thread.Sleep(10); } pictureBox4.Top = 12; }
お礼
お返事が遅くなりすみません。 とても良い勉強になり、無事解決することができました! ありがとうございました^^