Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Вниздинамически создаваемые объекты как их удалить? Найти похожие ветки
← →
Aleks (2009-12-11 01:08) [0]Доброго времени суток, Мастера подскажите, как удалить созданные мной объекты(панели в данном случае), перед новым их созданием.
Дело в том, что эти панели у меня создаются динамически, загружается список, в зависимости от того куда нажал пользователь, и по списку создаются панели, списки всегда разные, создаётся от 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;
← →
Плохиш © (2009-12-11 01:33) [1]
> динамически создаваемые объекты как их удалить?
Методом Free.
← →
KilkennyCat © (2009-12-11 02:17) [2]предварительно проверив.
← →
Германн © (2009-12-11 02:32) [3]А чтобы предварительная проверка работала правильно удалять надо методом FreeAndNil.
Автор. А задачу свою ты сказать обычными словами можешь?
← →
Aleks (2009-12-11 02:54) [4]Попробую :)
Создаётся несколько панелей
For i:=0 to StrToInt(Edit2.text) do // Edit.Text=12 например
Begin
b:=TPanel.Create(Panel1);
.....
End;
ВОПРОС Как удалить все 12 панелей.
Пробовал
b.Free;
Удаляется только последняя из созданных панелей
← →
Германн © (2009-12-11 03:04) [5]
> Aleks (11.12.09 02:54) [4]
>
> Попробую :)
Хреново пробуешь. Читай учебник.
← →
Aleks (2009-12-11 03:58) [6]Удалено модератором
← →
KilkennyCat © (2009-12-11 04:05) [7]
> Удаляется только последняя из созданных панелей
разумеется. b ибо адресуешься к последней. или ты надеешься, что одна переменная помнит все присваивания себе за свою жизнь? только последнее.
Из чего получаем два варианта:
1) создаем массив и играемся с ним (то есть заменяем переменную b массивом).
соответсвенно, как в цикле создавали, так в цикле и убиваем.
2) зная систему имен (panel1, panel2..panelX) иш\щем и убиваем по именам (изучаем TFindComponent)
← →
sniknik © (2009-12-11 08:09) [8]3) создавая присваиваем свой идентификактор каждому в tag, после сравниваем и "убиваем" если совпал.
4) зная что имя вообще то не обязательный параметр, не присваиваем его созданным панелям и в дальнейшем ориентируемся по пустому имени.
5) зная, что например все созданные нами это панели, и "лежат" они на чемто, и что больше именно панелей на нем нет, удаляем по типу, а ищем их на паренте (чёмто. или сравниваем с ним.)
6) удаляем парента, со всем что на нем, "невзирая на лица".
7) ...
вариантов в общем дофига, использовать лучше конечно то, что лучше подходит к конкретной задаче (что будет проще, а то начнешь городить систему идентификаторов/массивов, а это и не нужно совсем). жаль только автор вместо того чтобы нормально осветить задачу начал "умничать" в ответ...
← →
Kyn66 © (2009-12-11 09:03) [9]Удаляй через FindComponent или как вариант уничтожить общего родителя.
← →
icWasya © (2009-12-11 11:01) [10]можно ещё так
на форме создаём приватное поле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);
← →
Aleks (2009-12-11 12:29) [11]Спасибо всем, за варианты решений.
Уничтожить общего родителя. Намного проще и быстрее.
Всё пролучилось.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c