gpt4 book ai didi

delphi - TVirtualInterface 失败,接口(interface)包含 "function of object"属性

转载 作者:行者123 更新时间:2023-12-02 03:33:24 26 4
gpt4 key购买 nike

我有界面:

TOnIntegerValue: function: integer of object;

ITestInterface = interface(IInvokable)
['{54288E63-E6F8-4439-8466-D3D966455B8C}']
function GetOnIntegerValue: TOnIntegerValue;
procedure SetOnIntegerValue(const Value: TOnIntegerValue);
property OnIntegerValue: TOnIntegerValue read GetOnIntegerValue
write SetOnIntegerValue;
end;

在我的测试中我有:

.....
FTestInterface: ITestInterface;
.....

procedure Test_TestInterface.SetUp;
begin
FTestInterface := TVirtualInterface.Create(TypeInfo(ITestInterface)) as ITestInterface;
end;
.....

并得到错误:“范围检查错误”

有什么想法吗?或者 TVirtualInterface 不支持“对象函数”和“对象过程”类型?谢谢!!

最佳答案

看起来TVirtualInterface可以很好地处理方法指针,但不喜欢属性。下面是一个用于演示的快速示例:

{$APPTYPE CONSOLE}

uses
SysUtils, Rtti;

type
TIntegerFunc = function: integer of object;

IMyInterface = interface(IInvokable)
['{8ACA4ABC-90B1-44CA-B25B-34417859D911}']
function GetValue: TIntegerFunc;
// property Value: TIntegerFunc read GetValue; // fails with range error
end;

TMyClass = class
class function GetValue: Integer;
end;

class function TMyClass.GetValue: Integer;
begin
Result := 666;
end;

procedure Invoke(Method: TRttiMethod; const Args: TArray<TValue>; out Result: TValue);
begin
Writeln(Method.ToString);
Result := TValue.From<TIntegerFunc>(TMyClass.GetValue);
end;

var
Intf: IMyInterface;

begin
Intf := TVirtualInterface.Create(TypeInfo(IMyInterface), Invoke) as IMyInterface;
Writeln(Intf.GetValue()); // works fine
// Writeln(Intf.Value()); // fails with range error
Readln;
end.

该程序按预期工作。然而,取消对该属性的注释就足以使其失败。这显然是一个 RTTI 错误。我认为除了 Embarcadero 之外,没有任何人可以解决这个问题。

看起来问题在于类型为方法指针的属性的组合。解决方法是避免此类属性。我建议你提交一份QC报告。此答案中的代码正是您所需要的。

关于delphi - TVirtualInterface 失败,接口(interface)包含 "function of object"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15387192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com