![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение всех объектов данного класса [D6, Win2k]
Jaxtor © (2004-07-23 10:58:00)Господа мастера!
Помогите, пожалуйста!
Возможно ли с помощью одной процедуры или функции уничтожить все объекты данного класса?
han_malign (2004-07-23 11:38:00) [1]> У меня как раз в список заносятся указатели! Я просто хочу очистить дерево.
- дык, что - проблема по дереву пробежаться?
З.Ы. В этом случае, мой предыдущий выстрел - в молоко...
Anatoly Podgoretsky (2004-07-23 11:37:00) [2]Анонимщик © (23.07.04 11:25) [10]
Если owner/parent у наследника нет то нет
han_malign (2004-07-23 11:36:00) [3]примерно так
...............
procedure DestroyAll;
implementation
var pObjects: TObjectList= nil;
procedure DestroyAll;
begin
if(pObjects<>nil)then //на всякий случай
while(pObjects.Count>0)do pObjects[pObjects.Count-1].Free;{объект сам удаляет себя из списка}
end;
..........
constructur TMyObject.Create;
begin
inherited;
..........
if(pObjects<>nil)then pObject.Add(self);
end;
destructor TMyObjects.Destroy;
begin
if(pObjects<>nil)then pObjects.Remove(self);
..............
inherited;
end;
........
initialization
pObjects:=TObjectList.Create;
pObjects.OwnsObjects:=false;
finalization
DestroyAll;
pObjects.Free;
end.
- в pObjects[pObjects.Count-1].Free - индекс (pObjects.Count-1) используется для того, чтобы не делались Move (если удалять pObjects[0].Free - то каждый раз будет Move(Items[1],Items[0],(Count-1)*sizeof(Items[0])))
> Усложним задачу. Пусть дано требование ни в какие списки никаких указателей не вносить. Тогда есть решение?
- искать в куче выделенные блоки памяти, проверять InstanceSize и адрес VMT, если совпадает, вычислять адрес экземпляра и освобождать - но это из серии "искать приключений на свою задницу" - для законченных садомазохистов...
Sergey Kaminski (2004-07-23 11:35:00) [4]Так в чем проблема-то?
Jaxtor (2004-07-23 11:32:00) [5]>Анонимщик © (23.07.04 11:25) [10]
У меня как раз в список заносятся указатели! Я просто хочу очистить дерево.
Анонимщик (2004-07-23 11:25:00) [6]Усложним задачу. Пусть дано требование ни в какие списки никаких указателей не вносить. Тогда есть решение?
Anatoly Podgoretsky (2004-07-23 11:24:00) [7]Jaxtor © (23.07.04 11:17) [7]
[4]
ЮЮ (2004-07-23 11:23:00) [8]TObjectList,будет проще. Достаточно Create(true), тогда для удаления всего списка просто Clear
Jaxtor (2004-07-23 11:17:00) [9]>Sergey Kaminski © (23.07.04 11:15) [6]
Класса TList, например?
Sergey Kaminski (2004-07-23 11:15:00) [10]Jaxtor © (23.07.04 11:09) [5]
Тогда только занесением в список при создании
Jaxtor (2004-07-23 11:09:00) [11]Нет, у меня потомок от TObject.
han_malign (2004-07-23 11:04:00) [12]Только если это TComponent, в принципе...- если у него/их Owner нормальный...
Либо в Create объекта есть занесение его в глобальный список(и, соотвенственно, в Destroy - "вынесение"), к которому есть доступ из этой "одной процедуры или функции"...(для списка - в аккурат TObjectList)
Sergey Kaminski (2004-07-23 11:03:00) [13]О том, чтобы это было возможно, нужно позаботится на этапе создания этих объектов.
Jaxtor (2004-07-23 11:03:00) [14]>begin...end © (23.07.04 11:01) [1]
Спасибо.
begin...end (2004-07-23 11:01:00) [15]Стандартной нету, ИМХО. Но можно и самому написать.