Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

динамически создаваемые объекты как их удалить?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
15-1259743192
desc
2009-12-02 11:39
2010.02.07
PHP скрипт


2-1260429916
Danco
2009-12-10 10:25
2010.02.07
Функция Translite


2-1260621639
Aleks
2009-12-12 15:40
2010.02.07
Сротировка списка в Memo


15-1259933827
Insor
2009-12-04 16:37
2010.02.07
Где взять компонент TrxTrayIcon отдельно только его?


15-1259694967
Rouse_
2009-12-01 22:16
2010.02.07
Что-то давненько на знак кандидатов назначено небыло