Objekt-Attribute in Delphi rekursiv durchgehen
Möchte man in Delphi alle Objekt-Attribute bearbeiten, unabhängig von der Art des Objektes (d.h. egal welcher Typ/Klasse), kann man dies mit folgender rekursiver Funktion durchführen:
Als Beispiel wollen wir eine Prozedur schreiben, welche ein beliebiges Objekt als Parameter bekommt und dann in jedem String-Attribut den Text auf Großbuchstaben konvertiert.
Wir verwenden für diese Aufgabe die Delphi RTTI (Runtime Type Information bzw. Laufzeit-Typinformationen), welche es uns ermöglicht Informationen über ein Objekt zu ermitteln. Damit können wir z.B. die Namen und Typen aller Attribute auslesen. Handelt es sich bei dem Attribut um einen String, wandeln wir ihn in Großbuchstaben um. Handelt es sich um eine Klasse, rufen wir die Funktion wieder rekursiv auf mit dem Unter-Objekt als neuen Parameter. Alle anderen Typen ignorieren wir:
uses Rtti, Typinfo,....;
...
procedure toUpperCaseObjectStrings(obj: TObject);
var ctx : TRttiContext;
rt : TRttiType;
field: TRttiField;
objSub, o: TObject;
str: string;
p: Pointer;
begin
if (obj = nil) then begin
exit;
end;
ctx := TRttiContext.Create();
try
rt := ctx.GetType(obj.ClassType);
for field in rt.GetFields() do begin
case field.FieldType.TypeKind of
tkUString : begin
str := field.GetValue(obj).ToString();
field.SetValue(obj, uppercase(field.getValue(obj).toString()));
end;
tkClass: begin
p := pointer(integer(obj) + field.Offset);
objSub := TObject(p^);
self.toUpperCaseObjectStrings(objSub);
end;
else continue;
end;
end;
finally
ctx.free();
end;
end;
Code-Sprache: PHP (php)
Schreibe einen Kommentar
Du musst angemeldet sein, um einen Kommentar abzugeben.