gpt4 book ai didi

arrays - RTTI 动态数组 TValue Delphi 2010

转载 作者:行者123 更新时间:2023-12-03 15:09:39 24 4
gpt4 key购买 nike

我有一个问题。我是来自 Delphi 2010 的运行时类型信息的新手。我需要将动态数组的长度设置为 TValue。您可以看到代码。

Type TMyArray = array of integer;
TMyClass = class
publihed
function Do:TMyArray;
end;

function TMyClass.Do:TMyArray;
begin
SetLength(Result,5);
for i:=0 to 4 Result[i]=3;
end;
.......
.......
......
y:TValue;
Param:array of TValue;
.........
y=Methods[i].Invoke(Obj,Param);//delphi give me a DynArray type kind, is working, Param works to any functions.

if Method[i].ReturnType.TypeKind = tkDynArray then//is working...
begin
I want to set length for y to 10000//i don't know how to write.
end;

我不喜欢泛型集合。

最佳答案

TValue 并不是为任意操作其内容而设计的(如果是的话,它将有更多的帮助器,例如设置记录字段等),而是为在具体静态类型和动态 RTTI 之间传输值而设计。在这方面,TValue.SetArrayElement 是一种异常现象,事后看来,也许不应该包含在内。然而,你问的是可能的:

uses Rtti;

type
TMyArray = array of Integer;
TMyClass = class
function Go: TMyArray;
end;

function TMyClass.Go: TMyArray;
var
i: Integer;
begin
SetLength(Result, 5);
for i := 0 to 4 do
Result[i] := 3;
end;

procedure P;
var
ctx: TRttiContext;
v: TValue;
len: Longint;
i: Integer;
begin
v := ctx.GetType(TMyClass).GetMethod('Go').Invoke(TMyClass.Create, []);
Writeln(v.ToString);
len := 10;
DynArraySetLength(PPointer(v.GetReferenceToRawData)^, v.TypeInfo, 1, @len);
Writeln(v.GetArrayLength);
for i := 0 to v.GetArrayLength - 1 do
Writeln(v.GetArrayElement(i).ToString);
end;

begin
P;
end.

关于arrays - RTTI 动态数组 TValue Delphi 2010,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4561569/

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