Главная страница
    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.012 c
2-1166788327
Kostafey
2006-12-22 14:52
2007.01.14
Сложный SQL-запрос


2-1166737977
lluha
2006-12-22 00:52
2007.01.14
DBGrid


2-1166636937
olevacho_
2006-12-20 20:48
2007.01.14
проблемма с rediobutton-ами


15-1166687290
Pazitron_Brain
2006-12-21 10:48
2007.01.14
Дом-страница


1-1163990576
kernel
2006-11-20 05:42
2007.01.14
ShellListView&Multiselect





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