Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизПро интерфейсы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c