Umíme to s Delphi, 33. díl – rutiny pro obsluhu systémového data a času

V dnešním dílu seriálu se podíváme, jak v Delphi pracovat se systémovým datem a časem. Až uvidíte, kolik procedur a funkcí v této souvislosti Delphi přináší, budete možná překvapeni. Na závěr dílu vytvoříme aplikaci, která umožní změnit systémové datum. Tato aplikace využije komponentu Calendar, kterou jsme popsali před týdnem.
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:-)

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,