Un subiect foarte delicat despre care eu am gasit putina documentatie si care cred ca intereseaza pe cei care sunt mai mult sau mai putin axati pe Delphi: comunicarea intre forme. Mai exact, imaginati-va u nscenariu de genul: Avem oforma unde completam niste campuri in functie de care cautam ceva intr-o baza de date, de exemplu un elev (stim, sa zicem, numele dar nu stim exact ince clasa e sau prenumele...). Rezultatul returnat este o lista de elevi din care alegem elevul dorit. Cel mai frumos mod de a prezenta utilizatorului rezultatul ar fi, dupa parerea mea, deschiderea unei forme noi cu lista respectiva de unde utilizatorul selecteaza elevul dorit, apasa [OK] sau [Alege] dupa care se inchide forma a doua (cu lisat elevilor) iar informatiile depsre elevul selectat sunt tiparite in campurile de pe prima forma. Ca sa putem lansa din forma 1, forma 2, trebuie sa folosim unit-ul formei 2 in unit-ul formei 1. Ca sa putem returna valorile dorite din forma 2 in forma 1, ar trebui sa includem unit-ul formei 1 in cel al formei 2, ceea ce nu se poate pentru ca nu se accepta apelarea circulara de acest fel. Astfel, am ajuns la o chestie simpatica: o forma se poate afisa normal sau
modal. Afisarea modala a uneo forme presupune ca aplicatia isi opreste executia pana cand aceasta forma e inchisa. pentru asta, forma are o functie ShowModal() care afiseaza forma in mod modal

. Cand forma este inchisa, aceasta functie returneaza valoarea proprietatii ModalResult. Mergand mai departe, aceeasi proprietate se gaseste si la butoane. Astfel, daca forma (forma2 in cazul nostru) contine butoane care au valoarea proprietatii ModalResult alta decat mrNone, forma se inchide automat cand utilizatorul da click pe unul din aceste butoane. Astfel, se pot transmite valori prin functii special create intre forme. Un exemplu cat se poate de simplu (cred ca e furat de pe
http://delphi.about.com , adica l-am incercat sa fad cum functioneaza si l-am modificat o tzara

) l-am scris mai jos. Am 2 forme, pe prima un buton (Button1 etichetat "Form 2") si o eticheta (Label1) si pe a doua o casuta text (Edit1) si un buton "OK" pe care cand se apasa, se inchide Form2 iar pe eticheta Label1 va scrie valoarea din casuta text Edit1. Codul mai jos:
Codul formei 1 (Unit1):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var f2: Tform2;
begin
f2 := TForm2.Create(nil);
try
if f2.ShowModal = mrOk then Label1.Caption := f2.Edit1.Text;
finally
f2.Release;
end;
end;
end.
Sa nu uitam ca proprietatea ModalResult a butonului de pe forma 2 (Form2) e setata la valoarea mrOK. Codul formei 2:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
end.
Dupa cum ati vazut, in forma 2 nu exista cod introdus manula. Puteam, de asemenea, sa cream o functie in forma 2 care returneaza niste valori (sau un set de valori) si sa o apelam in forma 1 la apasarea pe buton. Spor la treaba!