V této době se v seriálu zaměřujeme na „oddychová témata“ – zpravidla na popis komponent a jednodušších programovacích konceptů (uživatelská schránka). Je to částečně proto, že společně „sbíráme síly“ k tématům náročnějším, jako např. tvorba komponent, která se neodvratně blíží:-), ale především proto, že i tato témata a komponenty nepochybně naleznou své využití a je dobré přinejmenším vědět, že „něco takového v Delphi existuje“, případně „o tom“ mít povšechnou povědomost.
Dnes se tedy podíváme na komponentu, pomocí které můžeme v Delphi přidat do aplikace kalendář. Situace je taková, že v Delphi 5 jsou k dispozici dvě komponenty: Calendar (typu TCalendar) a MonthCalendar (typu TMonthCalendar). Druhá zmiňovaná ovšem není v Delphi verze 3, proto se postupně zaměříme na popis obou dvou, aby se někteří vývojáři necítili ochuzeni:-) V dnešním díle si popíšeme Calendar.
Kalendář „postaru“, tedy komponenta Calendar, se nachází na paletě Samples. Umístíte-li jej na formulář, uvidíte jakousi tabulku, která bude ovšem již obsahovat předvyplněná data – viz obrázek:
Podotkněme, že vzhledem k existenci této komponenty v paletě Samples není příliš smysluplné hledat její popis v nápovědě, neboť komponenty z palety Samples dokumentovány nejsou.
Jak je z obrázku patrné, kalendář se skládá ze sedmi sloupců označujících dny v týdnu, přičemž v záhlaví každého sloupce je označení dne v týdnu. Je vidět, že vzhled kalendáře není úplně „hifi“ (až porovnáme jeho design s komponentou MonthCalendar, bude rozdíl bít do očí ještě více).
Vlastnosti komponenty Calendar
Podíváme se jen na takové vlastnosti, které jsme ještě nespatřili a nebo které mají ke kalendáři, jeho vzhledu, chování a parametrům nějaký přímý, jasně pozorovatelný, avšak ne úplně snadno odhadnutelný vztah.
Vlastnost BorderStyle
Vlastnost BorderStyle určuje, jaký bude okolo kalendáře „rámeček“, přesněji řečeno, jak bude „zapuštěn“ do formuláře. Doporučuji vždy nechávat hodnotu bsSingle, protože nastavení bsNone působí opravdu celkem odporně a jeho použití je možné jen ve speciálních případech, kdy jisté modifikace vzhledu formuláře vytváříme úmyslně.
Vlastnost CalendarDate
V této vlastnosti je obsaženo aktuální (tedy kalendářem zobrazované) datum ve formátu TDateTime. Údaj z této vlastnosti je možné běžnými konverzními funkcemi vyexportovat jako řetězec a s řetězcem dále pracovat, viz následující příklad, po jehož zavolání bude v proměnné Retezec datum nastavené v kalendáři ve formátu např. 2. únor 2000:
Retezec := FormatDateTime(`d. mmmm yyyy`, Calendar.CalendarDate);
Poznámka: funkce FormatDateTime má za úkol zkonvertovat hodnotu typu TDateTime (což je třída určená v Delphi právě pro uchovávání údajů o datumu a čase je to také typ vlastnosti Calendar.CalendarDate) na řetězec podle formátu zadaného prvním parametrem). Podrobnosti o této funkci se můžete dočíst v příštím dílu seriálu za týden.
Vlastnost Color
V žádném případě nechci nikoho podceňovat, že nezná význam vlastnosti Color, a tak jen podotknu, že v případě kalendáře se nastavuje barva pozadí (tabulky) – viz obrázek s červeným kalendářem (Color = clRed):
Vlastnost Day
Ve vlastnosti Day se nastavuje aktuální den v měsíci, který má kalendář zobrazit (přesněji řečeno zvýraznit modrým pozadím). Podle hodnoty nastavené ve vlastnosti Month (viz dále) je možné zadat hodnotu Day vždy jen takovou, aby aktuální měsíc takový den měl (tedy v září nezadáte hodnotu 31 a obecně málokdy se vám povede vložit třeba nulu nebo záporné číslo :-)). Object Inspector hlídá hodnotu této vlastnosti a nepovolí zadat neplatný údaj. Pokusíte-li se zadat neplatný den za běhu programu (přiřazením této vlastnosti), přiřazení se zkrátka a dobře neprovede. Žádná výjimka nebude generována, program kupodivu ani nespadne, ale vy se na druhou stranu vůbec nedozvíte, že se přiřazení nepodařilo. Ukázkou budiž následující úsek kódu, který (zkusíte-li jej zapsat a přeložit) je toho jasnou ukázkou, neboť vždy vypíše hodnotu původní (viz zdrojový kód a obrázek):
procedure TfrmHlavni.btnTestClick(Sender: TObject);
begin
Calendar.Day := 32;
ShowMessage(`Hodnota Calendar.Day = ` +
IntToStr(Calendar.Day));
end;
Poznámka: zajímá-li vás, proč se o neprovedení přiřazení vůbec nedozvíte, pak vězte, že je to z důvodu zdrojového kódu TCalendar. Tato komponenta je přece jen pouze příklad (nachází se ostatně v paletě Samples):
if Value > 0 then begin
...
if (Value <= DaysThisMonth)
...
Vlastnost Font
Vlastností Font lze změnit aktuální písmo, kterým se vypisují dny v kalendáři. Je třeba dávat pozor, protože kalendář se samozřejmě při změně (velikosti) písma automaticky neroztáhne, takže se do něj údaje nemusí vejít.
Vlastnost GridLineWidth
Hodnota této vlastnosti udává, jak široké budou čáry v tabulce (tedy čáry oddělující jednotlivá políčka v kalendáři). Hodnota se udává v pixelech.
Vlastnost Month
Analogická vlastnost k vlastnosti Day. Nastavuje se číslo zobrazeného měsíce a opět je možné nastavit jen platné údaje (tedy čísla od 1 do 12). Pokud je např. v hodnotě Day číslo 31 a pokusíte-li se nastavit hodnotu Month třeba na 11, nejen že vám to Object Inspector nepovolí, ale navíc obdržíte chybovou hlášku upozorňující na špatný argument. Je to proto, že při změně měsíce se hodnota dne nekontroluje, a proto při nastavování nové hodnoty funkce generuje výjimku EConvertError.
Vlastnost ReadOnly
Význam vlastnosti ReadOnly je u kalendáře trochu nestandardní, proto se u ní také krátce zastavíme. Pokud je její hodnota nastavena na False (default), je možné s kalendářem normálně manipulovat, včetně výběru buňky (dne) kurzorem myši nebo klávesnicí. Pokud ovšem nastavíte ReadOnly na True, bude buňka, která je právě vybraná, „uzamčena“ – tedy nabude možné klepnutím myši (nebo klávesnicí) vybrat jinou buňku.
Vlastnost StartOfWeek
V této vlastnosti se nastaví pořadové číslo dne, který je v dané zeměpisné šířce považován za začátek týdne. Ponechme nyní stranou filozofickou diskusi o důvodech odlišných začátků týdne v různých zemích a raději si řekněme, že číslování začíná od nuly (tj. lze zadat čísla 0 až 6). Nastavením nuly prohlašujeme za start týdne neděli, nastavením jedničky pondělí, apod. Změna nastavení hodnoty vlastnosti StartOfWeek se bezprostředně promítne do uspořádání kalendáře, tedy hned v návrhové fázi se kalendář změní a nastavený den se zobrazí v prvním sloupci.
Vlastnost UseCurrentDate
Logická vlastnost, její hodnota True způsobí nastavení kalendáře na aktuální (systémové) datum.
Vlastnost Year
Tuto vlastnost jste asi očekávali, je to třetí „do party“ vlastností nastavujících datum. Korektní hodnotou této vlastnosti je jakýkoliv rok mezi roky 1 a 9999, protože přesně v tomto rozmezí správně funguje funkce EncodeDate, která je komponentou Calendar používána. . Pokud zadáte záporný rok (případně rok 0), nastavení se neprovede a aktuální rok zůstane v kalendáři nastaven, aniž se to dozvíte (opět je důvodem implementace kalendáře). Pokud zadáte rok 10000 a vyšší, bude v návrhové fázi „řvát“ chybový dialog a v run-time bude opět vyvolána výjimka EConvertError. Tohle jsou ovšem možná poněkud „akademické“ diskuse, neboť většina běžných vývojářů si snad s rozmezím let 1 až 9999 ještě nějakou dobu vystačí:-)
Metody komponenty Calendar
Tím jsme vyčerpali všechny důležité vlastnosti kalendáře (je zřejmé, že jich není zase až tak moc) a přejdeme na metody. Zde bude popis ještě stručnější, neboť kalendář se honosí pouze opravdu malým množstvím pěti metod. V tabulce se podíváme na čtyři zajímavé:
Metoda |
Význam |
NextMonth |
Nastaví další měsíc, tedy kalendář bude zobrazovat další měsíc (vzhledem k měsíci, který zobrazoval předtím). Ostatní údaje (den, rok) se nemění. |
NextYear |
Nastaví další rok, tedy kalendář bude zobrazovat další rok (vzhledem k roku, který zobrazoval předtím). Ostatní údaje (den, měsíc) se nemění. |
PrevMonth |
Nastaví předchozí měsíc, tedy kalendář bude zobrazovat předchozí měsíc (vzhledem k měsíci, který zobrazoval předtím). Ostatní údaje (den, rok) se nemění. |
PrevYear |
Nastaví předchozí rok, tedy kalendář bude zobrazovat předchozí rok (vzhledem k roku , který zobrazoval předtím). Ostatní údaje (den, měsíc) se nemění. |
Tolik tedy k metodám. Události nemá tato komponenta žádné (speciální), proto se jimi nebudeme zabývat.
Ukázková aplikace na použití komponenty Calendar
Asi jste si už zvykli, že za popisem každé komponenty společně vytvoříme ukázkovou aplikaci, která demonstruje teoreticky probraná fakta. Dnes učiníme výjimku, ale jen proto, abychom si nejprve popsali procedury a funkce Delphi, které umožňují pracovat se systémovým datumem a časem. To nastane v příštím dílu a v jeho rámci naleznete také ukázkovou aplikaci.
Dnes jsme si popsali komponentu Calendar. Znovu zdůrazňuji, že se nachází v paletě Samples a že má tedy býti spíše příkladem dalších možností Delphi. Nicméně z předchozího textu je snad dostatečně zřejmé, že může být použita i k vážné práci. Jedním z důvodů je, že se nachází ve všech verzích Delphi. Vzhledově ale není úplně nejkrásnější, a proto si možná raději počkejte na popis dalšího kalendáře – komponenty MonthCalendar. Abychom ale stále nepopisovali jen kalendáře, za týden se podíváme na nepřeberné množství procedur a funkcí, které Delphi přináší na podporu práce se systémovým datumem a časem.