PDA

View Full Version : چک کردن ایجاد فرم



v_shalchian
پنج شنبه 11 تیر 1383, 19:53 عصر
سلام
می خواستم بدوننم چه طور در زمان اجرا میتونیم متوجه بشیم یک فرم قبلا در برنامه Create شده یا نه.

مهدی کرامتی
پنج شنبه 11 تیر 1383, 20:33 عصر
فرض کنید متغیری که از نوع فرم مورد نظر تعریف شده، Form2 باشد:

var Form2:TForm2;
در اینصورت میتوانید با بررسی مقدار متغیر فوق چک کنید که این فرم ایجاد شده یا نه:

if Form2=Nil then showmesseage('Form2 is not created')
else showmesseage('Form2 is created');

MToloo
جمعه 12 تیر 1383, 06:14 صبح
البته با اجازه بزرگترها مخصوصا جناب 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;

MToloo
جمعه 12 تیر 1383, 06:15 صبح
البته با اجازه بزرگترها مخصوصا جناب 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;

مهدی کرامتی
جمعه 12 تیر 1383, 11:43 صبح
مرسی.

البته من با این فرض اون کد رو نوشتم که از روش اول بیان شده توسط شما استفاده شده باشه.