Obecné poznámky:

  1. Pokud se Vám něco v textu nezdá, nelíbí, nefunguje nebo něčemu nerozumíte, ptejte se!
  2. Kurzivou vytištěné názvy tříd, vlastností nebo událostí lze většinou použít jako klíč v Helpu; hledejte tam bližší informaci o parametrech apod.!
  3. Nespokojujte se s tím, že se Vám to zdá jasné, ale požadované činnosti skutečně provádějte, může se Vám stát, že přitom zjistíte, že to tak jasné není!

Rekapitulace

Vytváříme dva formuláře - hlavní, ze kterého voláme vedlejší formulář. V hlavním formuláři jsou pouze dvě tlačítka: "&Ukaž", po jehož odeslání se otevře vedlejší formulář a tlačítko "&Konec", po jehož odeslání se zavřou všechny (tj. jeden nebo oba) formuláře daného programu a program je ukončen. Vedlejší formulář obsahuje pouze tlačítko "&Konec".

Obsluha prvního tlačítka obsahuje řádek

Form2.Show;

nebo

Form2.ShowModal;

podle toho, zda chceme zobrazit vedlejší okno jako modální nebo jako nemodální.

Obsluhu obou tlačítek "Konec" uděláme stejně - obsahují volání metody Close:

Close;

Standardní (implicitní) nastavení

Implicitně Delphi vytvoří oba formuláře na začátku programu (AutoCreate), přičemž u hlavního okna má vlastnost Visible hodnotu true a u vedlejších oken má vlastnost Visible hodnotu false.

Při tomto standardním nastavení máme v programu dvě třídy formulářů/objektů (TForm1 a TForm2) a dvě instance formulářů/objektů těchto tříd (Form1 a Form2).

Dynamické vytváření vedlejších formulářů

Změníme v menu Project|Options nastavení tak, aby se na začátku vytvořilo pouze hlavní okno. Obsluhu tlačítka "Ukaž" rozšíříme o deklaraci proměnné AuxForm, o vytvoření instance objektu z třídy TForm2 (tj. vedlejšího okna), jeho zobrazení a uvolnění paměti:

var AuxForm:TForm;
begin
AuxForm:=TForm2.Create(self);
AuxForm.ShowModal;
AuxForm.Destroy;

V tomto režimu máme v programu dvě třídy formulářů (TForm1 a TForm2), jednu instanci formuláře třídy Form1 a proměnný počet instancí formulářů třídy Form2 - napřed žádný, potom jeden a po uzavření opět žádný.

Procvičení

Vyzkoušejte i pro nemodální variantu.

Upravte tak, aby bylo možno vytvořit max. 5 instancí vedlejšího okna (pro modální variantu).

Návod: Přidejte tlačítko "Ukaž" do modálního okna. Použijte u tlačítek vlastnost Enabled (implicitně je nastavena na hodnotu true). Pokud v programu nastavíme u objektu tuto hodnotu na false, uživatel progrmau nemůže příslušný objekt (zde tlačítko) použít.

Uzavírání formulářů

Formulář lze uzavřít nejen odesláním tlačítka "Konec", ale i např. uzavřením přes systémové menu či ikonu, provedením metody Close nebo uzavřením hlavního okna. Potřebujeme-li provést před uzavřením formuláře nějakou akci (typickou akcí je potvrzení od uživatele), nestačí tuto akci dopsat k tlačítku "Konec".

Nastavte se na formulář vedlejšího okna, stiskem F11 přejděte do Inspektoru objektů a zde změňte záložku "Properties" (vlastnosti) na záložku "Events" (události). Dvojitým kliknutím na událost OnCloseQuery otevřte programový kód pro tuto událost.

Událost OnCloseQuery se provede vždy před uzavíráním okna. Pokud nechceme okno zavřít, nastavíme parametr CanClose na hodnotu false. Typický je následující příklad:

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=
MessageDlg('Mohu zavřít Form2?', mtInformation, [mbYes, mbNo], 0) = mrYes;
end;

Procvičení

Zkuste ještě jednu možnost - umístěte do formuláře volbu (CheckBox) s tím, že formulář lze zavřít pouze tehdy, je-li volba "zaškrtnuta".

Návod: Použijte vlastnost Checked. Pokud je uzavření formuláře odmítnuto, informujte uživatele krátkou zprávou voláním procedury ShowMessage.

I při tomto řešení lze aplikaci ukončit tím, že zavřeme přímo hlavní okno. Testování vedlejších oken při uzavření hlavního okna se děje automaticky pouze pro tzv. MDI aplikace (blíže příp. ústně). U běžných aplikací je nutno tento test zahrnout do popisu události OnCloseQuery hlavního okna.

Poslední verse naší miniaplikace byla napsána takovým způsobem, že v programu není uložen odkaz na vedlejší okno - proměnná AuxForm je lokální v popisu události OnClick.

Proto použijeme způsob, který je jednak obecný a jednak "robustní" v tom smyslu, že je předpoklad jeho bezchybného fungování i při změnách v dané aplikaci. Toto řešení obsahuje několik nových, dosud nezmiňovaných obratů; uvedeme napřed programový kód, potom komentář.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var OKToClose:boolean;
i:integer;
begin
OKToClose:=true;
for i:=0 to ComponentCount-1 do begin
   if (Components[i] is TForm)
   then OKToClose:=OKToClose and (Components[i] as TForm).CloseQuery;
end;
CanClose:=OKToClose;
end;

Jedná se o programový kód obsluhy události OnCloseQuery hlavního okna, který se dotáže všech formulářů vlastněných aplikací (hlavním oknem), zda je možno je uzavřít - k uzavření je třeba souhlasu všech.

Vedlejší okno bylo při vytváření přiřazeno k hlavnímu oknu - viz parametr Self při volání metody Create. Tím byl vytvořen vztah "vlastnictví":

Použili jsme rovněž dva důležité operátory is a as. Operátor is je dotaz na to, zda je objekt příslušného typu, a vrací hodnotu true, pokud je daný objekt prvkem uvedené třídy nebo třídy od této třídy odvozené.

Operátor as je použit jako bezpečné přetypování - umožňuje volat metodu CloseQuery formuláře - tj. objektu třídy TForm -, přestože seznam Components obsahuje objekty obecnější třídy TComponent. Metoda CloseQuery formuláře provede jeho událost OnCloseQUery a vrací hodnotu true, pokud událost nastaví parametr CanClose na tuto hodnotu, a naopak.


Timer

Obsluhu několika typických událostí obsahuje jednoduchý prográmek TIMER.EXE, který (snad ještě) najdete na serveru KII v adresáři SYS:\PUB\SCHOOL\PG24 (případně lze zde stáhnout, má 180kB).

Obsahuje objekty/ovládací prvky tříd TEdit, TScrollBar, TLabel, TProgressBar a TTimer. Podstatou je obsluha události OnTimer prvky třídy TTimer, která je tímto prvkem prováděna vždy po uplynutí zadaného intervalu (zde 1 sekunda). Dále jsou použity události OnChange pro editační pole a rolovací lištu pro přenos počátečního nastavení mezi těmito ovládacími prvky.

Procvičení

Napodobte chování uvedeného prográmku (nebo ho podle svého uvážení vylepšete).