Hallo Miteinander,
Ich kämpfe immer noch mit dem Problem komplexe dynamische Arrays mittels
RTTI auszulesen.
Zur besseren Veranschaulichung habe ich ein Beispiel(D7) angehängt.
Das Problem ergibt sich, wenn in dem
Array of Objekte gespeichert sind:
Delphi-Quellcode:
...
type
TestObject = class;
ArrayOfTest = array of TestObject;
HauptObject = class(TBaseClass)
private
...
FTest : ArrayOfTest;
...
published
...
property Test : ArrayOfTest read FTest write FTest;
...
end;
...
TestObject = class(TBaseClass)
private
FTestObjectName : WideString;
...
published
property TestObjectName : WideString read FTestObjectName write FTestObjectName;
...
end;
...
implementation
...
constructor HauptObject.Create;
begin
inherited Create;
...
SetLength(FTest, 1);
FTest[0] := TestObject.Create;
...
end;
Das Auslesen erfolgt in folgender Weise:
Delphi-Quellcode:
...
function GetPropertyValue(AObject : TObject; TypInfo: PTypeInfo; var Entry : TPropEntry): Boolean;
var
TypData,
TypData2 : TTypeData;
Value : Variant;
ValStr : String;
I : Integer;
PropEntry : TPropEntry;
begin
Result := False;
TypData := GetTypeData(TypInfo)^;
Entry.TypKind := TypInfo^.Kind;
case TypInfo^.Kind of
...
tkDynArray : begin
if TypData.elType <> nil then
begin
Value := GetPropValue(AObject, Entry.Name);
if VarIsArray(Value) then
begin
ValStr := '[';
for I := VarArrayLowBound(Value, 1) to VarArrayHighBound(Value, 1) do
ValStr := ValStr + VarToStr(Value[I]) + ', ';
ValStr := Copy(ValStr, 1, Length(ValStr) -2);
Entry.Value := ValStr + ']';
end;
Result := True;
end
else
if TypData.elType2 <> nil then
begin
case TypData.elType2^.Kind of
tkClass : begin
Entry.Value := TypData.elType2^.Name;
PropEntry := TPropEntry.Create;
PropEntry.Name := Entry.Name;
PropEntry.List := TObjectList.Create;
if GetObjectData(GetObjectProp(AObject, Entry.Name), PropEntry.List) then // Fehler bei Zuweisung?
begin
Entry.List := TObjectList.Create;
Entry.List.Add(PropEntry);
end;
end;
end;
end;
end;
end;
end;
function GetObjectData(AObject : TObject; var List : TObjectList) : Boolean;
var
PropList : pPropList;
I, J : Integer;
PropEntry : TPropEntry;
begin
PropList := AllocMem(SizeOf(PropList^));
try
I := 0;
J := GetPropList(AObject, PropList); // Fehler bei recursiven Aufruf
if (J <> 0) and (PropList^[I] <> nil) then
begin
while (I < J) do
begin
PropEntry := TPropEntry.Create;
PropEntry.Name := PropList^[I].Name;
if GetPropertyValue(AObject, PropList^[i].PropType^, PropEntry) then
begin
if List.IndexOf(PropEntry) = -1 then List.Add(PropEntry)
else PropEntry.Free;
end;
Inc(I);
end;
end;
finally
FreeMem(PropList);
end;
Result := List.Count - 1 > -1;
end;
...
Der Zugriff auf die Eigenschaft HauptObject.Test schlägt allerdings bei
J := GetPropList(AObject, PropList);
fehl.
Gibt es noch eine andere Möglichkeit und wenn wie würde sie aussehen?
Vielen Dank für die Mühe.
Gruß
Alter Mann