2015-06-09 78 views
0

我做了一個簡單的倒數計時器,但當我在文本框上輸入0 : 0 : 0時,計時器進入負數-1 : 59 : 59。我曾經嘗試輸入0 : 0 : 1和計時器停在0 : 0 : 0和消息框出現在屏幕倒數計時器進入負數(00:00:00)

我已經嘗試過這種代碼,以防止負值上,但它停在-1 : 59 : 58

if (label1.Text == "-1") 
{ 
    timer1.Stop() 
} 

嘗試這種代碼,但它停在-1 : 59 : 59

if (h < 0) 
{ 
    timer1.Stop(); 
} 

這裏是代碼

namespace Timer 
{ 

    public partial class Form1 : Form 
    { 

     int h; 
     int m; 
     int s; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (textBox1.Text == "") 
      { 
       textBox1.Text = "0"; 
      } 
      if (textBox2.Text == "") 
      { 
       textBox2.Text = "0"; 
      } 
      if (textBox3.Text == "") 
      { 
       textBox3.Text = "0"; 
      } 

      h = Convert.ToInt32(textBox1.Text); 
      m = Convert.ToInt32(textBox2.Text); 
      s = Convert.ToInt32(textBox3.Text); 

      timer1.Start(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      s = s - 1; 

      if(s == -1) 
      { 
       m = m - 1; 
       s = 59; 
      } 

      if (m == -1) 
      { 
       h = h - 1; 
       m = 59; 
      } 
      if (h == 0 && m == 0 && s == 0) 
      { 
       timer1.Stop(); 
       MessageBox.Show("Times up!", "Time"); 
      } 

      string hh = Convert.ToString(h); 
      string mm = Convert.ToString(m); 
      string ss = Convert.ToString(s); 

      label1.Text = hh; 
      label2.Text = mm; 
      label3.Text = ss; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      timer1.Stop(); 
     } 
    } 
} 
+0

您是否嘗試過使用調試器來查看發生了什麼 – pm100

+2

您是否已經通過代碼瞭解發生了什麼?代碼完全按照你所說的去做 - 逐步觀察,你會看到。 – Tim

+0

線索 - 錯誤位於刻度處理程序的第一行 – pm100

回答

0

你的代碼是做什麼你告訴它做,問題是,你是不是在處理開始的邊緣情況0:0:0

我認爲這將被認爲是無效的輸入,所以大概對付這種最簡單的方法是檢查之前,你甚至在點擊按鈕啓動定時器:

 h = Convert.ToInt32(textBox1.Text); 
     m = Convert.ToInt32(textBox2.Text); 
     s = Convert.ToInt32(textBox3.Text); 

     // one of these must be non-zero 
     if (h != 0 || m != 0 || s != 0) 
     { 
      timer1.Start(); 
     } 
     else 
     { 
      // handle this how ever you want but you don't need to start a timer 
      // and really shouldn't start the timer 
     } 

這實際上是一個如果用戶輸入全零,就會錯誤地讓計時器打勾,因爲那時他們會得到1秒,當他們要求0秒時。

更好的辦法是實際禁用該按鈕,直到輸入非零時間。爲此,我建議用NumericUpDown替換TextBox(因爲只有數字輸入有效),然後爲ValueChanged事件添加處理程序。在該處理程序中,檢入三個控件中的任何一個具有非零值,並在按鈕啓用時啓用該按鈕。如果它們都爲零,請禁用該按鈕。

這裏有一個重要的 - System.Windows.Forms.Timer不是特別準確,所以不要指望每隔1秒打一個計時器來實際打勾每秒。這將是至少至少每秒之間1秒,但通常會多幾毫秒。所以你的倒計時會漂移。如果您將其設置爲倒數1分鐘(即60秒),如果實際上需要62秒倒計時,請不要感到驚訝。如果這對您很重要,那麼您應該在啓動計時器時記錄當前時間,然後檢查當前時間與啓動計時器的時間之間的差異,並使用該時間更新標籤。

一個更好的整體解決方案可能是這個樣子:

DateTime end; 

private void button1_Click(object sender, EventArgs e) 
{ 
    var h = hourNumericUpDown.Value; 
    var m = minuteNumericUpDown.Value; 
    var s = secondsNumericUpDown.Value; 
    if (h != 0 || m != 0 || s != 0) 
    { 
     var start = DateTime.Now; 
     var timeSpan = new TimeSpan(0,h,m,s); 
     end = start.Add(timeSpan); 
     countDownLabel.Text = timeSpan.ToString(); 
     timer1.Start(); 
    } 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    var timeleft = end - DateTime.Now; 
    if (timeLeft.Ticks < 0) 
    { 
     countDownLabel.Text = "00:00:00"; 
     timer1.Stop(); 
     MessageBox.Show("Times up!", "Time"); 
    } 
    else 
    { 
     countDownLabel.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", 
      timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds); 
    } 
} 

然後你可能會更好設置定時器火得更快。也許每隔半秒或每隔一秒鐘一次,以便顯示器永遠不會超過那麼多。

+0

感謝您的信息。這個代碼的作品,但計時器倒計時像'5:59:59.2029422' – ninjacow

+0

@JohnWilliam:啊,只是格式化,然後,就像:'countDownLabel.Text = string.Format(「{0:D2}:{1: D2}:{2:D2}「,timeLeft.Hours,timeLeft.Minutes,timeLeft.Seconds);' –

+0

謝謝!現在一切都很好 – ninjacow

0

你不覆蓋提供0:0:0的情況。 替換此:

 s = s - 1; 

     if(s == -1) 
     { 
      m = m - 1; 
      s = 59; 
     } 

     if (m == -1) 
     { 
      h = h - 1; 
      m = 59; 
     } 

與此:

if(s > 0 || m > 0 || h > 0) 
{ 
      s = s - 1; 
      if(s == -1) 
      { 
       m = m - 1; 
       s = 59; 
      } 

      if (m == -1) 
      { 
       h = h - 1; 
       m = 59; 
      } 
} 
0

你沒有檢查何時h變爲負值,我添加了一個可以添加你的值。

if (s == -1) 
     { 
      m = m - 1; 
      s = 59; 
     } 

     if (m == -1) 
     { 
      h = h - 1; 
      m = 59; 
     } 
     /*I added such condition*/ 
     if(h < 0) 
     { 
      h = 0; 
      m = 0; 
      s = 0; 
     } 
     if (h == 0 && m == 0 && s == 0) 
     { 
      timer1.Stop(); 
      MessageBox.Show("Times up!", "Time"); 
      return;//return early 
     }