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

Вниз

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

 
klyonov   (2003-06-02 09:09) [0]

Привет всем.
Вопросов несколько:
1. Если я описал интерфейс и хочу реализовать его в классе, обязательно ли мне делать из него объект СОМ? Может, я не очень корректно пишу, смысл такой: я описал класс, реализовал в нем интерфейс, и дальше использую этот класс как обычно, безо всяких фабрик классов и прочего.
2. Если я получаю ссылку на интерфейс класса (такого, как в первом вопросе) через GetInterface надо ли потом как-либо освобождать переменные интерфейсов?
3. Можно ли перекомпилировать VCL? В смысле добавить, например, в TControl кучу своих свойств и методов так, чтобы вся остальная иерархия от него их унаследовала?
Вопросы появились из-за того, что как только я ввел такие классы с интерфейсами, все вроде хорошо, только иногда Delphi вылетает с исключением где-то в своих недрах.


 
Digitman ©   (2003-06-02 09:19) [1]

1. Необязательно.
2. Время жизни ссылки на интерфейс равно времени жизни интерфейсной переменной.
3. Можно. Но не нужно.


 
Ihor Osov'yak ©   (2003-06-02 09:26) [2]

в дополнение

> 2. Время жизни ссылки на интерфейс равно времени жизни интерфейсной переменной.

Компилятор делфи генерирует код по освобождению интерфейса при уходе соотв. переменной из области видимости - вызов _release..


 
VaS ©   (2003-06-02 09:43) [3]

И не смешивай объектные и интерфейсные ссылки. Пример:


TMy = class(TInterfacedObject, IMy)
...
end;

procedure Proc(MyIntf: IMy);
begin
//work with MyIntf
end;

var
MyIntf: IMy;
MyObj: TMy;
begin
MyObj := TMy.Create;
Proc(MyObj);
//а вот тут объект уже уничтожен
MyObj.AnyProc(); //ошибка
end;


Проблемка решается объявлением procedure Proc(const MyIntf: IMy) либо procedure Proc(var MyIntf: IMy). Либо MyObj._AddRef сразу после создания объекта. А еще лучше - MyIntf := TMy.Create и т.д.



 
Dimka Maslov ©   (2003-06-02 09:45) [4]

Delphi вылетает с исключениями в своих недрах по причине того, что объект, в котором реализован интерфейс уже уничтожен, а переменные, ссылающийся на интерфейс, существуют. При выходе из области видимости переменной неявным образом вызывается метод Release, что и приводит исключению. Метод борьбы: вручную обнулять все ссылки на интерфейсы, до того как объект будет уничтожен.


 
Goffman ©   (2003-06-02 09:48) [5]

Радикальное решение: если не нужен подсчет ссылок, то в качестве средства от геммороя можно заглушить AddRef и Release



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

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

Наверх




Память: 0.47 MB
Время: 0.015 c
14-35058
Тумар
2003-05-16 18:10
2003.06.12
---|Ветка была без названия|---


1-34844
alvr
2003-05-30 15:23
2003.06.12
Как получить адрес почтового ящика по умолчанию из MS Outlook ?


14-34995
Vitas2
2003-05-26 13:19
2003.06.12
SQL


8-34934
Dostoevskiy
2003-03-02 09:38
2003.06.12
Получение RBG из pixel a.


3-34692
Marat111
2003-05-22 15:23
2003.06.12
Получить оповещение от базы