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

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

Уничтожение всех объектов данного класса [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]

Стандартной нету, ИМХО. Но можно и самому написать.


Наверх

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