Odpověď

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.
Jméno:
E-mail:
Předmět:
Ikona zprávy:

Ověření:
Datový typ v Delphi, který má True a False:

Zkratky: stiskněte shift+alt+s pro odeslání nebo shift+alt+p pro prohlédnutí


Shrnutí tématu

Poslal: Delfin
« 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).
Poslal: Kony
« kdy: 14-02-2018, 08:23:19 »

Tohle je presne ono, diky moc
Poslal: Delfin
« 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;
Poslal: Ján Masaryk
« 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.  
Poslal: Delfin
« 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".
Poslal: Kony
« 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...
Poslal: Delfin
« 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;
Poslal: Kony
« 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