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

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

Динамические объекты [D6, Win2k]


Страницы:   1 2

Turalyon ©   (2002-01-15 09:44:00) 

Привет, Всем.

Есть такая проблемма при работе с динамическими объектами. Есть некая форма на которой в зависимости от действий пользователя создаются несколько кнопочек (TSpeedButton для удобства). Прежде чем их создавать я уничтожаю уже созданные ранее делаю все примерно так.

NumButton - количество созданых кнопок.
NewNumButton - колчество кнопок, которые надо сделать.


Var
BA : array [1..50] of TSpeedButton;
...

for i := 1 to NumButton do (BA[i] as TSpeedButton).Free;

...

for i := 1 to NewNumButton do
begin
BA[i] := TSpeedButton.Create(nil)
...
BA[i].Parent := Form1;
end;



Так вот проблемма в том что прога без конца вылетает с "Access violation at adress ...". Причем без какой либо видимой закономерности... то все делает нормально, то глючит. (Хотя небольшая есть - если новое количество кнопок меньше старого то вероятность больше). Если убрать сточку где удаляются старые кнопки - то все работает. Помогите плз...


Turalyon   (2002-01-15 11:07:00) [21]

2 Alx2
Попробовал переделать параметр Create на Self то же самое.
А код очень громоздкий... боюсь его никто и читать не возмется...


Turalyon   (2002-01-15 10:58:00) [22]

2 Владислав
Поподробнее пожалуста. Просто тот способ, который я реализовал был первый пример который я нашел... Я раньше не работал с динамическими объектами.


Владислав   (2002-01-15 10:57:00) [23]

> Alx2 © (15.01.02 10:53)

то уничтожать эти батоны будет Self в собственном деструкторе

Так оно и замечательно! Не нужно ничего своего изобретать! Уже все есть!


Alx2   (2002-01-15 10:53:00) [24]

Дело в том, что нагадить прога могла раньше. А аукается сейчас...
Если в параметр конструктору Create передавать не Nil, а, например, Self, или кого-то еще, то уничтожать эти батоны будет Self в собственном деструкторе, или кто-то еще (если не перекроешь, конечно).


Владислав   (2002-01-15 10:51:00) [25]

> Turalyon © (15.01.02 10:48)
Зачем ты используешь собственный массив?
Это уже реализовано в VCL.


Turalyon   (2002-01-15 10:48:00) [26]

Она ошибку выдает, когда уже вся процедура закончилась, уже ничего делать не должна, в смысле должна ждать от пользователя его действий...


Alx2   (2002-01-15 10:45:00) [27]

Код бы поподробнее посмотреть...


Turalyon   (2002-01-15 10:33:00) [28]

2MBo
это я просто уже как только не извращялся пытаясь грабли найти... думал, что может она некорректно понимает тип объекта, по этому его удаляет криво - вот и поставил явное указание.

2Panov
Все равно хандрит... но у меня появилось ощущение, что не это не совсем там...

Может такое быть, что он не успев их всех удалить начинает создавать новые????


Владислав   (2002-01-15 10:27:00) [29]

Создание:
for i:=0 to NewNumButton do
with TSpeedButton.Create(self) do
Parent:=Self


Владислав   (2002-01-15 10:24:00) [30]

Уничтожение:
for i:=ComponentCount-1 downto 0 do
if Components[i] is TSpeedButton then
TSpeedButton(Components[i]).Free


MBo   (2002-01-15 10:09:00) [31]

>про массив я не понял - что ты хотел сказать
что BA[i] - уже объект типа TSpeedButton


panov   (2002-01-15 10:05:00) [32]

"Free работает корректно даже если объект - nil"
А с чего ты взял, что у тебя ссылка на объект nil?

Var
BA : array [1..50] of TSpeedButton;
...

for i := 1 to NumButton do
begin
if Assigned(BA[i]) then TSpeedButton(BA[i]).Free;
BA[i] := nil;
end;

...

NumButton := NewNumButton;

for i := 1 to NewNumButton do
begin
BA[i] := TSpeedButton.Create(nil)
...
BA[i].Parent := Form1;
end;




Turalyon   (2002-01-15 09:56:00) [33]

Забыл дописать строку кода перед циклом for

NumButton := NewNumButton;

А вообще в хелпе написано, что метод Free работает корректно даже если объект - nil в смысле не создан, а вот Destroy ругается. Я пробовал и с деструктором работать - та же петрушка...

А про массив я не понял - что ты хотел сказать???


MBo   (2002-01-15 09:50:00) [34]

скорее всего, ты пытаешься уничтожить больше кнопок, чем создавал- подозрения есть, т.к. счетчики разные -NumButton и NewNumButton.
И ни к чему приводить тип- у тебя же и так
array[] of TSpeedButton


Страницы:   1 2

Наверх

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