Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - time

Zdravím
Proč to nefunguje

begin
   time1 := time;
   time2 := StrToTime('09:45:00');
   Label1.Caption:= TimeToStr(time1);
   Label2.Caption:= TimeToStr(time2);
   If time1 = time2 Then  ShowMessage('shoda')
end;
Předmět Autor Datum
A co přesně nefunguje?
Wikan 25.11.2016 10:06
Wikan
If time1 = time2 Then ShowMessage('shoda')
m12 25.11.2016 10:12
m12
No tak minimálně tam na konci chybí středník.
Wikan 25.11.2016 10:13
Wikan
To byle moje chyba při vkladaní tady :-D begin time1 := time; time2 := StrToTime('10:16:00'); Label…
m12 25.11.2016 10:18
m12
a víš jistě že time1 = time2?
sso 25.11.2016 10:21
sso
Tak napiš, co přesně znamená "nefunguje".
Wikan 25.11.2016 10:30
Wikan
Tak je 10:34:00 time2 := StrToTime('10:40:00'); V 10:40:00 by mněl vyskočit ShowMessage('shoda')
m12 25.11.2016 10:36
m12
pouze za předpokladu, že to přiřazení time1 = time se provede v 10:40:00.000
sso 25.11.2016 10:40
sso
Čas obsahuje i milisekundy. Trefíš se přesně do milisekundy?
Jan Fiala 25.11.2016 10:46
Jan Fiala
Tak proč mi delphi neukaže celý čas i s těma milisekundami ve watches? timer.png Moc v tom neumí. M…
m12 25.11.2016 10:55
m12
Nechces radeji napsat, co chces dosahnout? Pokud to ma byt budik, staci, kdyz budes testovat zda Zad…
Jan Fiala 25.11.2016 11:11
Jan Fiala
Ono to poběží na lazarusu - linux - raspberý Pokud se shoduje, zapní pin. Jinak jako alternativni…
m12 25.11.2016 12:01
m12
Nejsem úplně kovaný v Delphi. Zkusil bych, teda něco takového: begin time1 := time; time2 := StrTo…
Flash_Gordon 25.11.2016 12:31
Flash_Gordon
Pleteš :-D var time1, time2: TTime; Label2.Caption:= TimeToStr(time2); Už tady jde vidět že převad…
m12 25.11.2016 12:52
m12
Ha. begin time1 := time; time2 := StrToTime('09:45:00'); Label1.Caption:= TimeToStr(time1); Label2.…
Flash_Gordon 25.11.2016 13:07
Flash_Gordon
If IntToStr(CompareTime(time1, time2)) = 0 Then ShowMessage('shoda') Tohle je divné. Jednak porovn…
Jan Fiala 25.11.2016 14:20
Jan Fiala
Jj, píšu to z hlavy. Buď šoupne tu nulu, jako řetězec nebo nepoužije to InToStr.
Flash_Gordon 25.11.2016 14:23
Flash_Gordon
To nic nemeni na tom, ze cas je v DateTime ulozen cely v desetinne casti a ty jej oriznes. Takze ti…
Jan Fiala 25.11.2016 14:31
Jan Fiala
Ono by mnělo stačit nastavít timer na 1000, což je jedna vteřina, ne? A jak zajistíš, aby timer zač…
Jan Fiala 25.11.2016 13:18
Jan Fiala
Jednodussi cesta je pouziti funkce: RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: W… poslední
Jan Fiala 25.11.2016 14:36
Jan Fiala
Proč by musel timer začít přesně s nulovymi ms 1000 milisekund na vteřiny je 1 Když nastavím timer…
m12 25.11.2016 13:39
m12
Když nastavím timer na 1000, bude se mi spouštět každou vteřinu. To je omyl. Bude se spouštět přibl…
Wikan 25.11.2016 13:45
Wikan
I kdyby se spouštěl přesně každých 1000ms, hrozně by mě zajímalo, jak by jej poprvé spustil přesně v…
Jan Fiala 25.11.2016 14:17
Jan Fiala

Nechces radeji napsat, co chces dosahnout?
Pokud to ma byt budik, staci, kdyz budes testovat zda Zadany_cas >= Time();
Po kladnem otestovani pak nastavis promennou, ze udalost probehla.
Jinak jako alternativni postup samozrejme muzes oriznout ms z aktuálního času pred testováním, ale pak se časy budou shodovat celou sekundu a ty zase musíš řešit to, že tebou požadovaná událost již proběhla.
Nebo můžeš testovat, zda aktuální čas je mezi zadaným časem a zadaným časem + 999ms

A že ti to ve Watch neukáže? Jaký formát sis při zobrazení dal? Pokud řetězec, tak to převede pomocí formátu. Zkus tam dát třeba desetinné číslo

Ono to poběží na lazarusu - linux - raspberý

Pokud se shoduje, zapní pin.

Jinak jako alternativni postup samozrejme muzes oriznout ms z aktuálního času pred testováním, ale pak se časy budou shodovat celou sekundu a ty zase musíš řešit to, že tebou požadovaná událost již proběhla.

Toto bych rad.
Jak to ořiznout?
Ono by mnělo stačit nastavít timer na 1000, což je jedna vteřina, ne?

Nejsem úplně kovaný v Delphi.

Zkusil bych, teda něco takového:

begin
   time1 := time;
   time2 := StrToTime('09:45:00');
   Label1.Caption:= TimeToStr(time1);
   Label2.Caption:= TimeToStr(time2);
   If Label1.Caption = Label2.Caption Then  ShowMessage('shoda')
end;

Protože mám trochu pocit, že interně je time1 instance objektu time,
zatímco time2 je string. Ale možná se pletu.

Ono by mnělo stačit nastavít timer na 1000, což je jedna vteřina, ne?

A jak zajistíš, aby timer začal přesně s nulovymi ms?
Proč teda jednoduše neotestuješ, jestli není aktuální čas v rozsahu 10:16:00 - 10:16:00.999 ?

begin
   time1 := time;
   time2 := StrToTime('10:16:00');
   time3 := StrToTime('10:16:00.999');
   Label1.Caption:= TimeToStr(time1);
   Label2.Caption:= TimeToStr(time2);
   If (time1 => time2) and (time1 <= time3) Then  ShowMessage('shoda');
end;

Na oriznuti muzes pouzit napr. funkce DecodeTime / EncodeTime

Jednodussi cesta je pouziti funkce:
RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word)
Pomoci ni vynulujes ms v aktualnim case a muzes porovnavat.

begin
   time1 := RecodeMilliSecond(Time, 0);
   time2 := StrToTime('10:16:00');
   Label1.Caption:= TimeToStr(time1);
   Label2.Caption:= TimeToStr(time2);
   If time1 => time2 Then  ShowMessage('shoda');
end;

Proč by musel timer začít přesně s nulovymi ms
1000 milisekund na vteřiny je 1

Když nastavím timer na 1000, bude se mi spouštět každou vteřinu.
Když se spustí třeba v 10:40:03.853 ořiznutý bude na 10:40:03
Pak se spustí v 10:40:04.853 a ořiznutý bude na 10:40:04

Jak to ořiznu, nějak se mi to stou funkcí format nedaří?

Zpět do poradny Odpovědět na původní otázku Nahoru