![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запретить авто удаление наследнику TInterfacedObject?
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.