AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

Ein Thema von weinberger · begonnen am 11. Okt 2016 · letzter Beitrag vom 27. Nov 2018
Antwort Antwort
weinberger

Registriert seit: 29. Jul 2009
Ort: Natternberg
24 Beiträge
 
Delphi XE3 Professional
 
#1

Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 11. Okt 2016, 14:01
Delphi-Version: XE3
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;
Rainer

Geändert von mkinzler (11. Okt 2016 um 14:45 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.753 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 11. Okt 2016, 15:52
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 11. Okt 2016, 16:02
^ this 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
weinberger

Registriert seit: 29. Jul 2009
Ort: Natternberg
24 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 12. Okt 2016, 08:08
Danke Stevie,
GetPropList(TypeInfo(TFeiertag), [tkClass], props) löst bei mir eine EAccessViolation aus
Wird dann aber ausgeführt


Danke Zacherl,
ich hab die Komponente einfach aus meinem damaligen Delphi 2 ins XE3 übernommen. Deinen Ansatz muß ich mir mal anschauen
Rainer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.811 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 12. Okt 2016, 09:35
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 )

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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (12. Okt 2016 um 09:40 Uhr)
  Mit Zitat antworten Zitat
weinberger

Registriert seit: 29. Jul 2009
Ort: Natternberg
24 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 12. Okt 2016, 10:02
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.
Miniaturansicht angehängter Grafiken
fehler.jpg  
Rainer
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 24. Mär 2017, 07:21
Danke Stevie,

das hat mir gestern so den letzten Nerv geraubt, weil ichs nicht hinbekommen habe, nun klappts ....
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
weinberger

Registriert seit: 29. Jul 2009
Ort: Natternberg
24 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Mit RTTI verschachtelte Eigenschaften einer Komponente auslesen

  Alt 27. Nov 2018, 14:26
Danke Stevie,

habs bis jetzt nicht mehr angeschaut. Nun funktionierts.
Rainer
  Mit Zitat antworten Zitat
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 12:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf