Umíme to s Delphi, 48. díl – procházka po zajímavých vlastnostech

Minulý týden jsme dokončili takřka nekonečnou ságu oslovující všechny, kteří touží vytvářet své vlastní komponenty. Dnes se nebudeme pouštět do podobně rozsáhlé problematiky, ale prozradíme si důležité detaily, ke kterým jsme se dosud nedostali. Především důkladně analyzujeme řadu maličkostí spojených s komponentami.
Protože téma, které jsme dokončili před týdnem, bylo poněkud náročnější a relativně rozsáhlé (a samozřejmě jsme z něj ještě nevyčerpali všechny informace, které by přicházely v úvahu), máme dnes nárok trochu si oddychnout. Podíváme se tedy na několik záležitostí, jejichž pochopení nevyžaduje pekelné soustředění ani dlouhé bádání. V předchozích dílech seriálu jsme popisovali mnoho důležitých komponent společně s jejich vlastnostmi a událostmi. Přes veškerou snahu o úplnost jsme samozřejmě nemohli zmínit všechno, co je důležité, nicméně byla by nepochybně škoda se o tom nezmínit. Dnes se tedy pokusíme tento nedostatek napravit.

Víte vše o poloze komponenty?
Na takto formulovanou otázku nepochybně většina z vás odpoví kladně, případně vás ještě napadne cosi o nesmyslnosti této otázky. Co dodat k poloze komponenty? Uvidíte, že pozici komponenty je možné rozebrat velmi podrobně. Začneme shrnutím toho, co už asi všichni víme, ale možná se dostaneme i k několika novým poznatkům:) Pozice komponenty na formuláři je jednoznačně dána vlastnostmi Left a Top, přičemž souřadnice (tedy hodnoty těchto vlastností) se nevztahují k celé obrazovce, ale ke klientské oblasti komponenty předka. Znamená to, že umístíte-li na formulář tlačítko, budou se souřadnice tlačítka vztahovat k levému hornímu rohu formuláře. Dáte-li na formulář nejprve panel a na něj tlačítko, vztažným bodem pro tlačítko bude levý horní roh panelu.

Samozřejmě, na tom není nic zvláštního, stejně jako na tom, že velikost komponenty je určována vlastnostmi Height a Width (výška, šířka). Stejně jako v případě předchozích vlastností je velikost udávána v pixelech (obrazovkových bodech).

Asi také víte, že u některých komponent je možné nastavit, jakým způsobem budou „přichyceny“ k formuláři nebo panelu. Tato vlastnost se jmenuje Align. Její možné hodnoty jsou:

  • alBottom – komponenta bude „přichycena“ k dolnímu okraji;
  • alTop – komponenta bude „přichycena“ k hornímu okraji;
  • alLeft – komponenta bude „přichycena“ k levému okraji;
  • alRight – komponenta bude „přichycena“ k pravému okraji;
  • alNone – komponenta nebude „přichycena“ nikde a její pozici je možné ručně nastavit.
  • alClient – komponenta se bude „rozprostírat“ v celé klientské oblasti.
Pojďme se ovšem podívat na vlastnost Align blíže. Nastavení hodnoty této vlastnosti totiž způsobí, že komponentu nebude možné „oddělit“ od zvoleného okraje. Na obrázku vidíte formulář, na kterém je umístěna komponenta Memo s hodnotou vlastnosti Align = alLeft. Pokud budete měnit velikost formuláře, bude se měnit i velikost komponenty Memo, neboť ta bude vždy podél celého levého okraje formuláře.

Poznámka pro uživatele – hnidopichy:)

Komponenta Memo nemusí vždy nutně zabírat celý levý okraj formuláře, platí to jen v případě, že na formuláři nebudou ještě další komponenty s Align = alTop či alBottom. Pak by komponenta Memo nezabírala celý levý okraj formuláře (typickou ukázkou je přítomnost stavového řádku). Vlastnost Align funguje tak, že nejdříve zarovná komponentu, která má hodnotu Align = alTop, pak komponentu s Align = alBottom, následně připojí komponentu s Align = alLeft a pak Align = alRight a do zbylého místa na formuláři roztáhne komponentu s Align = alClient.

Co si ale počít v případě, že potřebujete mít komponentu umístěnou „kousek“ od levého okraje? Když to učiníte bez jakýchkoliv explicitních nastavení (necháte vlastnost Align nastavenou na alNone), bude vše vypadat pěkně, ale jen do okamžiku, kdy se pokusíte formulář zvětšit (viz následující obrázek). Komponenta si totiž zachová svou velikost a dialog (okno aplikace) bude tedy prakticky nepoužitelné v jiné než standardní velikosti. Totéž platí o zmenšování formuláře – komponenta Memo se nezmenší a její obsah bude čitelný jen za použití posuvných lišt.

Co tedy dělat v případě, že potřebujete, aby komponenta byla trochu vzdálena od všech okrajů, ale zároveň měnila svou velikost podle velikosti formuláře? Řešením je použití vlastnosti Anchors. Tato vlastnost udává, jakým způsobem je komponenta „ukotvena“ ke svému předkovi (standardně tedy k formuláři). Pomocí této vlastnosti můžete nastavit, kterého okraje (příp. kterých okrajů) se má komponenta „držet“. Při změně velikosti formuláře tedy bude komponenta měnit také svou velikost, ale stále bude zachovávat zadanou vzdálenost k okraji. Lépe snad vše osvětlí následující dva obrázky.

Pojďme si tedy říct, jakých hodnot může nabývat vlastnost Anchors (v podstatě jsou všechny použity v příkladu na obrázku):

  • akTop – komponenta je ukotvena k hornímu okraji předka se zachováním definované vzdálenosti komponenty od horního okraje předka;
  • akLeft – komponenta je ukotvena k levému okraji předka se zachováním definované vzdálenosti komponenty od levého okraje předka;
  • akRight – komponenta je ukotvena k pravému okraji předka se zachováním definované vzdálenosti komponenty od pravého okraje předka;
  • akBottom – komponenta je ukotvena k spodnímu okraji předka se zachováním definované vzdálenosti komponenty od spodního okraje předka.
Poslední vlastností, na kterou se podíváme v rámci podrobného rozboru velikosti a pozice komponenty, je vlastnost Constraits. Tato vlastnost má 4 „podvlastnosti“ a s jejich pomocí lze stanovit minimální a maximální rozměry komponenty. Můžete např. vyjádřit touhu, aby minimální rozměry formuláře byly 100x100 bodů a maximální rozměry 300x300 bodů. Mimo tento rámec nebude možné (za běhu aplikace) formulář zmenšovat a zvětšovat. Vlastnost Constraits má tyto čtyři podvlastnosti:
  • MaxHeight – největší výška komponenty;
  • MaxWidth – největší šířka komponenty;
  • MinHeight – nejmenší výška komponenty;
  • MinWidth – nejmenší výška komponenty.
Tolik tedy k pozici komponent na formulářích. Nyní se podíváme na vlastnost, která umožňuje vylepšit komunikaci naší aplikace s uživatelem.

Kurzor myši
Jistě budete souhlasit s tím, že při déletrvajících výpočtech je zapotřebí dát uživateli nějak najevo, že aplikace nezamrzla a že hodlá za okamžik zase komunikovat. V některém z předchozích dílů jsme si popsali metodu Application.Terminate, kterou je vhodné v případě déletrvajících výpočtů „čas od času“ zavolat, nicméně občas bychom ještě potřebovali okamžité vizuální znamení říkající, že se něco bude chviličku dít. Směřuji samozřejmě ke změně kurzoru myši: přesýpací hodiny jsou všem uživatelům natolik známé, že při jejich spatření budou okamžitě vědět, na čem jsou:)

Mnoho komponent má tedy vlastnost Cursor. Hodnotou této vlastnosti je některý z možných vzhledů kurzoru myši. Změna hodnoty této vlastnosti způsobí, že když se kurzor myši nachází nad příslušnou komponentou, bude zobrazen jiný kurzor. Nastavení vlastnosti Cursor například komponenty Button způsobí tedy změnu kurzoru jen v případě, že kurzor bude nad tímto tlačítkem. Zkuste si např. hodnoty crHourGlass (přesýpací hodiny), crCross (křížek), crHelp (šipka s otazníkem), crUpArrow (šipka směrující nahoru), apod.

Formulář
Nyní pojďme zaměřit svou pozornost k formuláři, jakožto ke komponentě nejzásadnější. Bez formulářů příliš aplikací nevytvoříme (mluvíme-li samozřejmě o „standardních“ okenních aplikacích). S formuláři jsme se již setkali ve 14. dílu tohoto seriálu, ale ani zdaleka jsme neprobrali vše podstatné. Protože formulář má mezi komponentami zcela výlučné postavení, má také některé své výlučné vlastnosti. Shrnuje je následující tabulka:

Vlastnost Význam
Active Tato vlastnost je k dispozici pouze za běhu aplikace a říká, je-li formulář (okno) právě aktivní, tedy má-li právě zaměření (focus).
ActiveControl Specifikuje prvek (komponentu) formuláře, který má zaměření (focus).
AutoScroll Indikuje, mají-li se na formuláři automaticky objevit posuvné lišty, pokud je to nutné.
AutoSize Indikuje, má-li se velikost formuláře automaticky přizpůsobovat jeho obsahu.
BorderIcons Specifikuje, které ikony se objeví v záhlaví formuláře (minimalizační, maximalizační, systémové menu, apod.). Podrobnosti naleznete pod tabulkou.
BorderStyle Specifikuje vzhled a chování rámečku formuláře (např. bude-li možné změnit velikost formuláře uchopením za roh apod.). Podrobnosti naleznete pod tabulkou.
Canvas Tzv. plátno formuláře, tedy jakási (virtuální, myšlená) plocha, na kterou je možné kreslit a se kterou lze provádět základní grafické operace. Podrobně viz 16. díl seriálu.
ClientHeight, ClientWidth Udávají vnitřní velikost formuláře (bez rámečku, menu atd.).
Cursor Specifikuje vzhled kurzoru myši, je-li myš nad formulářem.
FormStyle Udává styl formuláře – normální okno, MDI okno apod.
HelpFile Udává jméno souboru s nápovědou pro danou aplikaci.
HorzScrollBar, VertScrollBar Reprezentují horizontální, resp. vertikální posuvnou lištu.
Icon Obsahuje ikonu formuláře (okna).
KeyPreview Logická vlastnost. Její hodnota říká, má-li formulář obdržet vstup z klávesnice dříve než komponenta na formuláři, která má zaměření. Pokud KeyPreview = True, bude případný vstup z klávesnice poslán nejprve formuláři (který na něj může zareagovat třeba formou obsluhy události OnKeyDown) a pak teprve aktivní komponentě (která může vzápětí učinit totéž). Pokud KeyPreview = False, bude vstup poslán přímo aktivní komponentě (a formuláři nebude poslán vůbec).
Menu Specifikuje hlavní menu aplikace.
ModalResult Určuje návratovou hodnotu funkce zobrazující formulář, pokud je tento formulář použit jako modální. Nastavíte-li (za běhu) tuto hodnotu na nenulovou, formulář se uzavře a nastavená hodnota ModalResult bude použita jako návratová hodnota funkce ShowModal, která formulář zobrazila. Tento scénář samozřejmě neplatí u hlavního formuláře aplikace a vůbec u formuláře, který není modální.
Popup Menu Identifikuje pop-up (kontextové) menu asociované s formulářem.
Position Reprezentuje velikost a umístění formuláře na obrazovce (např. na středu obrazovky apod.).
PrintScale Umožňuje nastavit proporci formuláře při tisku na tiskárně – buď se vytiskne ve stejných rozměrech jako na obrazovce nebo je možné provést zvětšení na celý papír, apod.
WindowState Indikuje, bude-li (je-li) formulář minimalizovaný, maximalizovaný nebo ani jedno z toho.

Styl okraje formuláře

Pojďme se ještě podrobně podívat na vlastnost BorderStyle, která specifikuje styl okraje formuláře. Připomeňme, že styl okraje nemá jen vizuální význam; má také vliv na funkčnost. Většina formulářů, se kterými jsme dosud pracovali, vypadaly stejně: měly stejný okraj, stejné systémové menu a stejnou ikonu. Tento fakt lze ovšem změnit. Nastavení vlastnosti BorderStyle se projeví až za běhu aplikace (nikoliv v době návrhu). Tato vlastnost může nabývat šesti hodnot, viz následující přehled:

BorderStyle = bsDialog: používá se pro dialogy, má neměnnou velikost a v záhlaví chybí tlačítka pro minimalizaci a změnu velikosti, viz obrázek:

 

BorderStyle = bsNone: takový formulář nemá žádný okraj ani záhlaví. Je to prostě jen flek šedé barvy (jazykozpytci mi snad odpustí), viz obrázek:

BorderStyle = bsSingle: nelze měnit velikost formuláře, ale je možné jej maximalizovat a minimalizovat.

BorderStyle = bsSizeable: přednastavená (default, standardní) hodnota. Formulář má všechny obvyklé vlastnosti a všechna obvyklá tlačítka.

BorderStyle = bsSizeToolWin: formulář bude vypadat jako dialog, ale bude možné měnit jeho velikost (typické použití je pro panely nástrojů), viz obrázek:

BorderStyle = bsToolWindow: obdoba předchozího typu s tím rozdílem, že má neměnnou velikost.

Systémová tlačítka

Kromě toho, že můžeme ovlivňovat vzhled formuláře nastavením jeho stylu, můžeme také ovlivnit, jaká systémová tlačítka na něm uživatel spatří. Systémová tlačítka slouží k zavření formuláře, k jeho minimalizaci a maximalizaci. Obvyklý formulář má všechna tato vyjmenovaná tlačítka (v pravé části záhlaví) a kromě nich ještě systémové menu (které je přístupné klepnutím na ikonu v levé části záhlaví).

Delphi ovšem umožňuje nezobrazit u formuláře kterýkoliv z těchto prvků (kromě uzavíracího „křížku“). Slouží k tomu vlastnost BorderIcons. Jednotlivé položky se zadávají do hranatých závorek a oddělují se čárkou, případně je samozřejmě možné v Object Inspektoru nastavit logickou hodnotu pro každou z nich.

Co znamenají jednotlivé položky?

  • biSystemMenu – ikona v levé části, pod kterou se skrývá systémové menu.
  • biMinimize, biMaximize – ikony pro minimalizaci, resp. maximalizaci formuláře.
  • biHelp – ikona s otazníkem.

Na závěr
Tolik tedy k dnešnímu, kratšímu pojednání o vlastnostech komponent. Na popsaných bodech je asi dobře vidět, že Delphi nabízejí vývojářům skutečně nepřeberné možnosti a že každý, kdo o to má zájem, se může při návrhu aplikace dosytnosti „vyřádit“. Přestože koncepty popsané v dnešním díle asi nebudete potřebovat každý den, jejich opomenutí bych povařoval za velkou chybu – co když budete v budoucnosti uvažovat o tom, že napíšete aplikaci s plovoucím nástrojovým pruhem?
Diskuze (3) Další článek: Lenoši mezi foťáky

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