Jak komunikować się między formularzami

Formularze modalne oferują określone funkcje, których nie możemy mieć przy wyświetlaniu niemodalnym. Najczęściej wyświetlamy formularz modalnie, aby odizolować jego procesy od wszystkiego, co mogłoby się zdarzyć w głównej formie. Po zakończeniu tych procesów możesz chcieć wiedzieć, czy użytkownik nacisnął przycisk Zapisz czy Anuluj, aby zamknąć formularz modalny. Aby to zrobić, możesz napisać interesujący kod, ale nie musi to być trudne. Delfy dostarcza formularze modalne z właściwością ModalResult, którą możemy odczytać, aby powiedzieć, w jaki sposób użytkownik opuścił formularz.

Poniższy kod zwraca wynik, ale procedura wywołująca go ignoruje:

var
F: TForm2; zaczynać
F: = TForm2.Create (zero); F.ShowModal; F.Release; ...

Powyższy przykład pokazuje tylko formę, pozwala użytkownikowi coś z tym zrobić, a następnie ją zwalnia. Aby sprawdzić, jak formularz został zakończony, musimy skorzystać z faktu, że metoda ShowModal jest funkcją, która zwraca jedną z kilku wartości ModalResult. Zmień linię

instagram viewer

F.ShowModal

do

gdyby F.ShowModal = mrOk następnie

Potrzebujemy trochę kodu w formie modalnej, aby skonfigurować wszystko, co chcemy pobrać. Jest więcej niż jeden sposób na uzyskanie ModalResult, ponieważ TForm nie jest jedynym składnikiem mającym właściwość ModalResult - TButton też ją ma.

Najpierw spójrzmy na ModalResult TButton. Rozpocznij nowy projekt i dodaj jeden dodatkowy formularz (Menu główne Delphi IDE: Plik -> Nowy -> Formularz). Ten nowy formularz będzie miał nazwę „Form2”. Następnie dodaj TButton (Nazwa: „Button1”) do głównego formularza (Form1), kliknij dwukrotnie nowy przycisk i wprowadź następujący kod:

procedura TForm1.Button1Click (Sender: TObject); var f: TForm2; zaczynać
f: = TForm2.Create (zero); próbowaćgdyby fa. ShowModal = mrOk następnie
Podpis: = „Tak”
jeszcze
Podpis: = „Nie”; Wreszcie
fa. Wydanie; koniec; koniec;

Teraz wybierz dodatkowy formularz. Daj mu dwa TB, oznaczając jeden „Zapisz” (Nazwa: „btnSave”; Podpis: „Zapisz”) i drugi „Anuluj” (Nazwa: „btnCancel”; Podpis: „Anuluj”). Wybierz przycisk Zapisz i naciśnij F4, aby wyświetlić Inspektora obiektów, przewiń w górę / w dół, aż znajdziesz właściwość ModalResult i ustaw na mrOk. Wróć do formularza i wybierz przycisk Anuluj, naciśnij F4, wybierz właściwość ModalResult i ustaw ją na mrCancel.

To takie proste. Teraz naciśnij F9, aby uruchomić projekt. (W zależności od ustawień środowiska, Delphi może poprosić o zapisanie plików.) Gdy pojawi się główny formularz, naciśnij Button1, który wcześniej dodałeś, aby wyświetlić formularz potomny. Kiedy pojawi się formularz potomny, naciśnij przycisk Zapisz, a formularz zamknie się, po powrocie do głównej formularza zauważ, że jego podpis mówi „Tak”. Naciśnij przycisk formularza głównego, aby ponownie wyświetlić formularz podrzędny, ale tym razem naciśnij przycisk Anuluj (lub element menu Zamknięcie menu System lub przycisk [x] w obszarze podpisu). Podpis głównego formularza będzie brzmiał „Nie”.

Jak to działa? Aby się dowiedzieć, spójrz na zdarzenie Click dla TButton (z StdCtrls.pas):

procedura TButton. Kliknij; var Formularz: TCustomForm; zaczynać
Form: = GetParentForm (Self); gdyby Formularz zero następnie
Formularz. ModalResult: = ModalResult; dziedziczny Kliknij; koniec;

Co się dzieje, to że Właściciel (w tym przypadku forma wtórna) TButton otrzymuje zestaw ModalResult zgodnie z wartością ModalResult TButton. Jeśli nie ustawisz TButton. ModalResult, wówczas wartością jest mrNone (domyślnie). Nawet jeśli przycisk TButton jest umieszczony na innej kontrolce, formularz nadrzędny jest nadal używany do ustawiania jego wyniku. Ostatni wiersz wywołuje zdarzenie Click odziedziczone po klasie przodka.

Aby zrozumieć, co dzieje się z Forms ModalResult, warto przejrzeć kod w Forms.pas, który powinieneś znaleźć w.. \ DelphiN \ Source (gdzie N oznacza numer wersji).

W funkcji ShowModal TForma, bezpośrednio po wyświetleniu formularza, rozpoczyna się pętla Powtarzanie do, która sprawdza, czy zmienna ModalResult staje się wartością większą niż zero. Kiedy to nastąpi, końcowy kod zamyka formularz.

Możesz ustawić ModalResult w czasie projektowania, jak opisano powyżej, ale możesz także ustawić właściwość ModalResult formularza bezpośrednio w kodzie w czasie wykonywania.