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