![]() |
Namen und Typ aller Attribute einer Klasse ermitteln
Hallo,
wie kann ich die Namen aller Attribute einer Klasse ermitteln?
Delphi-Quellcode:
Gefunden werden sollen Name = String und Alter = Integer
TTest : Class
Name : String; Alter : Integer; end; Danke Gerd |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Moin...:P
Was hast du denn konkret vor? :gruebel: Die RTTI sollte das letzte Werkzeug sein. 8-) ![]() |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Mit der rtti hatte ich schon angefangen,bin hier aber hängen geblieben:
Delphi-Quellcode:
Konkret will ich Felder aus einer DB in die Attribute einlesen und sowas
var
rttiContext: TRttiContext; rttiType: TRttiType; attribute: TCustomAttribute; begin rttiContext := TRttiContext.Create; try rttiType := rttiContext.GetType(TTest); for attribute in rttiType.GetAttributes do Memo1.Lines.Add(attribute.????); finally rttiContext.Free; end; end;
Delphi-Quellcode:
durch das
aMethod.LCParam.LoopSize := quQuery['LoopSize'];
aMethod.LCParam.IntegratorNumber := quQuery['IntegratorNumber']; aMethod.LCParam.WaitForReadySignal := quQuery['WaitForReadySignal']; ....
Delphi-Quellcode:
ersetzen
for i := 0 to AttCount-1 do
begin case AttTyp of tyReal: aMethod.LCParam[i] := quQuery.FieldByName('IntegratorNumber').AsReal; tyInteger: aMethod.LCParam[i] := quQuery.FieldByName('IntegratorNumber').AsInteger; ... end; end; |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Moin...:P
:gruebel: Was spricht gegen die Benutzung der Instanz von TTest?
Delphi-Quellcode:
Gefühlt brauchst du die RTTI nur für "Notfälle". :zwinker: Bisher ging alles ohne RTTI...mit Interfaces oder Klasseninstanzen. :thumb:
Test.Number := quQuery.FieldByName('IntegratorNumber').AsInteger
.. Verrate mal, warum du unbedingt die RTTI brauchst... :wink: |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Zitat:
Ich würde hier also
Delphi-Quellcode:
empfehlen.
rttiType.GetFields
Vielleicht Schaust du dir mal meinen ![]() |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Zitat:
Zitat:
|
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Suchst Du sowas in der Art?
Delphi-Quellcode:
for i := 0 to AttCount - 1 do aMethod.LCParam[i] := quQuery.Fields[i].Value;
Wenn sichergestellt ist, dass LCParam[i] jeweils den gleichen Typ hat, wie quQuery.Fields[i], sollte dies eigentlich funktioniere. Nur wenn der Typ nicht passt, dann kracht es. Letztlich wäre es hier auch egal, ob die Namen übereinstimmen. Es muss sichergestellt sein, dass in der Abfrage die Felder in der gleichen Reihenfolge enthalten sind, wie sie in aMethod.LCParam erwartet werden. Und statt acht Zeilen reicht auch ein Einzeiler ;-) |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Zitat:
Es kann sein, dass Werte in der DB noch mit NULL belegt sind. Ausserdem muss die Reihenfolge der Felder nicht genau übereinstimmen. Deshalb wäre es schon notwendig Name und Typ festzustellen |
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Dank des Hinweises von Uwe war die Lösung nicht mehr schwer:
Delphi-Quellcode:
und das Resultat
procedure TForm4.BitBtn3Click(Sender: TObject);
procedure GetFields(pValue: TClass); var rttiContext: TRttiContext; rttiType: TRttiType; attribute: TCustomAttribute; rttiField: TRttiField; begin rttiContext := TRttiContext.Create; try rttiType := rttiContext.GetType(pValue); Memo1.Clear; for rttiField in rttiType.GetFields do Memo1.Lines.Add(format('%s # %s # %s', [rttiField.Name, rttiField.FieldType.ToString, rttiField.ToString])); finally rttiContext.Free; end; end; begin GetFields(TTest); end;
Code:
Mit
Name1 # string # Name1: string @ 04
Alter # Integer # Alter: Integer @ 08
Delphi-Quellcode:
kann ich direkt auf den Datentyp zugreifen
rttiField.FieldType.TypeKind
|
AW: Namen und Typ aller Attribute einer Klasse ermitteln
Jetzt habe ich doch noch ein Problem.
Wie kann ich auf ein Feld einer Klasse zugreifen wenn ich den Namen als String vorliegen habe, also ähnlich wie bei der Datenbank wo ich
Delphi-Quellcode:
verwenden kann.
Query.FieldByName(sName).Value
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz