PDA

View Full Version : حذف یک دکمه توسط خودش



kimia1
یک شنبه 05 اسفند 1386, 11:36 صبح
چگونه می توانم در رویداد ONClick یک دکمه خودش را حذف کنم

Mahyaa
یک شنبه 05 اسفند 1386, 11:40 صبح
اگر Button را در حالت Design در فرم قرار دادی ، باید Hide کنی .
در رویداد OnClick بنویس :


Button1.Hide; // Button1 is the name of Tbuttonیا کلی تر :


(Sender as TButton).Hide;

technic
یک شنبه 05 اسفند 1386, 11:52 صبح
با True و false کردن خاصیت Vizable می تونی این کاررو انجام بدی

kimia1
یک شنبه 05 اسفند 1386, 12:46 عصر
اگر Button را در حالت Design در فرم قرار دادی ، باید Hide کنی .
در رویداد OnClick بنویس :


Button1.Hide; // Button1 is the name of Tbuttonیا کلی تر :


(Sender as TButton).Hide;


با True و false کردن خاصیت Vizable می تونی این کاررو انجام بدی

نه دوستان هدف من حذف یک دکمه است نه مخفی کردن



button1.free;

dkhatibi
یک شنبه 05 اسفند 1386, 13:49 عصر
نه دوستان هدف من حذف یک دکمه است نه مخفی کردن


کد:

button1.free;


این کار با این روش خطایی به دنبال نذاره؟

Mahyaa
یک شنبه 05 اسفند 1386, 15:55 عصر
چه دلیلی برای این کار وجود داره ؟
مگر اینکه بصورت داینامیک و در زمان اجرا (Runtime) اون رو Create کرده باشین !
در ضمن اگر متد Free رو صدا میزنید ، بهتره Pointer رو هم Remove کنید تا بعدا بتونبد Nil بودنش رو چک کنید :


Button1 := nil;



این کار با این روش خطایی به دنبال نذاره؟


به نظرم کار درست و اصولی نیست ولی خطایی نمیده .
تا جایی که میدونم ، متد Free اول چک میکنه که Object وجود داره یانه ، و بعد اون رو Destroy میکنه .

kimia1
دوشنبه 06 اسفند 1386, 08:45 صبح
چه دلیلی برای این کار وجود داره ؟
مگر اینکه بصورت داینامیک و در زمان اجرا (Runtime) اون رو Create کرده باشین !
در ضمن اگر متد Free رو صدا میزنید ، بهتره Pointer رو هم Remove کنید تا بعدا بتونبد Nil بودنش رو چک کنید :


Button1 := nil;





به نظرم کار درست و اصولی نیست ولی خطایی نمیده .
تا جایی که میدونم ، متد Free اول چک میکنه که Object وجود داره یانه ، و بعد اون رو Destroy میکنه .

من در زمان اجرا بصورت runtime تعدادی GroupBox می سازم و کنار هر کدام هم یک دکمه ایجاد می کنم که اگر کاربر خواست آن GroupBox را با این دکمه حذف کنه. بالطبع بعد از حذف GroupBox خود دکمه هم باید حذف بشه و اینجاست که دلفی Error میده ولی بعد از Error دکمه را هم حذف میکنه. Error هم Access Violation هست

Mahyaa
دوشنبه 06 اسفند 1386, 10:46 صبح
من در زمان اجرا بصورت runtime تعدادی GroupBox می سازم و کنار هر کدام هم یک دکمه ایجاد می کنم که اگر کاربر خواست آن GroupBox را با این دکمه حذف کنه. بالطبع بعد از حذف GroupBox خود دکمه هم باید حذف بشه و اینجاست که دلفی Error میده ولی بعد از Error دکمه را هم حذف میکنه. Error هم Access Validation هست

در اینصورت نباید مشکلی برای حذفش وجود داشته باشه !
مطمئن هستی که Access Violation رو موقع حذف Button میده ؟ داخل GroupBox چه کنترلهایی داری ؟ اونها رو هم Free میکنی ؟
اگه بتونی کدی رو که نوشتی اینجا بگذاری راحت تر میشه بررسیش کرد .

kimia1
چهارشنبه 08 اسفند 1386, 07:17 صبح
در اینصورت نباید مشکلی برای حذفش وجود داشته باشه !
مطمئن هستی که Access Violation رو موقع حذف Button میده ؟ داخل GroupBox چه کنترلهایی داری ؟ اونها رو هم Free میکنی ؟
اگه بتونی کدی رو که نوشتی اینجا بگذاری راحت تر میشه بررسیش کرد .


ClGrpBox:=TGroupBox.Create(self);
ClGrpBox.Left:=400;
ClGrpBox.Top:=150;
ClGrpBox.Width:=350;
ClGrpBox.Height:=150;
ClGrpBox.Caption:=' کاربر ';
ClGrpBox.Parent:=Form1;
ClGrpBox.Visible:=true;

ClButton1:=TButton.Create(self);
ClButton1.Left:=300;
ClButton1.Top:=150;
ClButton1.Width:=100;
ClButton1.Height:=50;
ClButton1.Caption:='حذف کاربر';
ClButton1.Parent:=Form1;
ClButton1.Visible:=true;
ClButton1.onclick:=BtnClick;

توی پروسیجر مربوط به BtnClick هم کدهای زیر را نوشتم


ClGrpBox.Free;
ClButton1.Free;


داخل GroupBox چه کنترلهایی داری ؟ اونها رو هم Free میکنی ؟
فکر کنم با Free کردن GroupBox کنترلهای درون آن نیز Free شوند.اینطور نیست؟

vcldeveloper
چهارشنبه 08 اسفند 1386, 10:07 صبح
فکر کنم با Free کردن GroupBox کنترلهای درون آن نیز Free شوند.اینطور نیست؟
خیر. غیر از اینکه Owner آنها هم GroupBox باشه. در حالت عادی Owner فرم هست و Parent اونها GroupBox هست. در کد شما هم Owner ایی که در زمان Create مشخص شده، فرم هست، نه GroupBox.

kimia1
چهارشنبه 08 اسفند 1386, 10:38 صبح
خیر. غیر از اینکه Owner آنها هم GroupBox باشه. در حالت عادی Owner فرم هست و Parent اونها GroupBox هست. در کد شما هم Owner ایی که در زمان Create مشخص شده، فرم هست، نه GroupBox.

ببخشید اگر بخوام owner کنترلهای درون GroupBox خود GroupBox باشه باید چکار کنم. درضمن با این کد groupBox حذف میشه اما با حذف دکمه مشکل دارم، یعنی اگه خط ClButton1.Free را بردارم هیچ خطایی اتفاق نمی افته و دقیقا مشکل زمانی بروز میکنه که قراره دکمه خودش را حذف کنه

jalilmousavi
چهارشنبه 08 اسفند 1386, 11:09 صبح
ببخشید اگر بخوام owner کنترلهای درون GroupBox خود GroupBox باشه باید چکار کنم. درضمن با این کد groupBox حذف میشه اما با حذف دکمه مشکل دارم، یعنی اگه خط ClButton1.Free را بردارم هیچ خطایی اتفاق نمی افته و دقیقا مشکل زمانی بروز میکنه که قراره دکمه خودش را حذف کنه

کد نوشته شده در رویداد BtnClick را به صورت زیر تغییر بده مشکلت حل می شود.
ClButton1.onclick:=nil;
ClGrpBox.Free;
ClButton1.Free;

سطری که در اول اضافه شده است ، ارتباط دکمه را با پروسه کلیک دکمه را حذف می کند و در نتیجه خطایی پیش نمی آید.

Mahyaa
چهارشنبه 08 اسفند 1386, 11:47 صبح
ببخشید اگر بخوام owner کنترلهای درون GroupBox خود GroupBox باشه باید چکار کنم.

Owner با پارامتر داخل Create مشخص میشه مثلا :


TEdit.Create(Owner : TComponent);
وقتی جای Owner میگذاری Self یعنی کلاس جاری رو که TForm1 هست ، Owner قرار دادی .


با این کد groupBox حذف میشه اما با حذف دکمه مشکل دارم، یعنی اگه خط ClButton1.Free را بردارم هیچ خطایی اتفاق نمی افته و دقیقا مشکل زمانی بروز میکنه که قراره دکمه خودش را حذف کن

درسته که AV رو روی اون کد میگیری ولی اشتباهی که انجام شده یک جایی قبل اون کد هست . باید Trace کنی و آبجکت Button مورد نظر رو در نظر بگیری (Alt + ّ5) و ببینی کجا Free یا Nil میشه (یا کلا تغییر میکنه)

jalilmousavi
چهارشنبه 08 اسفند 1386, 13:20 عصر
Owner با پارامتر داخل Create مشخص میشه مثلا :


TEdit.Create(Owner : TComponent);
وقتی جای Owner میگذاری Self یعنی کلاس جاری رو که TForm1 هست ، Owner قرار دادی .



درسته که AV رو روی اون کد میگیری ولی اشتباهی که انجام شده یک جایی قبل اون کد هست . باید Trace کنی و آبجکت Button مورد نظر رو در نظر بگیری (Alt + ّ5) و ببینی کجا Free یا Nil میشه (یا کلا تغییر میکنه)

چه احتیاجی به مواردی که ذکر کردید، هست؟ در کل باید تمام ارتباط هایی که با اشیا یا پروسه ها ایجاد شده ، از بین بروند تا شیء مورد نظر بدون مشکل حذف شود.

Mahyaa
چهارشنبه 08 اسفند 1386, 13:43 عصر
نه . احتیاجی به حذف کردن Event Handler نیست .با نوشتن یا ننوشتن ClButton1.onclick:=nil;
تفاوتی برای آزاد کردن آبجکت نمیکنه .

vcldeveloper
چهارشنبه 08 اسفند 1386, 17:35 عصر
چه احتیاجی به مواردی که ذکر کردید، هست؟ در کل باید تمام ارتباط هایی که با اشیا یا پروسه ها ایجاد شده ، از بین بروند تا شیء مورد نظر بدون مشکل حذف شود.
وقتی برای یک کامپوننت Owner در نظر میگیرید، اون Owner وظیفه آزاد کردن کامپوننت مربوطه رو بر عهده میگیره. اگر Owner کامپوننت شما Form باشه، فرم در زمان آزاد شدن خودش ابتدا کامپوننت هایی که اختیار آنها را داره (یعنی کامپوننت هایی که Owner اشون فرم هست) رو آزاد میکنه، بعد خودش آزاد میشه و نیازی نیست که خودتون یکی یکی کامپوننت های متعلق به فرم را آزاد کنید. حالا اگه Owner کامپوننت شما GroupBox باشه، با آزاد کردن GroupBox، اون کامپوننت هم آزاد میشه و نیازی نیست که خودتون جداگانه آن را آزاد کنید.

jalilmousavi
چهارشنبه 08 اسفند 1386, 17:46 عصر
نه . احتیاجی به حذف کردن Event Handler نیست .با نوشتن یا ننوشتن ClButton1.onclick:=nil;
تفاوتی برای آزاد کردن آبجکت نمیکنه .

در این صورت چرا با اضافه کردن سطر فوق به رویداد کلیک دکمه ، دیگر خطای Access violation نمی دهد؟
من این مورد را عملا تست کردم که آنرا پیشنهاد کردم. در هر حال کدی که توسط kimia1 نوشته شده بود ، موقع اجرا خطا میداد و من با اضافه کردن این سطر از خطا جلو گیری کردم. می توانید کد های مذکور را در دلفی امتحان کنید و نتیجه را ببینید.
البته برنامه نویسی من دیمی است و بیشتر از طریق آزمون و خطا پیش می رود و آنچنان هم اصولی نیست.

Mahyaa
چهارشنبه 08 اسفند 1386, 21:16 عصر
در این صورت چرا با اضافه کردن سطر فوق به رویداد کلیک دکمه ، دیگر خطای Access violation نمی دهد؟
من این مورد را عملا تست کردم که آنرا پیشنهاد کردم. در هر حال کدی که توسط kimia1 نوشته شده بود ، موقع اجرا خطا میداد و من با اضافه کردن این سطر از خطا جلو گیری کردم. می توانید کد های مذکور را در دلفی امتحان کنید و نتیجه را ببینید.



ساختن کنترلها بصورت دینامیک ، کار غیر عادی و پیچیده ای که نیست . تا جاییکه من میدونم و تا به حال دیدم ، آزاد کردن Button که در زمان اجرا ساخته شده ، در OnClick اون نباید Error بده (چه با حذف کردن event handler ، چه بدون اون) مگر اینکه ، اشکالی در روند کار وجود داشته باشه .

kimia1
یک شنبه 12 اسفند 1386, 08:48 صبح
کد نوشته شده در رویداد BtnClick را به صورت زیر تغییر بده مشکلت حل می شود.
ClButton1.onclick:=nil;
ClGrpBox.Free;
ClButton1.Free;

سطری که در اول اضافه شده است ، ارتباط دکمه را با پروسه کلیک دکمه را حذف می کند و در نتیجه خطایی پیش نمی آید.

ممنون از لطفتون ولی من کماکان همون خطا را دریافت میکنم. نمیدونم فرق ایجاد دکمه در زمان Design و RunTime چیه که میشه یک دکمه را که بصورت Design ایجاد شده با کلیک بر روی خودش حذف کرد ولی درحالت Runtime خطا میگیره