Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Уничтожение всех объектов данного класса   Найти похожие ветки 

 
Jaxtor ©   (2004-07-23 10:58) [0]

Господа мастера!
Помогите, пожалуйста!
Возможно ли с помощью одной процедуры или функции уничтожить все объекты данного класса?


 
begin...end ©   (2004-07-23 11:01) [1]

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


 
Sergey Kaminski ©   (2004-07-23 11:03) [2]

О том, чтобы это было возможно, нужно позаботится на этапе создания этих объектов.


 
Jaxtor ©   (2004-07-23 11:03) [3]

>begin...end ©   (23.07.04 11:01) [1]
Спасибо.


 
han_malign ©   (2004-07-23 11:04) [4]

Только если это TComponent, в принципе...- если у него/их Owner нормальный...
Либо в Create объекта есть занесение его в глобальный список(и, соотвенственно, в Destroy - "вынесение"), к которому есть доступ из этой "одной процедуры или функции"...(для списка - в аккурат TObjectList)


 
Jaxtor ©   (2004-07-23 11:09) [5]

Нет, у меня потомок от TObject.


 
Sergey Kaminski ©   (2004-07-23 11:15) [6]

Jaxtor ©   (23.07.04 11:09) [5]

Тогда только занесением в список при создании


 
Jaxtor ©   (2004-07-23 11:17) [7]

>Sergey Kaminski ©   (23.07.04 11:15) [6]
Класса TList, например?


 
ЮЮ ©   (2004-07-23 11:23) [8]

TObjectList,будет проще. Достаточно Create(true), тогда для удаления всего списка просто Clear


 
Anatoly Podgoretsky ©   (2004-07-23 11:24) [9]

Jaxtor ©   (23.07.04 11:17) [7]
[4]


 
Анонимщик ©   (2004-07-23 11:25) [10]

Усложним задачу. Пусть дано требование ни в какие списки никаких указателей не вносить. Тогда есть решение?


 
Jaxtor ©   (2004-07-23 11:32) [11]

>Анонимщик ©   (23.07.04 11:25) [10]
У меня как раз в список заносятся указатели! Я просто хочу очистить дерево.


 
Sergey Kaminski ©   (2004-07-23 11:35) [12]

Так в чем проблема-то?


 
han_malign ©   (2004-07-23 11:36) [13]

примерно так
...............
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, если совпадает, вычислять адрес экземпляра и освобождать - но это из серии "искать приключений на свою задницу" - для законченных садомазохистов...


 
Anatoly Podgoretsky ©   (2004-07-23 11:37) [14]

Анонимщик ©   (23.07.04 11:25) [10]
Если owner/parent у наследника нет то нет


 
han_malign ©   (2004-07-23 11:38) [15]

>У меня как раз в список заносятся указатели! Я просто хочу очистить дерево.
- дык, что - проблема по дереву пробежаться?

З.Ы. В этом случае, мой предыдущий выстрел - в молоко...



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

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.124 c
1-1090434297
GanibalLector
2004-07-21 22:24
2004.08.08
ШТРИХ-КОД


14-1090288714
Думкин
2004-07-20 05:58
2004.08.08
С днем рождения! 20 июля


14-1090516638
хм
2004-07-22 21:17
2004.08.08
приму участие


3-1089902181
Leech
2004-07-15 18:36
2004.08.08
SQL запрос на Paradox


3-1089956277
agent007
2004-07-16 09:37
2004.08.08
Как прикрутить ADO.NET провайдер к Delphi 8 ?