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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
2-1166641009
Серый
2006-12-20 21:56
2007.01.14
stringGrid


15-1166474896
Piter
2006-12-18 23:48
2007.01.14
Лишение прав за вождение в пьяном виде


15-1167118313
pavel_guzhanov
2006-12-26 10:31
2007.01.14
Чем можно просмотреть файлы с расширением .fpt?


15-1166536538
Torry
2006-12-19 16:55
2007.01.14
Тем, кто знал Торри (собаку) лично


15-1165762396
Real
2006-12-10 17:53
2007.01.14
Гонщик серебряной мечты - скачать, купить, заказать...