PDA

View Full Version : حذف شی ایجاد شده هنگام RunTime



mortezahbh
دوشنبه 12 آبان 1393, 11:27 صبح
با سلام

من با کد


lbl := tlabel.create(self);
lbl.parent := self;


چند لیبل در زمان اجرا ایجاد میکنم

حالا میخوام وقتی فرم بسته میشه تمام این لیبل ها رو پاک (free) کنم

میشه لطفا راهنمایی کنید؟؟؟

ممنون

ariopax
دوشنبه 12 آبان 1393, 15:21 عصر
سلام

برای آزادکردن حاقظه اختصاص یافته از متد( free.نام شی ) استفاده کنید

Label1 := TLabel.Create(Self);

وازاد سازی

Label1.Free;

mortezahbh
دوشنبه 12 آبان 1393, 16:26 عصر
دوست عزیز بنده هم میدونم که چطوری یک شی رو آزاد کنم

اما منظورم اینه که وقتی با دستور بالا مثلا 200 تا لیبل ایجاد کردم و به نام اونها دسترسی ندارم چطوری حذفشون کنم؟؟؟؟

یوسف زالی
دوشنبه 12 آبان 1393, 18:09 عصر
وقتی با یک نام به چند شی دسترسی دارید در حقیقت فقط به آخرینشون دسترسی دارید. اون فقط یک پوینتره.
برای این کار بهترین راه اینه که آرایه ای از لیبل ها بگیرید و همه رو بسازید و همه رو هم آزاد کنید.

Felony
یک شنبه 18 آبان 1393, 08:46 صبح
اگر صرفا یکسری لیبل داینامیک هستن و کار خاصی باهاشون ندارید میتونید به صورت زیر آزادشون کنید :


var
I: Integer;
obj: TComponent;
begin
for I := Self.ComponentCount -1 downto 0 do
begin
obj := self.Components[i];
if (obj is TLabel) then
Tlabel(obj).Free;
end;
end;


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


var
I: Integer;
obj: TComponent;
lbl: TLabel;
begin
for I := self.ComponentCount - 1 downto 0 do
begin
obj := self.Components[I];
if (obj is TLabel) then
begin
lbl := TLabel(obj);
if (lbl.Tag = 1) then
lbl.Free;
end;
end;
end;

یوسف زالی
یک شنبه 18 آبان 1393, 12:58 عصر
یه راه دیگش هم اینه که یک شی می سازید، مثلا پنل،بصورت هاید باشه، Owner این پنل رو روی فرم تنظیم می کنید، Parent ش خیلی مهم نیست.
Owner تمام لیبل هاتون رو روی این پنل ست می کنید، Parent رو روی هر چیزی که لازم دارید.
در پایان، فقط با آزاد کردن پنل، همه لیبل های داینامیک آزاد خواهند شد.

اینم یه راه تنبلی خوب!

کد:


var
HostPanel: TPanel;


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
HostPanel := TPanel.Create(Self);


for i := 1 to 10 do
with TLabel.Create(HostPanel) do
begin
Parent := Self;
Left := 10;
Top := i * 20;
Caption := 'Label_' + IntToStr(i);
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
HostPanel.Destroy;
end;