![]() |
DynArray, GetPropValue und die RTTI
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Das Auslesen erfolgt in folgender Weise:
...
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;
Delphi-Quellcode:
Der Zugriff auf die Eigenschaft HauptObject.Test schlägt allerdings bei
...
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; ...
Delphi-Quellcode:
fehl.
J := GetPropList(AObject, PropList);
Gibt es noch eine andere Möglichkeit und wenn wie würde sie aussehen? Vielen Dank für die Mühe. Gruß Alter Mann |
Re: DynArray, GetPropValue und die RTTI
hallo! hast du mittlerweile eine lösung für das problem gefunden?
würde mich nämlich auch interessieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz