|
@@ -0,0 +1,52 @@
|
|
|
+program tb;
|
|
|
+
|
|
|
+{$mode objfpc}
|
|
|
+{$H+}
|
|
|
+
|
|
|
+uses typinfo;
|
|
|
+
|
|
|
+{$M+}
|
|
|
+Type
|
|
|
+ TBooleanArray = Array of Boolean;
|
|
|
+
|
|
|
+ TMyObject = Class(TObject)
|
|
|
+ Private
|
|
|
+ FBooleans : TBooleanArray;
|
|
|
+ Published
|
|
|
+ Property Booleans: TBooleanArray Read FBooleans Write FBooleans;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+Var
|
|
|
+ O : TMyObject;
|
|
|
+ P : Pointer;
|
|
|
+ Info : PPropInfo;
|
|
|
+ I : Integer;
|
|
|
+
|
|
|
+begin
|
|
|
+ O:=TMyObject.Create;
|
|
|
+ try
|
|
|
+ Info:=GetPropINfo(O,'Booleans');
|
|
|
+ // Get property using RTTI (returns Nil, as expected)
|
|
|
+ P:=GetObjectProp(O,Info);
|
|
|
+ // Clear array
|
|
|
+ I:=0;
|
|
|
+ DynArraySetLength(P,Info^.PropType,1,@i);
|
|
|
+ // Now, set new length
|
|
|
+ I:=2;
|
|
|
+ DynArraySetLength(P,Info^.PropType,1,@i);
|
|
|
+ // Set some values
|
|
|
+ TBooleanArray(P)[0]:=True;
|
|
|
+ TBooleanArray(P)[1]:=False;
|
|
|
+ // This is OK
|
|
|
+ Writeln('Length : ',Length(TBooleanArray(P)));
|
|
|
+ // Set property using RTTI
|
|
|
+ SetObjectProp(O,Info,TObject(P));
|
|
|
+ // This goes wrong.
|
|
|
+ Writeln('Correct pointer : ',HexStr(GetObjectProp(O,Info)),' = ',HexStr(P),' ? ',Pointer(GetObjectProp(O,Info))=P);
|
|
|
+ // Crash !!
|
|
|
+ Writeln('Length array : ',Length(O.Booleans));
|
|
|
+ finally
|
|
|
+ O.Free;
|
|
|
+ end;
|
|
|
+end.
|