Formularele modale oferă caracteristici specifice pe care nu le putem avea atunci când afișăm non-modal. Cel mai frecvent, vom afișa un formular în mod modular pentru a izola procesele sale de orice s-ar putea întâmpla altfel pe formularul principal. Odată finalizate aceste procese, poate doriți să știți dacă utilizatorul a apăsat butonul Salvare sau Anulare pentru a închide formularul modal. Puteți scrie câteva coduri interesante pentru a realiza acest lucru, dar nu trebuie să fie dificil. Delphi furnizează formulare modale cu proprietatea ModalResult, pe care le putem citi pentru a spune cum utilizatorul a ieșit din formular.
Următorul cod returnează un rezultat, dar rutina de apelare îl ignoră:
var F: TForm2; începe F: = TForm2.Create (zero); F.ShowModal; F.Release; ...
Exemplul prezentat mai sus arată doar formularul, permite utilizatorului să facă ceva cu acesta, apoi îl eliberează. Pentru a verifica modul în care formularul a fost încheiat, trebuie să profităm de faptul că metoda ShowModal este o funcție care returnează una dintre mai multe valori ModalResult. Schimbă linia
F.ShowModal
la
dacă F.ShowModal = mrOk apoi
Avem nevoie de niște coduri în forma modală pentru a configura orice este ceea ce dorim. Există mai multe modalități de a obține ModalResult, deoarece TForm nu este singura componentă care are o proprietate ModalResult - TButton are și una.
Să ne uităm mai întâi la ModalResult de TButton. Începeți un nou proiect și adăugați un formular suplimentar (meniul principal Delphi IDE: File -> New -> Form). Acest nou formular va avea un nume „Form2”. Apoi adăugați un TButton (Nume: 'Button1') în formularul principal (Form1), faceți dublu clic pe butonul nou și introduceți următorul cod:
procedură TForm1.Button1Click (Expeditor: TObject); var f: TForm2; începe f: = TForm2.Create (zero); încercadacă f. ShowModal = mrOk apoi Subtitrare: = 'Da' altfel Subtitrare: = 'Nu'; in cele din urma f. Eliberare; Sfârșit; Sfârșit;
Acum selectați formularul suplimentar. Dă-i două Tbutonuri, etichetând unul „Salvează” (Nume: „btnSave”; Subtitrare: „Salvați” și celelalte „Anulează” (Nume: „btnCancel”; Subtitrare: „Anulează”). Selectați butonul Salvare și apăsați F4 pentru a deschide inspectorul de obiecte, derulați în sus / jos până găsiți proprietatea ModalResult și setați-l la mrOk. Reveniți la formular și selectați butonul Anulare, apăsați F4, selectați proprietatea ModalResult și setați-l pe mrCancel.
Este la fel de simplu. Acum apăsați F9 pentru a rula proiectul. (În funcție de setările de mediu, Delphi poate solicita salvarea fișierelor.) După ce apare formularul principal, apăsați butonul 1 pe care l-ați adăugat mai devreme, pentru a afișa formularul pentru copii. Când apare formularul pentru copii, apăsați butonul Salvează și formularul se închide, odată ce reveniți la formularul principal, nota că titlul spune „Da”. Apăsați butonul formularului principal pentru a reîncepe formularul pentru copii, dar de data aceasta apăsați butonul Anulare (sau meniul Sistem Închideți elementul sau butonul [x] din zona de legendă). Legenda formularului principal va citi „Nu”.
Cum funcționează asta? Pentru a afla, aruncați o privire la evenimentul Click pentru TButton (de la StdCtrls.pas):
procedură TButton. Clic; var Forma: TCustomForm; începe Forma: = GetParentForm (Self); dacă Forma nil apoi Formă. ModalResult: = ModalResult; mostenit Clic; Sfârșit;
Ceea ce se întâmplă este că Proprietar (în acest caz, forma secundară) a TButton primește setarea ModalResult în funcție de valoarea ModalResult a TButton. Dacă nu setați TButton. ModalResult, atunci valoarea este mrNone (implicit). Chiar dacă TButton este plasat pe un alt control, formularul părinte este încă utilizat pentru a stabili rezultatul său. Apoi, ultima linie invocă evenimentul Click moștenit de la clasa strămoșilor.
Pentru a înțelege ce se întâmplă cu Forms ModalResult, merită să revizuiți codul în Forms.pas, pe care ar trebui să îl puteți găsi în.. \ DelphiN \ Source (unde N reprezintă numărul versiunii).
În funcția ShowModal a TForm, imediat după afișarea formularului, se începe bucla Repeat-până, care verifică ca variabila ModalResult să devină o valoare mai mare de zero. Când se întâmplă acest lucru, codul final închide formularul.
Puteți seta ModalResult la timpul de proiectare, așa cum este descris mai sus, dar puteți seta și proprietatea ModalResult a formularului direct în cod la timpul de execuție.