Citat:
reiser:
Da se nadovezem na post iznad mene, jedno od najboljih resenja (bar po meni) je da napises staticku public proceduru koja ce pokrenuti formu. Dakle, to bi trebalo da izgleda otprilike ovako:
Code:
type
TfrmSecond = class(TForm)
private
public
class function RunModal: Integer;
end;
var
frmSecond: TfrmSecond;
implementation
class function TfrmSecond.RunModal: Integer;
begin
Application.CreateForm(TfrmSecond, frmSecond);
try
result := frmSecond.ShowModal;
finally
frmSecond.Free;
end;
end;
I onda iz drugih formi otvaras formu sa
TfrmSecond.RunModal.
Par komentara - prvo, mislim da ne bi trebalo da eksplicitno koristis
Application.CreateForm() jer to nije isto sto i
TForm.Create(), barem ako govorimo o prostom kreiranju formi.
Application.CreateForm() moze imati dodatne (nezeljene?) efekte, npr. ukoliko jos uvek nije (iz bilo kog razloga) dodeljena glavna forma aplikacije prvi poziv
Application.CreateForm() ce formu koja se kreira uzeti za glavnu. Dalje,
Application.CreateForm() automatski postavlja aplikaciju za vlasnika forme, sto nam takodje mozda ne odgovara.
Drugo, upotreba globalne promenljive "frmSecond" je sumnjiva. U zavisnosti od njene primene (unutar klase, na sta mozemo uticati, ali i primene same klase u programu, na sta potencijalno ne mozemo uticati (!)) moze doci do pucanja aplikacije (Access Violation). Globalne promenljive bi
u globalu trebalo izbegavati :)
Ne menjajuci pocetnu ideju, mislim da bi sledeca implementacija bila bolje resenje:
Code:
type
TfrmSecond = class(TForm)
private
public
class function RunModal(): Integer;
end;
implementation
class function TfrmSecond.RunModal(): Integer;
var
frmSecond: TfrmSecond;
begin
frmSecond := TfrmSecond.Create(nil)
try
result := frmSecond.ShowModal;
finally
frmSecond.Free;
end;
end;