2010-12-30 11 views
4

質問があります。私はDelphi 2010のRun Time Type Informationの初心者です。長さを動的配列にしてTValueに設定する必要があります。あなたはコードを見ることができます。RTTIダイナミックアレイTValue Delphi 2010

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; 

私はGenerics Collectionsが嫌いです。

+5

なぜGenerics.Collectionsのクラスが気に入らないのですか? –

+6

ジェネリックの欠如が、デルファイをドロップする最大の理由でした。おそらくDelphi 2以降でDelphiにとって最大の改善点です。 – CodesInChaos

答えて

7

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. 
+0

ありがとう、私は今しようとします。 – user558126

関連する問題