AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DynArray, GetPropValue und die RTTI

Ein Thema von Alter Mann · begonnen am 5. Jun 2006 · letzter Beitrag vom 24. Feb 2007
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DynArray, GetPropValue und die RTTI

  Alt 5. Jun 2006, 16:15
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
Angehängte Dateien
Dateityp: zip rttinfo_113.zip (5,8 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#2

Re: DynArray, GetPropValue und die RTTI

  Alt 24. Feb 2007, 11:25
hallo! hast du mittlerweile eine lösung für das problem gefunden?
würde mich nämlich auch interessieren.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz