gpt4 book ai didi

delphi - RTTI和变量开放数组参数

转载 作者:行者123 更新时间:2023-12-03 18:41:00 27 4
gpt4 key购买 nike

与问题TVirtualMethodInterceptor.Create doesn't support the class that has overload virtual method.有关。修改RRUZ的答案后,我遇到了另一个问题。
我应该如何调用第二个重载方法“ SaveLog(str:string; Args:TConst数组);” 。
如下代码

type

TConst = array of TVarRec;

TLog = class
public
constructor Create();

procedure SaveLog(str: string); overload; virtual;
procedure SaveLog(str: string; Args: TConst); overload; virtual;
end;

constructor TLog.Create(str: string);
begin

end;

procedure TLog.SaveLog(str: string);
begin
MessageBox(GetFocus(), PChar(str), 'Test Message', MB_OK);
end;

procedure TLog.SaveLog(str: string; Args: TConst);
var
buf: string;

begin
buf:=Format(str, Args);
SaveLog(buf);
end;


procedure MyTest(nID: Integer);
var
ttt: TLog;
vmi: TVirtualMethodInterceptor;

begin
ttt:=TLog.Create();
try
ttt.SaveLog('ID = %d', [nID]);
vmi:=TVirtualMethodInterceptor.Create(ttt.ClassType);
try
//
finally
vmi.Free();
end;
finally
ttt.Free();
end;
end;


代码“ ttt.SaveLog('ID =%d',[nID]);”将得到
编译器错误:E2250没有可使用这些参数调用的'SaveLog'重载版本。
我应该怎么做 ?

最佳答案

Args参数是一个动态数组。创建并填充动态数组并将其传递。

您的代码无法编译,因为您尝试传递开放数组构造函数。如果您有一个开放数组,那将是有效的,但是您没有。您有一个动态数组。

您可能会使用的一个有用技巧是定义一个函数,该函数接受一个变体开放数组并返回一个动态数组。然后,您可以使一个适应另一个内联。该函数将这样声明:

function VariantOpenArrayToDynArray(const Args: array of const): TArray<TVarRec>;


请注意,我更喜欢使用通用动态数组 TArray<T>代替您的 TConst。这样做具有更好的类型兼容性的好处。

Rudy Velthuis对此进行了详细介绍,并在本文中介绍了如何实现适配器功能: Open array parameters and array of const



就是说, TVarRec并非为显式使用而设计。它是对各种开放数组的运行时支持。正如Rudy的文章所演示的,一旦您离开了编译器对变体开放数组支持的安全范围,就需要相当多的显式内存管理。我不建议使用 TArray<TVarRec>

相反,我建议您使用现代变体类型,该变体类型是设计用于新样式的RTTI。那是 TValue。此变体类型已设计为明确使用,并且自动执行内存管理。使用 TArray<TValue>而不是 TArray<TVarRec>

关于delphi - RTTI和变量开放数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27793949/

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