Hallo,
ich habe ein kleines Problem (oder ein Brett vorm Kopf).
Gegeben ist folgender Konstrukt:
Delphi-Quellcode:
...
type
ArrayOfString = array of String;
TBlaBla = class(irgenetwas)
private
FQArray : ArrayOfString;
FSonst : String;
public
destructor Destroy; override;
published
property Sonst : String read FSonst write FSonst;
property QArray : ArrayOfString read FQArray write FQArray;
end;
ArrayOfBlaBla = Array of TBlaBla;
TBlaObject = class(irgenetwas)
private
FAlleQArrays : ArrayOfBlaBla;
FDieses : String;
public
destructor Destroy; override;
published
property Dieses : String read FDieses write FDieses;
property AlleQArrays : ArrayOfBlaBla read FAlleQArrays write FAlleQArrays;
end;
...
Ich muss nun zur Laufzeit die Properties von TBlaObject auslesen, was ja auch
eigentlich kein Problem ist:
Delphi-Quellcode:
...
type
// Dient zum Zwischenspeichern
TEntry = class
Name : String;
Typ : TVarType;
Value : Variant;
List : TObjectList;
end;
function GetObjectData(AObject : TObject; var List : TObjectList) : Boolean;
implementation
function GetObjectData(AObject : TObject; var List : TObjectList) : Boolean;
var
PropList : pPropList;
I, J, K : Integer;
PropValue : Variant;
Entry : TEntry;
begin
PropList := AllocMem(SizeOf(PropList^));
try
I := 0;
J := GetPropList(AObject, PropList);
if (J <> 0) and (PropList^[I] <> nil) then
begin
while (I < J) do
begin
Entry := TEntry.Create;
Entry.Name := PropList^[i].Name;
try
PropValue := GetPropValue(AObject, PropList^[i].Name); // Fehler bei ArrayOf
Entry.Value := PropValue; // Edit
Entry.SoapTyp := TVarData(PropValue).VType;
except
end;
Inc(I); // Edit
end;
end;
finally
FreeMem(PropList);
end;
Result := List.Count - 1 > -1;
end;
...
Das klappt soweit, bis, ja bis das ArrayOfBlaBla dran ist.
Dann steigt GetPropValue mit einer
Exception aus:
EVariantTypCastError := 'Ungültige Variant-Typumwandlung'
Hat jemand dafür einen Tipp oder eine Lösung?
Gruß
Alter Mann