AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Propertys einer Componente für eine Klasse mittels RTTI

Propertys einer Componente für eine Klasse mittels RTTI

Ein Thema von oki · begonnen am 26. Mär 2009 · letzter Beitrag vom 27. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2   
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Propertys einer Componente für eine Klasse mittels RTTI

  Alt 26. Mär 2009, 17:49
Hi,

kleines Problem. Ich kann die Propertys meiner Komponente mittels RTTI-Funktion GetPropList ermitteln. Dabei übergebe ich die Instanz meines Objectes sowie eine PropList und bekomme alle published Propertys zurückgeliefert.

Jetzt möchte ich aber nur die Propertys haben, die in einer bestimmten Basisklasse enthalten sind. Hier mal als Beispiel:
Delphi-Quellcode:
  TCustomClass = class(TComponent)
  published
    property Prop1;
  end;

  TBaseClass = class(TCustomClass)
  published
    property Prop2;
  end;

  TExpertClass = class(TBaseClass)
  published
    property Prop3;
  end;

.....

var MyClass : TExpertClass;
.....

  MyClass := TExpertClass.Create(nil);

  // alle Propertys für MyClass, die in TCustomClass enthalten sind auflisten
  ??????????
Also an der Stelle nur Prop1.

Einer ne Idee? Würd mich sehr freuen.

Bei GetPropInfo kann eine Klassentyp übergeben werden. Was das dann bringt ist mir noch nicht so richtig klar, leider geht das nicht mit GetPropList.
Ich hab auch irgentwie das Gefühl, das ich über GetTypeInfos da ran komme. Einen richtigen Plan hab ich aber nicht.

Schon mal Dank für eure Hilfe,

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Mär 2009, 17:58
im Notfall alle Properties ermitteln,
das Ganze nochmals bei der Parent-Klasse (wenn eine existiert)
und am Ende alles in der Parent-Klasse Enthaltene aus der andere Liste entfernen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 26. Mär 2009, 18:04
Also ein TempObj der geforderten Klasse erstellen, die Props lesen, das TempObj frei geben und diese Propliste auf mein Objekt anwenden?

Die Idee ist mir auch schon gekommen, fand ich nur nicht so elegant. Dachte eher ich hab eine Bildungslücke (ok, hab ich sicher ) und es gibt einen Weg, wie ich zum Lesen der PropList eine Klasse angeben kann.

Gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

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

  Alt 26. Mär 2009, 18:15
Gehts vielleicht auch so?

Delphi-Quellcode:
var PropList : PPropList;
    PropCount : Integer;
    AClass : TClass;
begin
  AClass := GetClass('TCustomClass');
  if Assigned(AClass) then
    PropCount := GetPropList(AClass.ClassInfo, PropList);
  end;
end;
Gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 26. Mär 2009, 18:18
Boahh,

hat geklappt. Bin beeindrukt. Auch noch mal Dank an himitsu.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Mär 2009, 18:19
wenn das geht, dann sollte das auch so gehn?
Delphi-Quellcode:
var PropList : PPropList;
    AClass : TClass;
begin
  AClass := TCustomClass;
  PropCount := GetPropList(AClass.ClassInfo, PropList);
end;

// bzw.

var PropList : PPropList;
begin
  PropCount := GetPropList(TCustomClass.ClassInfo, PropList);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 26. Mär 2009, 18:21
Klar, sorry mein Fehler. Ich hab zu diesem Zeitpunkt nur den Namen der Klasse. Somit muss ich sie erst holen. Konntest du aber nicht wissen, da ich keinen Funktionskopf mitgeliefert hatte.

Passt aber.

Dank und Gruß

oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Mär 2009, 18:26
ochso

und was liefert GetPropList nun alles?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

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

  Alt 26. Mär 2009, 22:12
Zitat von himitsu:
ochso

und was liefert GetPropList nun alles?
Alle Propertys meiner Komponente incl. Werte die unter der angegebenen Klasse definiert sind.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Mär 2009, 23:24
Delphi-Quellcode:
Uses Types, TypInfo;

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

  Begin
    L := nil;
    L2 := nil;
    i := 0;
    i2 := 0;
    Try
      If Assigned(C) Then Begin
        i := GetPropList(C.ClassInfo, L);
        C := C.ClassParent;
        If Assigned(C) Then i2 := GetPropList(C.ClassInfo, L2);
      End;
      For i3 := 0 to i - 1 do
        For i4 := 0 to i2 - 1 do
          If Assigned(L[i3]) and (L[i3].Name = L2[i4].Name) Then L[i3] := nil;
      i4 := 0;
      For i3 := 0 to i - 1 do
        If Assigned(L[i3]) Then Inc(i4);
      SetLength(Result, i4);
      i4 := 0;
      For i3 := 0 to i - 1 do
        If Assigned(L[i3]) Then Begin
          Result[i4] := L[i3].Name;
          Inc(i4);
        End;
    Finally
      If Assigned(L) Then FreeMem(L);
      If Assigned(L2) Then FreeMem(L2);
    End;
  End;




Var C: TClass;
  R: TStringDynArray;
  i: Integer;

Begin
  C := TScrollingWinControl; //C := GetClass('TScrollingWinControl');
  R := GetClassPropList(C);
  For i := 0 to High(R) do Memo1.Lines.Add(R[i]);
End;
getestet und läuft ... nur GetClass findet die Klasse nicht
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz