Hallo!
Seit paar Tagen beschäftigt mich das Problem der Gewinnung von Laufzeittypinformation.
Mit dem folgenden Quelltext will ich die Eigenschaften einer übergebenen Klasse anzeigen.
Leider kommt im dafür vorgesehenen ValueListEditor, hier DebugInsp, keine Information an.
Sieht zufällig jemand, was ich falsch gemacht habe. Ich weiß nicht mehr weiter. Auch das Studium
der
Unit TypInfo hilft mir nicht weiter. Ebenso wenig helfen andere Quelltexte, die Typinformation sammeln. Deshalb wär es schön, wenn ich meine eigene Version fehlerbereingen könnte.
Delphi-Quellcode:
var
_Class: TObject;
_Index: Integer;
_TypeInf: PTypeInfo;
_TypeDat: PTypeData;
_PropList: PPropList;
AProperties: TTrings;
begin
AProperties := TStringList.Create;
AClassAnchor := AClass; //AClass wurde an anderer Stelle instnatiiert
if Assigned(FClassAnchor) then
begin
//Typinformation holen
AClassTypeInfo := AClass.ClassInfo;
AClassTypeData := GetTypeData(_TypeInf);
try
APropertyCount := AClassTypeData.PropCount;
//getmem(_PropList, Sizeof(TPropInfo) * AClassTypeData.PropCount);
//Hatte vorher GetPropinfos() verwendet. Da war getmem nötig. Funzt aber auch nicht
if Assigned(_PropList) then
GetPropList(AClass,_PropList);
for _Index := 0 to AClassTypeData.PropCount-1 do
AProperties.Add(TProperty.CreateClass(AClass.ClassType,_PropList[_Index]^.Name));
Form1.OutputClassProperties(AClassAnchor: TObject);
finally
// freemem(_PropList, Sizeof(TPropInfo) * AClassTypeData.PropCount);
// wenn freemem aufgerufen wird folgt EAccessviolation
end;
end;
end;
//Hier ist die AUsgabe der Typinformation codiert:
procedure TForm1.OutputClassProperties(AClass: TObject);
var
Index: Integer;
begin
ATypeInfo.ClassAnchor := AClass;
for Index:=0 to ATypeInfo.PropertyCount - 1 do
begin
ATypeKind := ATypeInfo.PropTypeKind[Index];
if ATypeKind <> tkMethod then
begin
case ATypeKind of
tkInteger,
tkString,tkWChar,tkLString,tkWString,tkInt64:
begin
//Hier will ich die Ausgabe als Eigenschaft | Typ realisieren
DebugInsp.InsertRow( //Debugisp ist ein ValueListEditor
ATypeInfo.PropertyName[Index],
ATypeInfo.PropertyType[Index].Name,
true
);
end;
tkFloat: ;
tkEnumeration: ;
tkSet: ;
tkClass: ;
end;
end
else
begin
end;
end;
end;
Wer hat den entscheidenden Fingerzeig.
Die
Unit ist mit {$TYPEINFO ON} übersetzt.