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

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

Как запретить авто удаление наследнику TInterfacedObject?


Страницы:   1 2

Kolan ©   (2007-12-04 14:31:00) 

Здравствуйте,
 Был у меня синглетон наследник TObject. Понадобилось чтобы он поддерживал интерфейс, сделал наследником TInterfacedObject. Теперь при при передаче его как интерфейса в процедуру, он, по всей видимости удаляется по её завершении.

Вопрос как корректно предотвратить авто удаление?


Skyle   (2007-12-04 15:35:00) [21]

> Kolan ©   (04.12.07 15:33) [13]
Да не видно


Reindeer Moss Eater   (2007-12-04 15:34:00) [22]

После создания экземпляра, просто вызови _AddRef и никто его не убъет кроме тебя самого.


Kolan   (2007-12-04 15:33:00) [23]

Унаследовался от TInterfacedObject'а

Сделал так:

function TStartUpController._AddRef: Integer;
begin
 Result := —1;  {No ref countiong}
end;

function TStartUpController._Release: Integer;
begin
 Result := —1;  {No ref countiong}
end;


Ошибок не насажал?


Kolan   (2007-12-04 15:26:00) [24]


> Унаследуй не от TInterfacedObject, а от TComponent


Да так корректно все, благодарю — решение.


function TComponent._AddRef: Integer;
begin

 if FVCLComObject = nil then
   Result := —1   // —1 indicates no reference counting is taking place
 else
   Result := IVCLComObject(FVCLComObject)._AddRef;

end;


А, Result := —1;…


Kolan   (2007-12-04 15:23:00) [25]


> Если неохота разбираться в отличиях объектных и  интерфейсных
> ссылок.


Как я понимаю са интр ссылками следят и если счетчик становится 0, то объект уничтожается, но как корректно предотвратьть это не пойму.


Игорь Шевченко   (2007-12-04 15:22:00) [26]

Унаследуй не от TInterfacedObject, а от TComponent


Kolan   (2007-12-04 15:22:00) [27]

> Тобой.

Мной лично нет. Следовательно все из-за того, что я его передаю в процедуру:

function TUserLoginForm.ShowLoginDialog(ALogin: string;
 ALoginVisitor: ILoginVisitor): Boolean;
begin
 if Assigned(ALoginVisitor) then
 begin
   FLoginVisitor := ALoginVisitor;
   UserNameEdit.Text := ALogin;
   Result := inherited ShowModal = mrOk;
 end;
end;


Где FLoginVisitor поле класса. А сам этот класс(TUserLoginForm) уничтожается и видимо уничтожает и FLoginVisitor… Как предотвртить?

function TStartUpController._AddRef: Integer;
begin
 FRefCount := —1;
end;

function TStartUpController._Release: Integer;
begin
 FRefCount := —1;
end;  


Меняет ав на инвалид поинтер оперэйшн …


Reindeer Moss Eater   (2007-12-04 15:21:00) [28]

_addref в качестве подпорки. Если неохота разбираться в отличиях объектных и  интерфейсных ссылок.


Skyle   (2007-12-04 15:19:00) [29]


> Kolan ©   (04.12.07 15:15) [6]
> Более нигде он не разрушается.

Тобой.


Kolan   (2007-12-04 15:15:00) [30]

Проблемма в том, что полсе того как я добавил поддержку интерфейса стало вылетать ав при удалении синглетона:
initialization
finalization
StartUpController.Free;


Более нигде он не разрушается.


Kolan   (2007-12-04 14:53:00) [31]

Я понимаю вроде что RefCount := —1 но опасаюсь что это не все что надо…


Kolan   (2007-12-04 14:48:00) [32]

Вот у меня есть коммен Egи по поводу сабжа.

[3] Ega23 ©   (09.11.07 10:34)

> И скопипастиьть их из TInterfacedObject, так?

Это уж как тебе надо. Лично я внутри _AddRef и _Release счётчик сылок в —1 держу, если не хочу, чтобы объект автоматом разрушилсо.
+

[3] MetalFan ©   (04.12.07 14:46)
> ;)


А как это( сылок в —1 держу) сдеать правильно?


MetalFan   (2007-12-04 14:46:00) [33]


> Как интерфейс он мне нужен в одном месте, которое я добавил
> только что.


> плюнуть на TInterfacedObject и самостоятельно реализовать
> методы IUnknown.

;)


Kolan   (2007-12-04 14:38:00) [34]

> Для начала корректно с ним работать как с интерфейсом.


Для начала корректно с ним работать как с интерфейсом.

Как интерфейс он мне нужен в одном месте, которое я добавил только что. Во всех остальных надо оставить старое поведение синглетона.


Skyle   (2007-12-04 14:36:00) [35]

Для начала корректно с ним работать как с интерфейсом.

Можно ещё плюнуть на TInterfacedObject и самостоятельно реализовать методы IUnknown.


Страницы:   1 2

Наверх

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