Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-34793
Mik
2003-05-29 11:43
2003.06.12
Минимизация формы SDI-приложения


9-34661
[Baradoo]
2003-01-05 20:21
2003.06.12
Как сделать редактор карт типа как В Heroes III?


3-34760
Игорь Ч
2003-05-25 07:45
2003.06.12
Как перемещаться по DBGrid не изменяя положения курсора?


4-35128
Great_Lesh
2003-04-13 07:20
2003.06.12
Запуск файла/процесса от имени другого пользователя


1-34802
Hooch
2003-06-02 14:08
2003.06.12
MDIChild





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский