Jak komunikovat mezi formuláři

Modální formuláře nabízejí specifické funkce, které nemůžeme mít, když se zobrazují nemodálně. Nejčastěji zobrazíme formulář modálně, abychom izolovali jeho procesy od všeho, co by se jinak mohlo stát v hlavním formuláři. Jakmile budou tyto procesy dokončeny, možná budete chtít vědět, zda uživatel stiskl tlačítko Uložit nebo Zrušit a zavřete modální formulář. K tomu můžete napsat zajímavý kód, ale nemusí to být obtížné. Delphi dodává modální formuláře s vlastností ModalResult, kterou můžeme číst, abychom řekli, jak uživatel opustil formulář.

Následující kód vrátí výsledek, ale volající rutina jej ignoruje:

var
F: TForm2; začít
F: = TForm2.Create (nula); F.ShowModal; F. Vydání; ...

Výše uvedený příklad zobrazuje pouze formulář, umožňuje uživateli s ním něco udělat a poté jej uvolní. K ověření, jak byl formulář ukončen, musíme využít skutečnosti, že metoda ShowModal je funkce, která vrací jednu z několika hodnot ModalResult. Změňte řádek

F.ShowModal

na

-li F.ShowModal = mrOk pak

Potřebujeme nějaký kód v modální podobě, abychom mohli nastavit, co chceme načíst. Existuje více než jeden způsob, jak získat ModalResult, protože TForm není jedinou komponentou, která má vlastnost ModalResult - TButton má také jednu.

instagram viewer

Podívejme se nejprve na TButtonův ModalResult. Zahajte nový projekt a přidejte jeden další formulář (Delphi IDE Hlavní nabídka: Soubor -> Nový -> Form). Tento nový formulář bude mít název „Form2“. Poté do hlavního formuláře (Form1) přidejte TButton (Název: 'Button1'), dvakrát klikněte na nové tlačítko a zadejte následující kód:

postup TForm1.Button1Click (Sender: TObject); var f: TForm2; začít
f: = TForm2.Create (nula); Snaž se-li F. ShowModal = mrOk pak
Titulek: = 'Ano'
jiný
Titulek: = 'Ne'; Konečně
F. Uvolnění; konec; konec;

Nyní vyberte další formulář. Dejte mu dva TButtony a označte jeden 'Save' (Name: 'btnSave'; Titulek: 'Uložit') a další 'Zrušit' (Jméno: 'btnCancel'; Titulek: „Zrušit“). Vyberte tlačítko Uložit a stisknutím klávesy F4 vyvolejte Inspektor objektů, posouvejte nahoru / dolů, dokud nenajdete vlastnost ModalResult a nastavit to na mrOk. Vraťte se do formuláře a vyberte tlačítko Storno, stiskněte klávesu F4, vyberte vlastnost ModalResult a nastavte ji mrCancel.

Je to tak jednoduché. Nyní stisknutím klávesy F9 spusťte projekt. (V závislosti na nastavení vašeho prostředí může společnost Delphi vyzvat k uložení souborů.) Jakmile se objeví hlavní formulář, stiskněte dříve přidané tlačítko1 a zobrazí se podřízený formulář. Když se zobrazí podřízený formulář, stiskněte tlačítko Uložit a formulář se uzavře. Jakmile se vrátíte k hlavnímu formuláři, všimněte si, že je v titulku „Ano“. Stisknutím tlačítka hlavního formuláře vyvoláte podřízený formulář znovu, ale tentokrát stiskněte tlačítko Storno (nebo v nabídce Systém zavřít položku nebo tlačítko [x] v oblasti titulků). Titulek hlavního formuláře bude číst „Ne“.

Jak to funguje? Chcete-li zjistit, podívejte se na událost Click pro TButton (z StdCtrls.pas):

postup TButton. Click; var Forma: TCustomForm; začít
Form: = GetParentForm (Self); -li Forma nula pak
Formulář. ModalResult: = ModalResult; zdědil Click; konec;

Co se stane, je to Majitel (v tomto případě sekundární forma) TButton dostane jeho ModalResult set podle hodnoty TBalton's ModalResult. Pokud nenastavíte TButton. ModalResult, pak je hodnota mrNone (ve výchozím nastavení). I když je tlačítko TButton umístěno na jiném ovládacím prvku, nadřazený formulář se stále používá k nastavení výsledku. Poslední řádek pak vyvolá událost Click zděděnou od třídy předků.

Abychom pochopili, co se děje s Modulem Forms ModalResult, je užitečné si prohlédnout kód ve Forms.pas, který byste měli najít v.. \ DelphiN \ Source (kde N představuje číslo verze).

Ve funkci TForm ShowModal se ihned po zobrazení formuláře spustí smyčka Repeat-Until, která udržuje kontrolu proměnné ModalResult, aby se stala hodnotou větší než nula. Pokud k tomu dojde, konečný kód formulář uzavře.

ModalResult můžete nastavit v době návrhu, jak je popsáno výše, ale také můžete nastavit vlastnost ModalResult ve formuláři přímo v kódu za běhu.