PDA

View Full Version : از بين بردن يك كامپوننت در Runtime



iamehsan56
دوشنبه 18 شهریور 1387, 08:53 صبح
سلام
چطور مي شه يه كامپوننت رو كه به شكل Run time ايجاد كردي از بين ببري . من هر كاري مي كنم Error ميده . Free مي كنم فايده نداره .
در زير كد ايجاد يه panel رو نوشتم .جايي خوندم كه بايد جاي self رو nil كنم اما وقتي free مي كني در هر صورت Error مي ده (Access violation at addrees ....)





p:=TPanel.Create(self);
p.Parent:=base;
p.Name:='but';
p.Caption:='b';
p.Left:=0;
p.Top:=0;

كد free



p.free;

لطفا راهنماييم كنيد

shervin farzin
دوشنبه 18 شهریور 1387, 09:59 صبح
سلام
با Free كردن بايد مشكل حل بشه . مشكل شما قطعا از Free كردن نيست .
در مورد نحوه و زمان Create كردن و Free كردن كامپوننت بيشتر توضيح بده .
در ضمن در مورد Base هم بيشتر بگو .
شايد تو يه قسمت ديگه از برنامت P.Free رو اجراء كردي كه در اين صورت اگه بخواي مجددا
Free كنيش خطاي Access Violation رو ميده .
اگر به عنوان Owner كامپوننت ، Self انتخاب كردي بايد دقت كني كه Owner رو قبل از خود
كامپوننت Free نكرده باشي كه اگر اين اتفاق افتاده كامپوننت شما به طور اتوماتيك Free شده
و اجراء P.Free باعث توليد خطا ميشه .

net_ved
دوشنبه 18 شهریور 1387, 10:01 صبح
Destroy درسته

iamehsan56
دوشنبه 18 شهریور 1387, 15:11 عصر
base يه panel هست كه p روش قرار مي گيره . در مورد اين كه جاي ديگه free مي كنم . نه هيچ جايي free نمي شه . من دارم free كردن رو توي onDBLClick همون p انجام مي دم . شايد مشكل از اينجاست . اين طور نيست . اگه اين طوره من مي خوام وقتي يه component رو Runtime مي سازم با دو بار click روي اون اونو از بين ببرم . چه بايد كرد

vcldeveloper
سه شنبه 19 شهریور 1387, 00:53 صبح
Destroy درستهخیر:

Do not call Destroy directly. Call Free instead. Free verifies that the object
reference is not nil before calling Destroy.
من دارم free كردن رو توي onDBLClick همون p انجام مي دم . نباید همچین کاری کنید! وقتی OnDblClick یا هر رویداد دیگه ایی مربوط به اون شی داره اجرا میشه، کدی در داخل فضای اختصاص داده شده به اون شی در حال اجرا هست، طبیعی هست که وقتی در داخل کد مربوط به اون شی، آن را Free کنید، Access Violation می گیرید! برای همچین کاری، اگر شی شما یک فرم بود، می تونستید از متد Release استفاده کنید، اما نه برای TPanel. چون همچین متدی نداره.