![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалять динамически создаваемые кнопки? [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