با جستجو برای یک راه دیگه موافقم اما اصرار روی موارد بالا بحث رو به جایی نمی رسونه
بد هم نیست ادامه بدیم تا یه راهکار نهایی استفاده کنیم هممون، که توسعه دهندرو اتوماتیک از خطا دور کنه، من خودم اینجا به کنستراکتور رسیدم فکر کنم اگه جواب بده خوبه هرچند بازم باید حتما متغییر رو پاس بدیم که میتونیم overload کنیم کانستراکتور رو.
این میشه یک راه دیگه که البته کمی کار داره
مثلا به صورت زیر :
بازنویسی کلاس TForm2 :
type
TForm2 = class(TForm)
Label1: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FrmVar : ^TForm;
{ Private declarations }
public
constructor Create(AOwner : TComponent; var MyFrm : TForm); reintroduce;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
constructor TForm2.Create(AOwner : TComponent; var MyFrm : TForm);
begin
inherited Create(AOwner);
FrmVar := @MyFrm;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FrmVar^ := nil;
Action := caFree;
end;
ساخت و نمایش فرم :
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(frm) then
begin
frm := TForm2.Create(nil, TForm(frm));
frm.Show;
end
end;
Create رو بازنویسی کردیم و به صورت ارجاعی متغیر اشاره گر به فرم رو گرفتیم ( MyFrm ) و درون یک اشاره گر دیگه ( FrmVar ) قرار دادیم
در OnClose هم فضای آدرس اشاره گر FrmVar که ما رو به frm می رسونه رو برابر nil قرار دادیم
فرض کنیم از متغیر استفاده کنیم و توی یه فرم بخایم ۵۰ تا فرم دیگرو باز کنیم... اسم متغییرا، تعداد و ...
برای نمایش یک فرم درگیر شدن توی مباحث اشاره گرها احتمال خطا رو بالا می بره
استفاده از مثال بالا برای نمایش چند باره فرم هم نمی تونه زیاد مفید باشه چون متغیر frm به صورت عمومی تعریف شده، یعنی برای هر نمونه از فرم باید یک متغیر درنظر گرفته بشه، درواقع همه نمونه های ایجاد شده، در پایان کارشون یک اشاره گر واحد رو می خوان برابر nil قرار بدن
اصولا وقتی شما میخواید چند نمونه از یک فرم رو بسازید دیگه نیاز به بررسی مقدار frm ندارید که نیاز باشه اون رو nil کنید و به نظرم انجام روشهایی مثل مثال بالا کار اضافه ای محسوب میشه
امکان nil کردن اشاره گر از داخل خود کلاس یک مزیت محسوب نمیشه و اگر این امکان وجود نداره هم یک ضعف نیست و به نظر خیلی منطقی هم نمیاد که وجود داشته باشه
به این نکته هم توجه کنید که برابر nil قرار دادن با Free کردن تفاوت داره، وقتی یک Object رو Create می کنید، در پایان کارش فضای درنظر گرفته شده برای اون Object باید Free بشه تا حافظه اضافی مصرف نشه، اما nil کردن "اشاره گر اون فضا" ( در اینجا frm ) اجباری نیست، با هر بار ساخت نمونه از کلاس، اشاره گر مقدار جدیدی می گیره و nil نکردن اون باعث ایجاد Memory Leak نمیشه
به هر حال، سوال پرسیده شده در مورد نمایش یک فرم در صورت عدم وجودش بود و برای رسیدن به این هدف هم به نظرم روشهای قبلی نسبت به مثال بالا ساده تر و منطقی تر هستند
مثلا چک کردن فرم های Screen :)