Umíme to s Delphi, 33. díl – rutiny pro obsluhu systémového data a času
- Kapitoly článku:
-
- Práce se systémovým časem v Delphi
- Ukázková aplikace využívající komponentu Calendar
- Poznámky ke zdrojovému kódu
Jak se již také stává tradicí, aplikace si zaslouží několik poznámek, tak
pojďme na ně:
- Aplikace snad funguje vcelku intuitivně, tedy uživatel se může libovolně
posouvat po kalendáři, vybírat zobrazovaný měsíc a rok, klepáním na tlačítka
<< a >> se posouvat po měsících zpět, resp. vpřed, klepnutím na
tlačítko Dnes se vrátit do dnešního datumu. Datum zobrazované kalendářem se
stále vypisuje v nápisu.
- Po klepnutí na Nastavit se jako systémové datum nastaví datum aktuálně
zobrazované kalendářem.
- Ke zjištění systémového času byla použita funkce Windows API
GetSystemTime. Bylo to učiněno čistě z ilustrativních důvodů, neboť v Delphi
existuje analogická funkce Now, která vrací rovnou údaj TDateTime. Ale pro
demonstraci aplikace nejprve zjistí funkcí GetSystemTime aktuální čas (ve
formátu TSystemTime), pak jej funkcí SystemTimeToDateTime zkonvertuje na
reprezentaci TDateTime, nahradí složku datumu funkcí ReplaceDate a pomocí
procedury DateTimeToSystemTime zkonvertuje opět na reprezentaci, které rozumí
Windows API. Procedura SetSystemTime pak jen nastaví nové systémové datum.
- Z důvodu nutnosti opakovaně provádět tytéž operace (konkrétně:
synchronizace dne zobrazovaného kalendářem s ovládacími prvky a s nápisem na
formuláři, změna titulku) byla vytvořena soukromá procedura
NastavPodleKalendare. Tato metoda je pak opakovaně volána z několika dalších
metod.
- V obsluze události Calendar.OnChange zavoláme proceduru
NastavPodleKalendare. Tím máme zajištěno, že ať se již hodnota kalendáře změní
jakýmkoliv způsobem (vybráním, klepnutím na tlačítko, volbou roku…), budou
všechny ovládací prvky včetně kalendáře aktualizovány (pouze po klepnutí na
Dnes musíme zajistit vyvolání události OnChange ručně).
- Pole PoleMesicu je vytvořeno pouze a jen proto, že položky do
rozbalovacího seznamu načítáme až za běhu programu (v obsluze
frmHlavni.OnChange) a díky tomuto poli můžeme použít jeden for-cyklus místo
dvanácti řádek typu cbMesic.Items.Add(‚Nazev‘);
- Metoda btnDnesClick (tedy evgent handler události OnClick tlačítka
btnDnes) si také zaslouží komentář. Nejprve nastavíme hodnotu vlastnosti
UseCurrentDate na True. Tím zajistíme, že kalendář zobrazí dnešní datum. Pak
na základě tohoto datumu provedeme nezbytné modifikace dalších ovládacích
prvků – zajistí metoda NastavPodleKalendare. Pak ovšem musíme nastavit
UseCurrentDate opět na false, přičemž kalendář samozřejmě dále zobrazuje
dnešní datum. Musíme to učinit proto, že pokud by hodnota zůstala na True (což
se stane např. při klepnutí na Další a Předchozí), aktuální datum by se po
klepnutí na Dnes nenastavilo. Dalším řešením by bylo nastavit nejdřív False a
pak hned za tím True – fungovalo by to stoprocentně, ale nebylo by to úplně
Hifi řešení:-). Na konci obsluhy události OnCreate hlavního formuláře tedy
zavoláme metodu btnDnesClick, aby vše fungovalo, jak má.
- Funkce SetSystemTime vrací logickou hodnotu, která říká, zda se nastavení
času korektně provedlo. V našem programu tuto hodnotu netestujeme, nicméně v
„opravdové“ aplikaci by to chtělo příslušný test provést – nastavení se nemusí
podařit např. z důvodu nedostatečných přístupových práv, apod.
Tolik tedy pro dnešek ke kalendáři a k funkcím pro obsluhu datumu a času. Za
týden se podíváme na slíbenou druhou (a mnohem krásnější) možnost, jak pracovat
s kalendářem. A samozřejmě opět také něco navíc:-)