2013-08-27 6 views
1

Я заметил странную ошибку с классом TVirtualInterface. Я пытался что-то вроде следующего:TVirtualInterface вызывает неправильное событие invoke

ITest1 = interface 
    procedure Test1(); 
End; 

ITest2 = Interface(ITest1) 
    procedure Test2(); 
End; 

ITest3 = Interface(ITest2) 
    procedure Test3(); 
ENd; 

procedure Test(); 
var 
    test : ITest3; 
begin 
    test := TVirtualInterface(TypeInfo(ITest3), 
     procedure(Method: TRttiMethod; 
      const Args: TArray<TValue>; out Result: TValue) 
     begin 
      showMessage(Method.Name); 
     end) as ITest3; 

    test.test1(); 
    test.test2(); 
    test.test3(); 
End; 

Код выше работает отлично. Если я изменить это так:

ITest3 = Interface(ITest2) 
    procedure Test3(); 
    function GetLabel : string; 
    property Label : string read GetLabel; 
ENd; 

и я называю:

showmessage(test.Label); 

... он все еще работает.

Но если я переведу это свойство в ITest2 или ITest1, вызовы некоторых методов из ITest1, ITest2 или ITest3 вызовут неправильный метод (например, test.Test2() отобразит «Test3»), либо сбой (нарушение доступа).

Любые объяснения и/или исправление на это?

Edit >> К сожалению, на самом деле это на самом деле, кажется, не в состоянии только со свойствами вида:

property Item[Name : string] : X read GetX write SetX; 

ответ

2

Это ошибка i п Delphi XE3 компилятор и фиксируется в xe4

Fix list for RAD Studio XE4 104613 TVirtualInterface: TRttiMethod для индексированного свойства в интерфейсах

+1

Хорошо, спасибо. Слишком плохо, у меня нет XE4 ... Мне придется работать, не используя эту функцию ... – John5

0

вы пробовали наследуя интерфейс от IInvokable и обеспечить их GUID, как в Embarcadero example

Моя догадка есть некоторые проблемы с интерфейсом RTTI, если он не унаследован от IInvokable

+0

Да, на самом деле я упростил свой код, но все мои интерфейсы имеют GUID. Кроме того, IInvokable делает не что иное, как просто публиковать информацию rtti, используя {$ M +} – John5