PDA

View Full Version : بهترین محل برای آزاد سازی فرم ایجاد شده



hadisalahi2
چهارشنبه 18 تیر 1393, 10:14 صبح
سلام
من توی برنامه فرم ها رو دستی میسازم اینطوری:


Application.CreateForm(TCompanyForm,CompanyForm);
CompanyForm.Show;


حالا هنگامی که کاربر میخواد از فرم خارج بشه ، فرم رو آزاد میکنم ، اینطوری:


Self.Destroy;


هنگامی که کاربر روی دکمه ضربدر فرم کلیک میکنه ، مشکلی نیست و برنامه این خط رو اجرا میکنه و ظاهرا فرم آزاد میشه از حافظه

اما وقتی روی دکمه خروج کلیک میکنه ، در انتهای پروسیجر اون همین دستور قرار داره
و بعد از رسیدن به دستور Close دوباره رویداد OnClose فراخوانی میشه و دوباره دستور Self.Destroy; میخواد اجرا بشه و چون قبلا فرم آزاد شده ، یک پیغام خطای
Invalid pointer operation صادر میشه

من برای رفع این مشکل یه متغیر بولین تعریف کردم و اینطوری چک کردم و مقدار دهی کردم :



procedure TCompanyForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not FormClose then Begin
Self.Destroy;
FormClose:=True;
End;
end;



حالا میخواستم ببینم
1- اصولا این کار درسته و یا راه بهتری وجود داره؟ :متفکر:2- آیا فرم به صورت کامل با این روش از جافظه آزاد میشه یا نه؟ :متفکر:

nilidelphi
چهارشنبه 18 تیر 1393, 12:24 عصر
بهتره تو رویداد onTerminate برنامه کد آزادسازیتو بنویسی

یوسف زالی
چهارشنبه 18 تیر 1393, 13:44 عصر
بهتره تو رویداد onTerminate برنامه کد آزادسازیتو بنویسی

بعد اگه تو طول اجرای برنامه دو بار یک فرم رو باز کرد و ساخت چی می شه؟ یه دونش همین جوری تو حافظه ول می چرخه تا شات دان

hadisalahi2
چهارشنبه 18 تیر 1393, 16:37 عصر
بهتره تو رویداد onTerminate برنامه کد آزادسازیتو بنویسی

میخوام وقتی کاربر کارش با فرم تموم شد فرم حذف بشه و چیزی ازش توی حافظه نباشه ، این رویداد اصلا ربطی به این زمان نداره .



بعد اگه تو طول اجرای برنامه دو بار یک فرم رو باز کرد و ساخت چی می شه؟ یه دونش همین جوری تو حافظه ول می چرخه تا شات دان

یوسف جان ، نظری نداری شما؟
به نظرت همین موقعی که Destory میکنم درسته؟ :متفکر:

یوسف زالی
چهارشنبه 18 تیر 1393, 16:46 عصر
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

Felony
دوشنبه 30 تیر 1393, 04:22 صبح
درستش این هست که یک class function بنویسی و فرمت رو توش بسازی :


type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
class function Execute: Boolean;
end;


پیاده سازی :


class function TForm2.Execute: Boolean;
begin
with TForm2.Create(Application) do
try
ShowModal;
finally
Free;
end;
end;


استفاده :


TForm2.Execute();

hadisalahi2
دوشنبه 30 تیر 1393, 12:09 عصر
درستش این هست که یک class function بنویسی و فرمت رو توش بسازی :


type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
class function Execute: Boolean;
end;


پیاده سازی :


class function TForm2.Execute: Boolean;
begin
with TForm2.Create(Application) do
try
ShowModal;
finally
Free;
end;
end;


استفاده :


TForm2.Execute();

دقیقا متوجه نشدم این کد رو باید کجا بزارم
توی هر فرمی که میخوام Create کنم؟

hadisalahi2
دوشنبه 30 تیر 1393, 12:10 عصر
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;




یوسف جان فقط با همین یک خط فرم آزاد میشه؟
احتیاجی دیگه به Destory نیست؟

یوسف زالی
دوشنبه 30 تیر 1393, 12:11 عصر
احتیاجی نیست.
کد مجتبی هم همون مستر فرمیه که با هم دیدیم.

khoshblagh
دوشنبه 30 تیر 1393, 18:00 عصر
با سلام خدمت دوستان
آیا به روش زیر فرم در موقع زدن دکمه ای که دستور close در آن تعریف شده آزاد نمیشه؟


Application.CreateForm(TfrmMogayerTik,frmMogayerTi k);
frmMogayerTik.showmodal;
frmMogayerTik.free;

یوسف زالی
دوشنبه 30 تیر 1393, 19:06 عصر
سلام.
چه فرقی کرد با پست 6؟

hadisalahi2
سه شنبه 31 تیر 1393, 10:12 صبح
احتیاجی نیست.
کد مجتبی هم همون مستر فرمیه که با هم دیدیم.

چرا آزاد میشه
اما این روشی که یوسف میگه ، خیلی راحته
روش مجتبی برای ایجاد فرم هم فکر کنم بهینه تر باشه
اما من دقیقا فرقش رو نفهمیدم چیه :متفکر: