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