سلام
می خواستم بدوننم چه طور در زمان اجرا میتونیم متوجه بشیم یک فرم قبلا در برنامه Create شده یا نه.
سلام
می خواستم بدوننم چه طور در زمان اجرا میتونیم متوجه بشیم یک فرم قبلا در برنامه Create شده یا نه.
فرض کنید متغیری که از نوع فرم مورد نظر تعریف شده، Form2 باشد:
var Form2:TForm2;
در اینصورت میتوانید با بررسی مقدار متغیر فوق چک کنید که این فرم ایجاد شده یا نه:
if Form2=Nil then showmesseage('Form2 is not created')
else showmesseage('Form2 is created');
البته با اجازه بزرگترها مخصوصا جناب Delphi assistant, بد نیست یک کلام هم از مادر عروس !بشنویم:
این شرطی که شما گذاشتید یعنی مقایسه با nil برای بار اول درست کار میکنه. اما اگه فرض کنیم فرم یکبار ایجاد شده و بعد کاربر از اون خارج شده و ما حتی در واقعه OnClose اون نوشته باشیم: action:= cafree که فرم از حافظه خارج بشه باز هم شرط فوق برای ما درست جواب نمیده (True برمیگردونه در صورتی که متغیر فرم الان قابل استفاده نیست و باید create بشه).
در این مورد من 2 تا راه پیشنهاد میکنم. تا نطر بزرگان چی باشه !! :
یکی اینکه واقعه OnClose اینطوری نوشته بشه:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
Form1:= nil;
end;
راه دوم:
function IsFormCreated (const FormName: string): Boolean;
var
i: integer;
begin
Result:= False;
for i:= 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].Name= FormName then
begin
Result:= True;
break;
end
end;
end;
البته با اجازه بزرگترها مخصوصا جناب Delphi assistant, بد نیست یک کلام هم از مادر عروس !بشنویم:
این شرطی که شما گذاشتید یعنی مقایسه با nil برای بار اول درست کار میکنه. اما اگه فرض کنیم فرم یکبار ایجاد شده و بعد کاربر از اون خارج شده و ما حتی در واقعه OnClose اون نوشته باشیم: action:= cafree که فرم از حافظه خارج بشه باز هم شرط فوق برای ما درست جواب نمیده (True برمیگردونه در صورتی که متغیر فرم الان قابل استفاده نیست و باید create بشه).
در این مورد من 2 تا راه پیشنهاد میکنم. تا نطر بزرگان چی باشه !! :
یکی اینکه واقعه OnClose اینطوری نوشته بشه:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
Form1:= nil;
end;
راه دوم:
function IsFormCreated (const FormName: string): Boolean;
var
i: integer;
begin
Result:= False;
for i:= 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].Name= FormName then
begin
Result:= True;
break;
end
end;
end;
مرسی.
البته من با این فرض اون کد رو نوشتم که از روش اول بیان شده توسط شما استفاده شده باشه.