ورود

View Full Version : حذف یک شی به صورت run time



vahid64
سه شنبه 08 دی 1388, 09:21 صبح
سلام

من در برنامه ام یکسری speedbutton در زمان اجرا می سازم
حالا می خوام اینا رو بازم در زمان اجرا حذف کنم باید چی کار کنم ؟
جستجو های من توی سایت نتیجه ای نداشت

ممنون از همه تون!

Felony
سه شنبه 08 دی 1388, 09:36 صبح
توسط متد Free اون شئ که ساختید میتونید اون شئ رو آزاد کنید ، مثلا : MySpeedButton.Free

vahid64
سه شنبه 08 دی 1388, 09:55 صبح
توسط متد Free اون شئ که ساختید میتونید اون شئ رو آزاد کنید ، مثلا : MySpeedButton.Free


من اینکار رو می کنم ولی Error میده...

http://night-skin.com/upload/images/01908744179346544045.jpg

Felony
سه شنبه 08 دی 1388, 10:04 صبح
همه ی اشیاء رو تو حلقه با هم آزاد میکنید یا ... ؟

یه نمونه کد یا برنامتون رو قرار بدید تا بررسی بشه .

vahid64
سه شنبه 08 دی 1388, 10:26 صبح
for i:=1 to ComponentCount -1 do
begin
if (TSpeedButton(Components[i])).Down then
Components[i].Free;
end;

این نمونه کد من هست اما با این خطا مواجه میشه

ElistError with message 'List Index Out of Bounds (6)'.
اون خطای قبلی برای اجرای exe هست
این خطای کامپایلر هست.

Felony
سه شنبه 08 دی 1388, 10:32 صبح
باید کامپوننت ها رو از آخر به اول بشمارید و حذف کنید ، چون با حذف هر کامپوننت ترتیب Index کامپوننت ها به هم میخوره .


for i:= ComponentCount -1 DownTo 0 do
begin
if (TSpeedButton(Components[i])).Down then
Components[i].Free;
end;

vahid64
سه شنبه 08 دی 1388, 10:39 صبح
بازم Access Violation میده البته اینبار تو یه آدرس دیگه ای از حافظه....

Felony
سه شنبه 08 دی 1388, 10:59 صبح
اگر میتونید برنامتون رو قرار بدید یا یک برنامه در همین رابطه بنویسید و قرار بدید .

vahid64
سه شنبه 08 دی 1388, 13:36 عصر
اینو ضمیمه کردم
اگه به ترتیب از آخر به اوب بیای درست پاک می کنه وگرنه درست کار نمی کنه!!!

AliReza Vafakhah
سه شنبه 08 دی 1388, 13:43 عصر
دوست عزیز من خودم این رو یه تست زدم درست بود

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:Integer;
begin
for i:=Self.ComponentCount-1 downto 0 do
if (Components[i] is TSpeedButton)then
if (Components[i] as TSpeedButton).Down then
(Components[i] as TSpeedButton).free;
end;

Felony
سه شنبه 08 دی 1388, 13:51 عصر
من کد شما رو به این تغییر دادم درست کار میکنه :


for i:=Main.ComponentCount-1 downto 0 do
begin
if (TSpeedButton(Components[i])).Down then
Components[i].Free;
end;

اون Break رو برای چی نوشتید ؟

vahid64
سه شنبه 08 دی 1388, 16:39 عصر
Break رو برای بهبود کد نوشتم چون که مثلاً اولین بار اجرای حلقه آبجکت مورد نظر حذف بشه دفعات بعد حلقه اجرا نشه!

البته من اشتباه کردم Break رو باید داخل if می نوشتم حواسم نبود بیرون نوشتم!
به هر حال اون access violation که صبح می داد حالا بعد از ظهر نمیده!!!منم نمی دونم چرا فقط الان کارم راه افتاده...
مرسی دوست عزیز که کمک کردی موفق باشی