2010-08-06 2 views
4

Можно ли использовать метод интерфейса в качестве обработчиков событий в Delphi 2007? Простые версии не работают:Интерфейсный метод как обработчик событий

type 
    TMyEvent = procedure of object; 

    IMyInterface = interface 
    procedure Handler; 
    end; 

    TMyClass = class(TInterfacedObject, IMyInterface) 
    public 
    procedure Handler; 
    end; 

var 
    ev: TMyEvent; 
    obj: TMyClass; 
    intf: IMyInterface; 
begin 
    obj := TMyClass.Create; 
    intf := obj; 
    ev := obj.Handler; // compiles 
    ev := intf.Handler; // <== Error E2010 (incompatible types) 
end. 

Добавление @ или Addr изменяет ошибку в E2036 (переменная требуется).

Update: Это

procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer); 
type 
    TVtable = array[0..999] of Pointer; 
    PVtable = ^TVtable; 
    PPVtable = ^PVtable; 
begin 
    //QI=0, AddRef=1, Release=2, etc 
    TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo]; 
    TMethod(MethPtr).Data := Pointer(IntRef); 
end; 

var 
    ev: TMyEvent; 
    intf: IMyInterface; 
begin 
    intf := TMyClass.Create; 
    IntRefToMethPtr(intf, ev, 3); 
    ev; 
end. 

работы. Однако я не слишком люблю магию 3.

+0

Сразу после публикации этого я нашел http://blog.barrkel.com/2010/01/using-anonymous-methods-in-method.html и http://sergworks.wordpress.com/2010/07/06/delphi-interfaces-on-binary-level /, которые выглядят многообещающими. –

ответ

2

Более чистым решением является реализация IInterfaceComponentReference или что-то подобное для вашего базового класса и использует это для получения класса ref.

Вышеупомянутый код не будет работать, например. FPC и другие совместимые устройства. Их структура VMT несколько отличается. И даже на Delphi дальнейшее расширение языка может вызвать это.

Идеальное решение состоит в том, чтобы иметь совершенно отдельный «метод» метода methodVar для этого, но мне интересно, стоит ли этого проблемы.

+0

Звучит разумно. Возможно, я изменю это на метод GetHandler вместо GetSelf. Благодаря! –

Смежные вопросы