RTTI Dynamic Array TValue Delphi 2010

I have a question. I am new to runtime information from Delphi 2010. I need to set the length to a dynamic array in TValue. You can see the code.

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; 

I don't like the Generics collections.

+4
source share
1 answer

TValue not intended to arbitrarily manipulate its contents (it would have more helpers, for example, when setting record fields, etc.), but rather to transfer values ​​between specific static types and dynamic RTTI. In this regard, TValue.SetArrayElement is an anomaly, and looking back might not be included. However, you may ask:

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

Source: https://habr.com/ru/post/907936/


All Articles