Вниз
Скачать: CL | DM;

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

← →
Mitka   (2004-10-21 07:16) [0]

есть динамический массив 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...
что у меня не так?


← →
Думкин ©   (2004-10-21 07:35) [1]

http://delphimaster.net/view/9-1098286689/


← →
kostan ©   (2004-10-21 07:45) [2]

наверно так
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;


← →
Mitka   (2004-10-21 07:53) [3]

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


← →
SergP ©   (2004-10-21 07:56) [4]


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


Наверное:

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

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

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


← →
kostan ©   (2004-10-21 08:17) [5]

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

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


← →
Rem ©   (2004-10-21 11:08) [6]

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

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

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

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


← →
Sandman25 ©   (2004-10-21 11:25) [7]

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


← →
Mitka   (2004-10-22 04:34) [8]

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.022 c
6-1093710640
Marex
2004-08-28 20:30
2004.11.07
Как запретить выделение текста WebBrowser?


4-1096791173
ZedeS
2004-10-03 12:12
2004.11.07
блокировка доступа к портам в WinXP


3-1097242611
Aser
2004-10-08 17:36
2004.11.07
Как для Table вызвать значение из другой таблицы, используя одно


4-1096206648
Леонид
2004-09-26 17:50
2004.11.07
Как послать в окно ctrl+L чере sendmessage?


14-1098295193
Diablo_m
2004-10-20 21:59
2004.11.07
Визуализация топологии сети




   Наверх