Главная страница
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.022 c
4-35114
Василий Петрович
2003-04-12 22:48
2003.06.12
Не могу обработать нажатие по битмапине


1-34843
V-A-V
2003-05-30 13:12
2003.06.12
Splitter


1-34840
nesterovsky
2003-05-29 13:50
2003.06.12
Почему не прорисовывается ListView на модальной форме?


4-35106
Vitaliy
2003-04-14 05:39
2003.06.12
Работа с реестром


6-34960
Chlavik
2003-04-09 03:12
2003.06.12
Оправка файла