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

Вниз

Singleton и интерфейсы   Найти похожие ветки 

 
Ш-К   (2006-10-12 16:37) [0]

Вот здесь есть пример реализации Singleton-а:
http://www.skybound.nl/articles/delphi-singleton/

Я могу переделать
TssSingleton = class(TInterfacedObject) , вместо
TssSingleton = class(TObject) как в коде.

Почему вызывается ошибка в CleanupInstances:
procedure CleanupInstances;
var
 i: integer;
begin
 for i := instances.Count-1 downto 0 do begin
   if PssSingletonInstance(instances.Objects[i])^.refcount > 1 then begin
     PssSingletonInstance(instances.Objects[i]).instance.Free; //<--здесь
     if (i <= instances.Count) then begin
       Dispose(PssSingletonInstance(instances.Objects[i]));
       instances.Delete(i);
     end;
   end
   else
     PssSingletonInstance(instances.Objects[i]).instance.Free;
 end;
end;


Объясните, пожайлуста, почему ошибка и как выйти из ситуации.
Очень нужно, чтобы наследники TssSingleton реализовывали интерфейсы.


 
clickmaker ©   (2006-10-12 17:00) [1]


> PssSingletonInstance(instances.Objects[i]).instance.Free;

что за ошибка-то? AV?
Значит нету там instance


 
Ш-К   (2006-10-12 17:03) [2]

clickmaker ©   (12.10.06 17:00) [1]

пишет Invalid pointer operator
А деструкторов instance я не ловлю.


 
clickmaker ©   (2006-10-12 17:09) [3]

а PssSingletonInstance - это что-то типа ^TssSingletonInstance?
Можно же прямо приводить, без указателей


 
Ш-К   (2006-10-12 17:19) [4]

PssSingletonInstance = ^TssSingletonInstance;
 TssSingletonInstance = record
   refcount: Cardinal;
   instance: TObject;
 end;

Это не мой код, это код, который я взял здесь:
http://www.skybound.nl/articles/delphi-singleton/


 
clickmaker ©   (2006-10-12 17:31) [5]

скорей всего, Dispose в какой-то момент натыкается на пустой или недействительный указатель.
Отлаживать надо


 
Ш-К   (2006-10-12 17:43) [6]

Ошибка возникает при попытке вызова кода из дестректуктора у потомков Singleton-а. Если объект уже не существует, как же деструктор до этого вызывался?


 
Ш-К   (2006-10-12 17:53) [7]

Ура, нашел!
Вот как решилась проблема:

interface

type
 TssSingleton= class(TInterfacedObject)
 public
   procedure BeforeDestruction; override;
 end;

implementation

procedure TssSingleton.BeforeDestruction;
begin
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.052 c
11-1139596592
rainstuff
2006-02-10 21:36
2006.11.26
MHTrackBar не работает в новых версиях KOL:(


1-1160739074
Vladix
2006-10-13 15:31
2006.11.26
При максимизации MDI нужно чтобы оно оставалось в виде окна


15-1162648684
Колдун
2006-11-04 16:58
2006.11.26
Нужна схема


2-1162873515
Gex88
2006-11-07 07:25
2006.11.26
Два слова в одном тексте


1-1160995519
vegarulez
2006-10-16 14:45
2006.11.26
Народ, подскажите компоненту для обмена по протоколу HTTPS.