Autor Téma: zobrazeni stavu Timer  (Přečteno 289 krát)

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi 7
zobrazeni stavu Timer
« kdy: 07-02-2018, 11:46:58 »
Hoj, mam na formu Timer a potreboval bych aby se mi zobrazil do Label a nebo Edit stav Timeru..

Popisu...
Mam stav Timeru2 treba 60000 milisekund a potreboval bych aby se mi pomoci Label zobrazilo kolik jeste zbyva milisekund do vykonani prikazu Timer2.

Reload Label mam upraveny pomoci Timer1 kde mam nastaveno 1000 a jen na obnoveni Label

Lze to nejak udelat ???

Ted zkousim
Kód: Delphi [Vybrat]
  1. procedure TForm1.Timer1Timer(Sender: TObject);
  2. var
  3.   hodnota : Integer;
  4.   aktualne : Integer;
  5.   vysledek : Integer;
  6. begin
  7.      Timer2.Tag := Timer2.Tag + Timer2.Interval;
  8.      Edit3.Text := InttoStr(Timer2.Tag);
  9.      hodnota := StrtoInt(Edit1.Text);
  10.      aktualne := StrtoInt(Edit3.Text);
  11.      vysledek := hodnota - aktualne;
  12.     Edit4.Text := vysledek;
  13. end;

ale to mi porad haze chyby

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 610
  • Karma: 27
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:zobrazeni stavu Timer
« Odpověď #1 kdy: 07-02-2018, 12:08:44 »
Mam stav Timeru2 treba 60000 milisekund a potreboval bych aby se mi pomoci Label zobrazilo kolik jeste zbyva milisekund do vykonani prikazu Timer2.

Z timeru informaci kdy byl nastartovan nezjistis. Takovou informaci si musis nekde ulozit. No a v tom pripade muzes ten pomalu tikajici timer smele zahodit. Trebas:

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     Timer1: TTimer;
  4.     Label1: TLabel;
  5.     Button1: TButton;
  6.     procedure Timer1Timer(Sender: TObject);
  7.     procedure Button1Click(Sender: TObject);
  8.   private
  9.     FInitTick: DWORD;
  10.     FDestTime: DWORD;
  11.   end;
  12.  
  13. implementation
  14.  
  15. procedure TForm1.Button1Click(Sender: TObject);
  16. begin
  17.   FDestTime := 10000; // nastavime pocet milisekund do vypnuti casovace
  18.   FInitTick := GetTickCount; // ulozime si "casovou znacku" od startu casovace
  19.  
  20.   Timer1.Enabled := True; // nastartujeme casovac
  21.   Label1.Caption := Format('Remains: %d ms', [FDestTime]); // zobrazime vychozi text
  22. end;
  23.  
  24. procedure TForm1.Timer1Timer(Sender: TObject);
  25. var
  26.   Elapsed: DWORD;
  27. begin
  28.   Elapsed := GetTickCount - FInitTick; // spocteme kolik uplynulo milisekund od startu casovace
  29.  
  30.   if Elapsed >= FDestTime then // pokud je pocet milisekund vetsi nebo roven poctu milisekund pro vypnuti casovace, pak...
  31.   begin
  32.     Timer1.Enabled := False; // vypneme casovac
  33.     Label1.Caption := 'Finished!'; // a zobrazime text o konci
  34.   end
  35.   else
  36.     Label1.Caption := Format('Remains: %d ms', [FDestTime - Elapsed]); // zobrazime rozdil mezi casem uplynulym a casem cilovym
  37. end;
« Poslední změna: 07-02-2018, 12:37:05 od Delfin »
I'm a soldier, so don't panic!

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:zobrazeni stavu Timer
« Odpověď #2 kdy: 07-02-2018, 12:29:31 »
Mel jsem prave namysli to, ze v editu mam nastaveno tech 60000, to je hodnota intervalu pro timer, jakmile se timer pusti, tak v labelu se nastavi stejna hodnota jako v editu a zacne se odpocitavat a bude se mi zobrazovat to odpocitavani. Neco jako minutka...

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 610
  • Karma: 27
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:zobrazeni stavu Timer
« Odpověď #3 kdy: 07-02-2018, 12:42:53 »
Mel jsem prave namysli to, ze v editu mam nastaveno tech 60000, to je hodnota intervalu pro timer, jakmile se timer pusti, tak v labelu se nastavi stejna hodnota jako v editu a zacne se odpocitavat a bude se mi zobrazovat to odpocitavani. Neco jako minutka...

No vzdyt jo :) Potrebne informace Ti ale timer nedoda. Ten jen tika v danych intervalech. Nedozvis se z nej kdy byl nastartovan ani kolik casu do dalsiho tiku zbyva. Timer neni k mereni casu, ten jen tika. Predstav si ho treba jako metronom.

K mereni casu takovym metronomem (60 BPM, 1 uder za sekundu) muzes pocitat od jeho startu pocet uderu, nebo se jednoduse pri startu "podivat na hodinky" a zapamatovat si kolik v dany okamzik bylo. V kterykoli nasledujici okamzik pak budes vedet bud pocet uderu nebo kolik bylo a je prave ted "hodin".
« Poslední změna: 07-02-2018, 13:00:11 od Delfin »
I'm a soldier, so don't panic!

Offline Ján Masaryk

  • Mladík
  • **
  • Příspěvků: 66
  • Karma: 5
    • Verze Delphi: 2010
Re:zobrazeni stavu Timer
« Odpověď #4 kdy: 13-02-2018, 08:08:45 »
Ja to mám vyriešené takto:
Kód: Delphi [Vybrat]
  1. procedure TForm_main.Timer1Timer(Sender: TObject);
  2. var
  3.    nNieco: Integer;
  4. begin
  5.    Timer1.Interval := 1000;
  6.    if nCounter1 > 20 then
  7.    begin
  8.       if nNieco = 1 then
  9.       begin
  10.          Timer1.Enabled := false;
  11.  
  12.          ...
  13.  
  14.          Timer1.Enabled := true;
  15.         nCounter1 := 0;
  16.       end
  17.       else
  18.       begin
  19.          nCounter1 := 0;
  20.       end;
  21.    end;
  22.         Label1.Caption := IntToStr(20 - nCounter1);
  23.         Inc(nCounter1);
  24. end;
  25.  
  26.  
  27.  
« Poslední změna: 13-02-2018, 08:11:52 od Ján Masaryk »

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 610
  • Karma: 27
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:zobrazeni stavu Timer
« Odpověď #5 kdy: 13-02-2018, 17:09:52 »
Ja to mám vyriešené takto:
Kód: Delphi [Vybrat]
  1. procedure TForm_main.Timer1Timer(Sender: TObject);
  2. var
  3.    nNieco: Integer;
  4. begin
  5.    Timer1.Interval := 1000;
  6.    if nCounter1 > 20 then
  7.    begin
  8.       if nNieco = 1 then
  9.       begin
  10.          Timer1.Enabled := false;
  11.  
  12.          ...
  13.  
  14.          Timer1.Enabled := true;
  15.         nCounter1 := 0;
  16.       end
  17.       else
  18.       begin
  19.          nCounter1 := 0;
  20.       end;
  21.    end;
  22.         Label1.Caption := IntToStr(20 - nCounter1);
  23.         Inc(nCounter1);
  24. end;
  25.  

Pokud je cilem 20 sekund, mel bys se startem casovace manualne zavolat metodu Timer1Timer (se startem by se totiz melo zobrazit 20 ihned, ne az po 1 sekunde). nNieco je dost zmateny nazev promenne ktere chybi inicializace vychozi hodnoty a ktera s hodnotou 1 dela po uplynuti 20 uderu rozhoduje neco prapodivneho. A opakovane nastavovani intervalu casovace je zbytecne plytvani prostredky.

Na zaklade mnou psaneho predchoziho prikladu vyuzivajiciho "pohledu na hodinky" by se pro pripad pocitani uderu dalo napsat neco takoveho (Interval casovace se predpoklada 1000):

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     Timer1: TTimer;
  4.     Label1: TLabel;
  5.     Button1: TButton;
  6.     procedure Timer1Timer(Sender: TObject);
  7.     procedure Button1Click(Sender: TObject);
  8.   private
  9.     FCurrCount: Integer;
  10.     FDestCount: Integer;
  11.   end;
  12.  
  13. implementation
  14.  
  15. procedure TForm1.Button1Click(Sender: TObject);
  16. begin
  17.   FCurrCount := 0; // vynulujeme pocitadlo
  18.   FDestCount := 10; // nastavime cilovy pocet uderu
  19.   Timer1.Enabled := True; // nastartujeme casovac
  20.   Label1.Caption := Format('Remains: %d s', [FDestCount]); // zobrazime vychozi text
  21. end;
  22.  
  23. procedure TForm1.Timer1Timer(Sender: TObject);
  24. begin
  25.   FCurrCount := FCurrCount + 1; // inkrementujeme hodnotu pocitadla
  26.  
  27.   if FCurrCount >= FDestCount then // pokud je pocet uderu vetsi nebo roven poctu pro vypnuti casovace, pak...
  28.   begin
  29.     Timer1.Enabled := False; // vypneme casovac
  30.     Label1.Caption := 'Finished!'; // a zobrazime text o konci
  31.   end
  32.   else
  33.     Label1.Caption := Format('Remains: %d s', [FDestCount - FCurrCount]); // zobrazime rozdil mezi cilovym a aktualnim poctem uderu
  34. end;
« Poslední změna: 13-02-2018, 17:13:47 od Delfin »
I'm a soldier, so don't panic!

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:zobrazeni stavu Timer
« Odpověď #6 kdy: 14-02-2018, 08:23:19 »
Tohle je presne ono, diky moc

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 610
  • Karma: 27
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:zobrazeni stavu Timer
« Odpověď #7 kdy: 14-02-2018, 09:02:46 »
Ony obe ukazky delaji ve vysledku to same. Jen ta s "pohledem na hodinky" je presnejsi (kvuli nizke priorite zpravy WM_TIMER muze timer tikat i pomerne dost nepresne).
I'm a soldier, so don't panic!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: