![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамически создаваемые объекты как их удалить? [D7]
Aleks © (2009-12-11 01:08:00)Доброго времени суток, Мастера подскажите, как удалить созданные мной объекты(панели в данном случае), перед новым их созданием.
Дело в том, что эти панели у меня создаются динамически, загружается список, в зависимости от того куда нажал пользователь, и по списку создаются панели, списки всегда разные, создаётся от 0 до 50 панелей.
Проблема:
Eсли было 20 панелей, а потом грузится список где всего 10, то нижние 10 остаются от старого списка.
Вот код который я использую:
procedure TForm1.clik1(Sender: TObject);
var
Panel:TPanel;
i,x,y,a:Integer;
begin
Memo1.Lines.LoadFromFile('c:\Text.txt');
x:=0;
y:=25;
a:=25;
For i:=0 to StrToInt(Edit2.text) do
Begin
If y>=(TabControl1.Height-(Panel.Height+a)) Then
BEGIN
y:=25;
Inc(x,400);
End;
Panel:= TPanel.Create(self);
Panel.Parent := TabControl1;
Panel.Left :=x;
Panel.Top :=y; Panel.Caption:=Copy(Memo1.Lines.Strings[i],0,(Pos(':',Memo1.Lines.Strings[i])1)) ;
Panel.Width :=150;
Panel.Height:=20;
Panel.OnClick:=Form1.clik;
Panel.BevelInner:=bvLowered;
Panel.Alignment:=taLeftJustify;
Inc(y,20);
End;
end;
Aleks (2009-12-11 12:29:00) [1]Спасибо всем, за варианты решений.
Уничтожить общего родителя. Намного проще и быстрее.
Всё пролучилось.
icWasya (2009-12-11 11:01:00) [2]можно ещё так
на форме создаём приватное поле
type TForm1=class(TForm)
....
private
PanelOwner : TComponent;
...
end;
затем в процедуре создания вместо
Panel:= TPanel.Create(self);
делаем
if not Assigned(PanelOwner) PanelOwner :=TComponent.Create(Self);
Panel:= TPanel.Create(PanelOwner);
и уничтожаем одним движением
FreeAndNil(PanelOwner);
Kyn66 (2009-12-11 09:03:00) [3]Удаляй через FindComponent или как вариант уничтожить общего родителя.
sniknik (2009-12-11 08:09:00) [4]3) создавая присваиваем свой идентификактор каждому в tag, после сравниваем и "убиваем" если совпал.
4) зная что имя вообще то не обязательный параметр, не присваиваем его созданным панелям и в дальнейшем ориентируемся по пустому имени.
5) зная, что например все созданные нами это панели, и "лежат" они на чемто, и что больше именно панелей на нем нет, удаляем по типу, а ищем их на паренте (чёмто. или сравниваем с ним.)
6) удаляем парента, со всем что на нем, "невзирая на лица".
7) ...
вариантов в общем дофига, использовать лучше конечно то, что лучше подходит к конкретной задаче (что будет проще, а то начнешь городить систему идентификаторов/массивов, а это и не нужно совсем). жаль только автор вместо того чтобы нормально осветить задачу начал "умничать" в ответ...
KilkennyCat (2009-12-11 04:05:00) [5]
> Удаляется только последняя из созданных панелей
разумеется. b ибо адресуешься к последней. или ты надеешься, что одна переменная помнит все присваивания себе за свою жизнь? только последнее.
Из чего получаем два варианта:
1) создаем массив и играемся с ним (то есть заменяем переменную b массивом).
соответсвенно, как в цикле создавали, так в цикле и убиваем.
2) зная систему имен (panel1, panel2..panelX) иш\щем и убиваем по именам (изучаем TFindComponent)
Aleks (2009-12-11 03:58:00) [6]Удалено модератором
Германн (2009-12-11 03:04:00) [7]
> Aleks (11.12.09 02:54) [4]
>
> Попробую :)
Хреново пробуешь. Читай учебник.
Aleks (2009-12-11 02:54:00) [8]Попробую :)
Создаётся несколько панелей
For i:=0 to StrToInt(Edit2.text) do // Edit.Text=12 например
Begin
b:=TPanel.Create(Panel1);
.....
End;
ВОПРОС Как удалить все 12 панелей.
Пробовал
b.Free;
Удаляется только последняя из созданных панелей
Германн (2009-12-11 02:32:00) [9]А чтобы предварительная проверка работала правильно удалять надо методом FreeAndNil.
Автор. А задачу свою ты сказать обычными словами можешь?
KilkennyCat (2009-12-11 02:17:00) [10]предварительно проверив.
Плохиш (2009-12-11 01:33:00) [11]
> динамически создаваемые объекты как их удалить?
Методом Free.