Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалять динамически создаваемые кнопки? [D6, WinXP]


Mitka ©   (2004-10-21 07:16:00) 

есть динамический массив Button : array of TSpeedButton;
устанавливаю размер  SetLength(Button, cKolichestvo);
создаю элементы массива   Button[P] := TSpeedButton.Create(Game.Panel);
В настройке можно менять cKolichestvo. Для этого удаляю старые, рисую новые.
Удаление:
if Form.Panel.ComponentCount >1 then Form.Panel.DestroyComponents;
 Finalize(Button);
не работает. Invalid pointer operation
В цикле  
for i:=0 to cKolichestvo do
 begin
     Button[i].Destroy;
 end;
выдает Access violation at adress...
что у меня не так?


Mitka   (2004-10-22 04:34:00) [1]

Спасибо всем!


Sandman25   (2004-10-21 11:25:00) [2]

for I := Low(Button) to High(Button) do
begin
 Button[i].Free;
end;


Rem   (2004-10-21 11:08:00) [3]

>>чтоб родитель сам убивал

Уничтожает Owner. Parent является базой для отрисовки.

[4], [5]
FreeAndNil(Button[i]);

Правильное решение - [4]:
for i:=0 to cKolichestvo-1 do


kostan   (2004-10-21 08:17:00) [4]

1)может попробовать при создании
Button[P] := TSpeedButton.Create(self);
Button[P].parent:=form;
чтоб родитель сам убивал
2)
а вооще я правильно понял что после уничтожения элемента в середине не уничтожается следующий:
то тогда  после  Button[i].Destroy;
надо обязательно писать  Button[i]:=nil (после destroy он может быть не nil - это как деструктор сделан);

3)
или как вариант уничтожать элемент индекс=i
(и соответственно смещать построчно элементы массива вверх)


SergP   (2004-10-21 07:56:00) [5]


> for i:=0 to cKolichestvo do
>  begin
>      Button[i].Destroy;
>  end;


Наверное:

for i:=0 to cKolichestvo -1do
 begin
     Button[i].Destroy;
 end;

Да и кстати (к сабжу не отностся) лучше делать

...
Button[i].free;
Button[i]:=nil;
...


Mitka   (2004-10-21 07:53:00) [6]

Ошибку выдает при уничтожении не последнего элемента а третьего(?)
Если элемент массива = nil, то тоже ошибка. Я добавляю строчку   if Button[i]<>nil then Button[i].Destroy;
не помогает.


kostan   (2004-10-21 07:45:00) [7]

наверно так
for i:=cKolichestvo downto 0 do
begin

   if high(Button)=i+1 then
   if (Button[i] is TspeedButton) then
   begin
    Button[i].Destroy;
    setlength(Button,i);
   end;
end;


Думкин   (2004-10-21 07:35:00) [8]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1098286689&n=9


Наверх

Титульная страница Поиск, карта сайта Написать письмо