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- آیا فرم به صورت کامل با این روش از جافظه آزاد میشه یا نه؟ :متفکر:
من توی برنامه فرم ها رو دستی میسازم اینطوری:
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- آیا فرم به صورت کامل با این روش از جافظه آزاد میشه یا نه؟ :متفکر: