Umíme to s Delphi, 32. díl – uživatel často zapomíná…

… a proto asi nebude od věci přinést mu nástroj, který zacelí přirozené mezery a nedokonalosti jeho paměti. V dnešním díle seriálu si povíme o jedné komponentě Delphi, která se přímo k takovému použití nabízí.
Kalendář „postaru“

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:

Klepněte pro větší 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):

Klepněte pro větší obrázek

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;

Klepněte pro větší obrázek

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.

Na závěr

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.
Váš názor Další článek: Kupte si ledničku, třeba i po Internetu

Témata článku: Software, Programování, Nepřeberné množství, Zavolání, Ukázkový příklad, Vzhled, Záporné číslo, Hifi komponenty, Speciální díl, Změna klávesnice, Hifi, Následující úsek, Delphi, Předchozí den, DEL, Díl, Čas


Určitě si přečtěte

Jak v prohlížeči vypnout oznámení zasílaná webovými stránkami

Jak v prohlížeči vypnout oznámení zasílaná webovými stránkami

** Obtěžují vás neustálé dotazy webů, zda chcete zobrazovat oznámení? ** Můžete je zakázat, a to jak kompletně, tak i pro jednotlivé stránky ** Připravili jsme návody pro Chrome, Firefox, Edge a Operu

Karel Kilián | 11

Karel Kilián
Jak na InternetTipyProhlížeče
Vodafonu se zhroutila kabelovka. Síť bývalého UPC má výpadky
Lukáš Václavík
VodafoneUPC
Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

** Kvalita GPS ve městech občas stojí za starou bačkoru ** Mohou za to odrazy signálu od okolních budov ** Google má jejich 3D model, a tak spolupracuje s výrobci GPS čipů

Jakub Čížek | 40

Jakub Čížek
NavigaceTechnologieGoogle
Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

** Testujeme Apple Macbook Air s procesorem M1 ** Zajímá nás nejen výkon, ale zejména kompatibilita aplikací ** Článek je průběžně doplňován na základě vašich dotazů

Jiří Kuruc | 205

Jiří Kuruc
Apple
Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

** Vybrali jsme nejlepší monitory na práci i pořádné hraní ** Nejlevnější monitor s kvalitním panelem nestojí ani tři tisíce ** Rozlišení 4K a větší obrazovka už není nedostupný luxus

David Polesný | 30

David Polesný
Monitory
AMD uvádí grafické karty Radeon RX 6800, 6800 XT a 6900 XT. Útočí přímo na modely od Nvidie

AMD uvádí grafické karty Radeon RX 6800, 6800 XT a 6900 XT. Útočí přímo na modely od Nvidie

** AMD představilo tři nové grafické karty ** Všechny s architekturou RDNA2, kterou používají i PS5 a Xbox Series ** Karty útočí přímo na GeForce RTX 3000

Karel Javůrek | 78

Karel Javůrek
Radeon RX 6000Grafické kartyAMD

Aktuální číslo časopisu Computer

Jak prodloužit výdrž notebooku

Velké testy: gamepady a inkoustové tiskárny

Důkladný test Sony Playstation 5