Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen (https://www.delphipraxis.net/190516-mit-rtti-verschachtelte-eigenschaften-einer-komponente-auslesen.html)

weinberger 11. Okt 2016 14:01

Delphi-Version: XE3

Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Hallo, ich habe eine Komponente (damals noch mit Delphi 2 erstellt) für Feiertage. Dies enthält 26 Eigenschaften mit gleichem Namen+Nummerierung. Diese enthalten wiederum jeweils drei Eigenschaften. Ich möchte nun in einer Schleife mittels RTTI von sämtlichen Feiertagen, also 01 - 26 immer das Datum auslesen. Ich habe mit RTTI keinerlei erfahrung. Kann mir jemand helfen?

Die Komponente Sieht so aus:

Delphi-Quellcode:
type
TFeiertagStatus = (Day_Off, Work_Day, not_defined);

TTag = class(TPersistent)
  private
  FDatum, FBeschreibung : String;
  FStatus : TFeiertagStatus;
  protected
  public
  published
  Property Datum : String read FDatum write FDatum;
  Property Beschreibung : String read FBeschreibung write FBeschreibung;
  Property Status : TFeiertagStatus read FStatus write FStatus;
end;

TFeiertag = class(TComponent)
  private
    LAdvent : TDateTime;
    FJahr : integer;
    FFeiertag01 : TTag;
    FFeiertag06 : TTag;
    FFeiertag12 : TTag;
    FFeiertag03 : TTag;
    FFeiertag04 : TTag;
    FFeiertag05 : TTag;
    FFeiertag08 : TTag;
    FFeiertag09 : TTag;
    FFeiertag10 : TTag;
    FFeiertag11 : TTag;
    FFeiertag17 : TTag;
    FFeiertag13 : TTag;
    FFeiertag14 : TTag;
    FFeiertag24 : TTag;
    FFeiertag25 : TTag;
    FFeiertag26 : TTag;
    FFeiertag23 : TTag;
    FFeiertag07 : TTag;
    FFeiertag15 : TTag;
    FFeiertag16 : TTag;
    FFeiertag18 : TTag;
    FFeiertag19 : TTag;
    FFeiertag20 : TTag;
    FFeiertag21 : TTag;
    FFeiertag22 : TTag;
    FFeiertag02 : TTag;
    function IsLeapYear(AYear : Integer) : Boolean;
    function GetKarfreitag(AJahr: Integer): String;
    function GetOstersonntag(nYear: Integer): String;
    function GetOstermontag(AJahr: Integer): String;
    function GetChristiHimmelfahrt(AJahr: Integer): String;
    function GetPfingstsonntag(AJahr: Integer): String;
    function GetPfingstmontag(AJahr: Integer): String;
    function GetFronleichnam(AJahr: Integer): String;
    function GetBuss_und_Bettag(AJahr: Integer): String;
    function GetMuttertag(AJahr: Integer): String;
    function GetVolkstrauertag(AJahr: Integer): String;
    function GetTotensonntag(AJahr: Integer): String;
    function GetAdvent1(AJahr: Integer): String;
    function GetAdvent2(AJahr: Integer): String;
    function GetAdvent3(AJahr: Integer): String;
    function GetAdvent4(AJahr: Integer): String;
    function GetJahr: integer;
    procedure SetJahr(Value:integer);
    procedure Ermitteln;
    procedure NeuErmitteln;
  protected
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
  published
    Property Jahr : integer read GetJahr write SetJahr;
    Property Feiertag01 : TTag read FFeiertag01 write FFeiertag01;
    Property Feiertag02 : TTag read FFeiertag02 write FFeiertag02;
    Property Feiertag03 : TTag read FFeiertag03 write FFeiertag03;
    Property Feiertag04 : TTag read FFeiertag04 write FFeiertag04;
    Property Feiertag05 : TTag read FFeiertag05 write FFeiertag05;
    Property Feiertag06 : TTag read FFeiertag06 write FFeiertag06;
    Property Feiertag07 : TTag read FFeiertag07 write FFeiertag07;
    Property Feiertag08 : TTag read FFeiertag08 write FFeiertag08;
    Property Feiertag09 : TTag read FFeiertag09 write FFeiertag09;
    Property Feiertag10 : TTag read FFeiertag10 write FFeiertag10;
    Property Feiertag11 : TTag read FFeiertag11 write FFeiertag11;
    Property Feiertag12 : TTag read FFeiertag12 write FFeiertag12;
    Property Feiertag13 : TTag read FFeiertag13 write FFeiertag13;
    Property Feiertag14 : TTag read FFeiertag14 write FFeiertag14;
    Property Feiertag15 : TTag read FFeiertag15 write FFeiertag15;
    Property Feiertag16 : TTag read FFeiertag16 write FFeiertag16;
    Property Feiertag17 : TTag read FFeiertag17 write FFeiertag17;
    Property Feiertag18 : TTag read FFeiertag18 write FFeiertag18;
    Property Feiertag19 : TTag read FFeiertag19 write FFeiertag19;
    Property Feiertag20 : TTag read FFeiertag20 write FFeiertag20;
    Property Feiertag21 : TTag read FFeiertag21 write FFeiertag21;
    Property Feiertag22 : TTag read FFeiertag22 write FFeiertag22;
    Property Feiertag23 : TTag read FFeiertag23 write FFeiertag23;
    Property Feiertag24 : TTag read FFeiertag24 write FFeiertag24;
    Property Feiertag25 : TTag read FFeiertag25 write FFeiertag25;
    Property Feiertag26 : TTag read FFeiertag26 write FFeiertag26;
  end;

Stevie 11. Okt 2016 15:52

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Da es sich um published Properties handelt, hab ich mal die old school RTTI bemüht, die auch der OI nutzt.

Delphi-Quellcode:
uses
  TypInfo;

procedure WriteDates(f: TFeiertag);
var
  props: PPropList;
  i: Integer;
begin
  for i := 0 to GetPropList(TypeInfo(TFeiertag), [tkClass], props) - 1 do
    if props^[i].PropType^ = TypeInfo(TTag) then
      Writeln(TTag(GetObjectProp(f, props^[i])).Datum);
end;
Übrigens: http://docwiki.embarcadero.com/RADSt...ndexbezeichner

Zacherl 11. Okt 2016 16:02

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Zitat:

Zitat von Stevie (Beitrag 1350495)

^ this :thumb: Wenn man in großem Maße die RTTI bemühen muss, um irgendetwas zu erreichen, ist das meistens ein Zeichen von schlechtem Code Design. Ich würde hier eine einzelne Array Property definieren und dann über Diese iterieren. Wenn du dann wirklich noch seperate Properties für jeden Tag benötigst, geht das über den von Stevie erwähnten Indexbezeichner sehr elegant.

weinberger 12. Okt 2016 08:08

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Danke Stevie,
GetPropList(TypeInfo(TFeiertag), [tkClass], props) löst bei mir eine EAccessViolation aus :gruebel::gruebel::gruebel:
Wird dann aber ausgeführt :gruebel::gruebel::gruebel:


Danke Zacherl,
ich hab die Komponente einfach aus meinem damaligen Delphi 2 ins XE3 übernommen. Deinen Ansatz muß ich mir mal anschauen:thumb::thumb:

himitsu 12. Okt 2016 09:35

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Vorteil Index/Arrray-Property

Du kannst für Beides den selben Getter und Setter verwenden
die vielen Felder/Varaiblen können ein Array werden (die sind auch schön durcheinander deklariert :lol:)

Zitat:

Wird dann aber ausgeführt
Zeigt nur der Debugger die Exception an, welche aber eigentlich abgefangen ist und somit nicht im Programm ausgegeben wird? :stupid:

weinberger 12. Okt 2016 10:02

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo himitsu,

nein die Exception wird auch angezeigt wenn das Testprogramm ohne Debugger ausgeführt wird.

Die ganzen Get-functions sind alle unterschiedlich. Da werden die verschiedenen Feiertage berechnet.

baumina 24. Mär 2017 07:21

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Danke Stevie,

das hat mir gestern so den letzten Nerv geraubt, weil ichs nicht hinbekommen habe, nun klappts .... :dancer2:

weinberger 27. Nov 2018 14:26

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen
 
Danke Stevie,

habs bis jetzt nicht mehr angeschaut. Nun funktionierts. :dancer2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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