
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;
Tak je 10:34:00
time2 := StrToTime('10:40:00');
V 10:40:00 by mněl vyskočit ShowMessage('shoda')
pouze za předpokladu, že to přiřazení time1 = time se provede v 10:40:00.000
Čas obsahuje i milisekundy. Trefíš se přesně do milisekundy?
Tak proč mi delphi neukaže celý čas i s těma milisekundami ve watches?
timer.png
Moc v tom neumí.
Mněli jsme to na střední před 15 roky.
time1 := time;
Jak dostanu do toho time1 ten čas bez těch milisekund?
Pamatují že na to byl přikaz format
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.
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:
Protože mám trochu pocit, že interně je time1 instance objektu time,
zatímco time2 je string. Ale možná se pletu.
Pleteš
Label2.Caption:= TimeToStr(time2);
Už tady jde vidět že převadím Time2 na string TimeToStr
Ha.
Tohle je divné. Jednak porovnáváš řetězec s číslem (zřejmě jsi tam chtěl jen převod na integer) a druhak je čas v typu Datetime uložen celý v desetinné části, takže oříznutím by to bylo splněno vždy
Jj, píšu to z hlavy.
Buď šoupne tu nulu, jako řetězec nebo nepoužije to InToStr.
To nic nemeni na tom, ze cas je v DateTime ulozen cely v desetinne casti a ty jej oriznes. Takze ti to bude vracet datum a to porovnavat nechce
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 ?
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.
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ří?
To je omyl. Bude se spouštět přibližně každou vteřinu. Reálně tedy o něco později.
A ořezávat to přece nemusíš, už ti tu psali, jak to kontrolovat.
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 čase nulových ms, aby zajistil při uplynutí timeru byly ms na nule