Timer z własnym zegarem - Jak?

0

Witajcie,

Piszę w VS - C# .NET framework 3.5
Do swojego programu chcę dodać timer w formacie HH MM SS który zacznie odliczać po wciśnięciu buttona. Drugim przyciskiem mam możliwość wstrzymania odliczania. Chciałbym by po wstrzymaniu odliczania hh, mm, ss przyporządkowały się do odpowiednich zmiennych po to bym mógł na nich wykonywać obliczenia.
Niestety po wielu próbach nie udawało mi się (umiem jeszcze za mało).

Pozdrawiam!

0

Wrzuć na formę dwa przyciski i jeden Label. Zobacz poniższy kod:

    public partial class ParentForm : Form
    {
        private Timer timer;
        private TimeSpan timeSpan;
        private readonly TimeSpan oneSecond = new TimeSpan(0, 0, 1);
        public ParentForm()
        {
            InitializeComponent();
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(TimerTick);
        }

        private void TimerTick(object sender, EventArgs e)
        {
            timeSpan = timeSpan.Add(oneSecond);
            labelTime.Text = timeSpan.ToString();
        }

        private void ButtonStartClick(object sender, EventArgs e)
        {
            timeSpan = new TimeSpan(0, 0, 0);
            timer.Start();
        }

        private void ButtonStopClick(object sender, EventArgs e)
        {
            timer.Stop();
        }
    }

W każdym "uderzeniu" zegara dodajesz jedną sekundę. Liczbę sekund, minut, godzin, będziesz mógł pobrać ze zmiennej timeSpan.

0

Dzięki za odpowiedź!
Wszystko by było OK gdyby nie to, że po skompilowaniu wyświetla się puste pole.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class ParentForm : Form
    {
        private Timer timer;
        private TimeSpan timeSpan;
        private readonly TimeSpan oneSecond = new TimeSpan(0, 0, 1);
        public ParentForm()
        {
            InitializeComponent();
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(TimerTick);
        }

        private void TimerTick(object sender, EventArgs e)
        {
            timeSpan = timeSpan.Add(oneSecond);
            labelTime.Text = timeSpan.ToString();
        }

        private void ButtonStopclick_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;
        }


        private void ButtonStart_Click(object sender, EventArgs e)
        {
            timeSpan = new TimeSpan(0, 0, 0);
            timer.Enabled = false; ;
        }

        private void labelTime_TextChanged(object sender, EventArgs e)
        {

        }






    }
}

Oczywiście w Designie potworzyłem dwa buttony i 1 label i je poprzyporządkowywalem az przestal marudzic. Jak wszystko zrobiłem i wreszcie skompilowal to nic nie wyswietlil ;)
Co zrobic?

0

przeczytac jeszcze z 10 razy to co napisal mykhaylo

0

Na początku nic się nie wyświetli. Ale jak wciśniesz przycisk Start, to uruchomisz zegar i po jednej sekundzie już powinieneś zobaczyć efekt.

0

Właśnie w tym rzecz, że nie wyświetla się żaden button i nie wyświetla się żaden label - jakby pusty program. Przyznam że to jest naprawdę dziwne...

0

Jesteś pewien że klasa forma, którą stworzyłeś w designerze nazywa się tak samo jak klasa samego Timera, którego kod dałeś powyżej? (ParentForm(?)) I sprawdź namespace'y.

0

Racja! Zmieniłem z Form na ParentForm i poszło.
Teraz kolejnym problemem jest to, że po kliknięciu START nic się nie dzieje (nic nie wyświetla).
Wklejam jeszcze raz kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class ParentForm : Form
    {
        private Timer timer;
        private TimeSpan timeSpan;
        private readonly TimeSpan oneSecond = new TimeSpan(0, 0, 1);
        public ParentForm()
        {
            InitializeComponent();
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(TimerTick);
        }

        private void TimerTick(object sender, EventArgs e)
        {
            timeSpan = timeSpan.Add(oneSecond);
            labelTime.Text = timeSpan.ToString();
        }

        private void ButtonStopclick_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;
        }


        private void ButtonStart_Click(object sender, EventArgs e)
        {
            timeSpan = new TimeSpan(0, 0, 0);
            timer.Enabled = false; ;
        }

        private void labelTime_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
0

Panowie, taka drobna uwaga... dodawanie jednej sekundy moze dawac przeklamania (w zaleznosci od obciazenia komputera). Lepiej by bylo porownywac date startu z data aktualna.
Jesli potrzebna jest pauza i liczenie czasu od dzialania tego timera od poczatku dzialania aplikacji, to wowcza nalezaloby:

  • miec zmienna TimeSpan totalTimeSpan ktora zlicza caly czas dzialania timera
  • miec zmienna DateTime - startTimera
  • przy wcisnieciu stop / totalTimeSpan = pauze DateTime.Now - startTimera + totalTimeSpan

W powyzszym kodzie na pewno nic nie bedzie sie dzialo bo masz pomieszane timer.Enabled w Start i Stop. Wkoncu Enabled = true powinno byc przy starcie a nie na odwrot ;)

0

Słuszna uwaga. Nie zwróciłem na to uwagi. Przy dokładnym mierzeniu czasu jest to bardzo ważne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1