Announcement

Collapse
No announcement yet.

Gibt es die Möglichkeit alle Properties einer Komponente zu durchlaufen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Gibt es die Möglichkeit alle Properties einer Komponente zu durchlaufen?

    Hallo zusammen!
    Ich möchte eine Komponente z.B. Edit zur Entwicklungszeit definieren und während der Laufzeit weitere Komponenten des gleichen Typs erstellen.
    Damit ich dann nicht alle Properties selbstsändig setzen muß, suche ich nach einer Möglichkeit alle Properties der vorab definierten Komponente zu durchlaufen und die Werte auf die neuen Komponenten zu übertragen. Anschließend müßten nur noch die Left und Top Werte geändert werden.

    Meine Frage lautet also:
    Gibt es die Möglichkeit alle Properties einer Komponente zu durchlaufen?

    Vielen Dank,
    Timo

  • #2
    Hallo Timo,<p>

    nachfolgend von mir eine Methode, welche die Properties zweier Objekte vergleicht;<p>

    function CompareObjects(ObjA, ObjB: TObject;<br>
    TypeKinds: TTypeKinds; Ausnahmen: TStringList = nil): boolean;<br>
    // Vergleicht, ob die namensgleichen Properties zweier Komponente den gleichen Typ<br>
    // und den gleichen Wert haben.
    //const cKinds = tkProperties; //[tkInteger..tkSet, tkWChar..tkDynArray];<br>
    var P : Pointer;<br>
    PropListA,<br>
    PropListB : TPropList;<br>
    pListA,<br>
    pListB : PPropList;<br>
    iCount,<br>
    PropCountA,<br>
    PropCountB : integer;<br>

    PropKind : TTypeKind;<br>
    vA, vB : Variant;<br>
    begin<br>
    //Objekte müssen existieren<br>
    Result := Assigned(ObjA) and Assigned(ObjB);<br>

    //Vergleichen ob Classentype identisch<br>
    if Result then Result := ObjA.ClassType = ObjB.ClassType;<p>

    if not Result then Exit;<p>

    //ClassInfo muß definiert sein<br>
    P := ObjA.ClassInfo;<br>
    Result := Assigned(p);<p>

    P := ObjB.ClassInfo;<br>
    Result := Result and Assigned(P);<p>

    if not Result then Exit;<p>

    //Methode Ausnahmen.IndexOf ermöglichen<br>
    if Assigned(Ausnahmen) then Ausnahmen.Sorted := True;<p>

    pListA := @PropListA;<br>
    pListB := @PropListB;<br>

    //Properties der Componenten in pList auslesen und Anzahl zuweisen<br>
    PropCountA := GetPropList(ObjA.ClassInfo, TypeKinds, pListA);<br>
    PropCountB := GetPropList(ObjB.ClassInfo, TypeKinds, pListB);<p>

    //Anzahl der Properties beider Componenten sind gleich?<br>
    Result := PropCountA = PropCountB;<p>

    if (PropCountA = 0) or not Result then Exit;<p>

    For iCount := 0 to pred(PropCountA) do<br>
    begin<br>
    //Gleiche Reihenfolge in der Property-Bezeichnung muß bestehen<br>
    Result := PropListA[iCount].Name = PropListB[iCount].Name;<br>
    if not Result then Exit;<br>

    //Ausnahme: nicht zu vergleichende Properties<br>
    if Assigned(Ausnahmen) and<br>
    (Ausnahmen.IndexOf(PropListA[iCount].Name) > -1) then Continue;<br>

    //Properties müssen vom gleichen Typ sein<br>
    PropKind := PropListA[iCount].PropType^.Kind;<br>
    Result := PropKind = PropListB[iCount].PropType^.Kind;<br>

    if not Result then Exit;<br>

    //Werte der Properties auslesen<br>
    vA := GetPropValue(ObjA,PropListA[iCount].Name);<br>
    vB := GetPropValue(ObjB,PropListB[iCount].Name);<br>

    //Werte der Properties verlgeichen<br>
    Result := vA = vB;<br>

    if not Result then Exit;<br>
    end;<br>
    end;<br&gt

    Comment


    • #3
      Hallo,<br>ich denke, das für diesen Anwendungsfall die Assign-Methode gedacht ist

      Comment


      • #4
        Hallo Jens,<p>
        das mag sein. Mitunter muß die von Assign aufgerufene Methode AssignTo angepasst bzw. überhaupt gefüllt werden. Wird/Ist die Methode AssignTo aus dem Objekt TPersistent nicht überschrieben, liefert Assign immer einen Fehler zurück!<p>

        Gruß Uw

        Comment

        Working...
        X