Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Процедурный тип из интерфеса.   Найти похожие ветки 

 
BasilAKANaiL ©   (2006-11-20 13:51) [0]

Доброе время суток, г-да. Девелоперы.
Возникла следующая проблема, поясню кратким примером:
//---------------------------------------------------
unit ...
interface
type
...
TDelegate1=function (Param1:Type):boolean of object;

ISession=interface(IIntreface)
function Func1(Param1:Type):boolean;
end;

TSession=class (TInterfacedObject, ISession)
function Func1(Param1:Type):boolean;
end;
...
var
Delegate:TDelegate1
aSession:ISession;
implementation
...
aSession:=TSession.Create;
Delegate:=aSession.Func1;
// ^здесь нужно взять процедурную ссылку из интерфеса, но компилятор этого не дает (воспринимая это как вызов функции Func1 - жалуется на отсутсвие параметров)

end.
//---------------------------------------------------
Теоритический можно было бы взять из интерфеса объект через QueryInterface() - с объектом, как раз все работает, но я думаю это лишний код.


 
Eraser ©   (2006-11-20 14:50) [1]

> [0] BasilAKANaiL ©   (20.11.06 13:51)

можно ссылку "выдрать" напрямую из VTBL, вот хорошая статья http://www.rsdn.ru/article/com/qihook.xml
хотя скорее всего есть более простой способ :))


 
Eraser ©   (2006-11-20 14:56) [2]

> [0] BasilAKANaiL ©   (20.11.06 13:51)

стоп-стоп.. на самом деле все проще.. не так вопрос понял ))

> aSession:ISession;

TSession
:)


 
Eraser ©   (2006-11-20 15:00) [3]

или так

> Delegate:=aSession.Func1;

Delegate := TSession(aSession).Func1;


 
BasilAKANaiL ©   (2006-11-20 15:20) [4]

to Eraser
1. Обмен сообщениями в этом проекте в основном завязан на интерфесах? т.к. полиморфичность при этом выше.
В примере aSession:ISession взято намерено.
2. Напрямую выцепить объект из интерфеса по средствам приведения типов не получится - пример
> Delegate := TSession(aSession).Func1;

работать не будет. Я упоминул метод IInterface.QueryInterface - он как раз решает эту проблему, но подход дорогой по быстройдействию.


 
Eraser ©   (2006-11-20 15:26) [5]

> [4] BasilAKANaiL ©   (20.11.06 15:20)


> 1.

да я понял зачем тут именно ISession, так правильнее.

> 2.

а зачем выцеплять объект? вроде требовалось выцепить просто указатель на метод, тогда такой способ должен подойти, т.к. интерфейсы и объекты вроде совместимы.
в крайнем случае решение есть - в той статье описано.
Я немного подзабыл как оно в деталях устроено, но в свое время перехват интерфейсных методов делал, так что в принципе зада решаема.


 
Barloggg   (2006-11-20 15:38) [6]

а собаку поставить?

Delegate:=aSession.Func1;

это действительно вызов

а вот так будет присваивание
Delegate:=@aSession.Func1;

если я правильно помню...


 
Eraser ©   (2006-11-20 15:47) [7]

> [6] Barloggg   (20.11.06 15:38)

не.. с методами такое не прокатывает )


 
BasilAKANaiL ©   (2006-11-20 15:57) [8]

Удалено модератором
Примечание: Выражения выбираем



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

Форум: "Основная";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
15-1166803567
Лёля
2006-12-22 19:06
2007.01.14
Delphi 6 и CodeFolding


15-1166743505
Petr V. Abramov
2006-12-22 02:25
2007.01.14
Работа на страну


6-1155393386
mr. Eof
2006-08-12 18:36
2007.01.14
Удаленное чтение файла


15-1166978969
dzmitry[li]
2006-12-24 19:49
2007.01.14
5.1


15-1166685830
vitv
2006-12-21 10:23
2007.01.14
Визуальное проектирование приложений C#-мнения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский