Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
14-1090648539
STALKER
2004-07-24 09:55
2004.08.08
Всем привет!Как в XP запустить ScanDisk?


3-1089608096
DENpro
2004-07-12 08:54
2004.08.08
BackUp Interbase


14-1090409056
ййй
2004-07-21 15:24
2004.08.08
PHP NUKE


14-1090524534
Murkt
2004-07-22 23:28
2004.08.08
Аниме


8-1084825661
init13
2004-05-18 00:27
2004.08.08
OpenGL. (GLScene) Текст - в - 3d объект




   Наверх