Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.181 Beiträge
 
Delphi 12 Athens
 
#14

Re: Propertys einer Componente für eine Klasse mittels RTTI

  Alt 27. Mär 2009, 13:43
hab grad dort drüben noch was Nettes gefunden...

jetzt ist der Code etwas kürzer und übersichtlicher:
Delphi-Quellcode:
Uses Types, TypInfo;

Function GetClassPropList(C: TClass): TStringDynArray;
  Var L: PPropList;
    i, i2, i3: Integer;

  Begin
    Result := nil;
    If not Assigned(C) Then Exit;
    L := nil;
    i := 0;
    Try
      i := GetPropList(C.ClassInfo, L);
      C := C.ClassParent;
      For i2 := i - 1 downto 0 do
        If IsPublishedProp(C, L[i2].Name) Then L[i2] := nil;
      i3 := 0;
      For i2 := i - 1 downto 0 do
        If Assigned(L[i2]) Then Inc(i3);
      SetLength(Result, i3);
      For i2 := i - 1 downto 0 do
        If Assigned(L[i2]) Then Begin
          Dec(i3);
          Result[i3] := L[i2].Name;
        End;
    Finally
      If Assigned(L) Then FreeMem(L);
    End;
  End;
und noch eine ganz Kurze/Übersichtliche ohne vorreservieren des Arrays:
Delphi-Quellcode:
Function GetClassPropList(C: TClass): TStringDynArray;
  Var L: PPropList;
    i, i2, i3: Integer;

  Begin
    Result := nil;
    If not Assigned(C) Then Exit;
    L := nil;
    Try
      i := GetPropList(C.ClassInfo, L);
      For i2 := 0 to i - 1 do
        If not IsPublishedProp(C.ClassParent, L[i2].Name) Then Begin
          i3 := Length(Result);
          SetLength(Result, i3 + 1);
          Result[i3] := L[i2].Name;
        End;
    Finally
      If Assigned(L) Then FreeMem(L);
    End;
  End;


Aber ohne nachzusehn, würd ich einfach mal behaupten, die alte/allererste Funktion ist dagegen immerhin schneller
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat