C#でストップウォッチをつくります。
まずは失敗作。
Timer.Tickイベントをつかって100分の1秒ごとに経過時間を表示しています。
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 26 27 28 29 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); _timer.Interval = 10; _timer.Tick += timer_Tick; } Timer _timer = new Timer(); private void timer_Tick(object sender, EventArgs e) { TimeSpan timeSpan = DateTime.Now - startDT; label1.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10); } DateTime startDT = DateTime.Now; private void buttonStart_Click(object sender, EventArgs e) { startDT = DateTime.Now; _timer.Start(); } private void buttonStop_Click(object sender, EventArgs e) { _timer.Stop(); } } |
このプログラムの欠陥は、ストップボタンを押して停止させたあと、スタートボタンを押して再度計測しようとすると00:00:00に戻ってしまうことです。スタートボタンを押したときに経過時間がクリアされてしまうのです。
ストップボタンが押されたときにこれまでの経過時間を保存しておく必要があります。
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 26 27 28 29 30 31 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); _timer.Interval = 10; _timer.Tick += timer_Tick; } Timer _timer = new Timer(); TimeSpan _timeSpan = new TimeSpan(0); private void timer_Tick(object sender, EventArgs e) { TimeSpan timeSpan = DateTime.Now - startDT + _timeSpan; label1.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10); } DateTime startDT = DateTime.Now; private void buttonStart_Click(object sender, EventArgs e) { startDT = DateTime.Now; _timer.Start(); } private void buttonStop_Click(object sender, EventArgs e) { _timer.Stop(); _timeSpan += DateTime.Now - startDT; } } |
TimeSpan型フィールド変数 _timeSpanをつくりました。_timeSpan += DateTime.Now – startDT;とすることで、ストップボタンが押されたときにスタートボタンが押されてからの経過時間を取得して保存しています。
リセットボタンを追加しました。_timeSpanのデータをクリアしています。またスタートボタンを押したらストップボタンが押されるまではスタートボタンとリセットボタンを押せなくしました。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); _timer.Interval = 10; _timer.Tick += timer_Tick; } Timer _timer = new Timer(); TimeSpan _timeSpan = new TimeSpan(0); DateTime startDT = DateTime.Now; private void timer_Tick(object sender, EventArgs e) { TimeSpan timeSpan = DateTime.Now - startDT + _timeSpan; label1.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10); } private void buttonStart_Click(object sender, EventArgs e) { startDT = DateTime.Now; _timer.Start(); buttonStart.Enabled = false; buttonReset.Enabled = false; buttonStop.Enabled = true; } private void buttonStop_Click(object sender, EventArgs e) { _timer.Stop(); _timeSpan += DateTime.Now - startDT; buttonStart.Enabled = true; buttonReset.Enabled = true; buttonStop.Enabled = false; } private void buttonReset_Click(object sender, EventArgs e) { _timeSpan = new TimeSpan(0); startDT = DateTime.Now; label1.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", _timeSpan.Hours, _timeSpan.Minutes, _timeSpan.Seconds, _timeSpan.Milliseconds / 10); } } |
初めまして。
初心者でして、最近こちらに掲載されているアプリを実行し、動きを勉強させてもらっています。
質問なのですが、
buttonStopにある
_timeSpan += DateTime.Now – startDT;
はどこにも使われてないので、
現状経過時間を活用できてないように思うのですが(=Startボタンを押すたびにリセットされる)
これを記憶させて時間を累積していくにはどうすればよいのでしょうか?
> _timeSpan += DateTime.Now – startDT;
> はどこにも使われてないので、
いえ、使われています。
なのでストップボタンを押すと計測が停止しますが、再度スタートボタンを押すと停止した時間を引き継いで計測が再開されます。
大変失礼しました…!
なるほど、そちらで引継ぎされていたのですね、見落としていました。
いつも勉強させていただきありがとうございます。