![]() |
Delphi-Version: 5
Alle Eigenschaften einer komplexen Datenklasse
Hallo,
ich möchte für eine Klasse etwas schreiben das alle Eigenschaften derselben benutzt. (Vorerst ein unit-test) Die Klasse ist in Delphi geschrieben und hat ein interface. Für etliche Eigenschaften gilt das gleiche, d.h. dahinter stehen wiederum Klassen für die das selbe gilt. Insgesammt dürften das etliche hunderte Eigenschaften sein. Die Klasse ist nicht von mir. Natürlich kann ich mir alles selber von Hand zusammensuchen, aber das ist aufwendig und fehleranfällig. Nun suche ich Ideen wir man das automatisch oder halbautomatisch machen kann. So einfach erscheint mir das nicht, aber vielleicht übersehe ich was. :gruebel: |
AW: Alle Eigenschaften einer komplexen Datenklasse
Du kannst mittels "RTTI" (aus System.Rtti.pas) dir alle Methoden, Variablen oder Properties eines Objekts/Interfaces aufzählen lassen und damit etwas machen.
Ist das, was du meinst? |
AW: Alle Eigenschaften einer komplexen Datenklasse
Danke Günther für die Antwort.
An RTTI habe ich auch schon kurz gedacht. Wegen dem "aufwendig" (zumindest für mich) habe ich das nicht näher erwogen. Vielleicht kopiere ich mir mit MMX was zusammen und mache das meiste mit Suchen&Ersetzen. Mal schauen. |
AW: Alle Eigenschaften einer komplexen Datenklasse
Zitat:
Delphi-Quellcode:
Du könntest mit mORMot die published Eigenschaften einer Klasse JSON serialisieren. Die Werte in der JSON-Datei ändern und es zurückspielen. Das sind nur zwei Funktionsaufrufe.
type
TTestObject = class(TObject) private FValue1: String; public property Value1: String read FValue1 write FValue1; end; var rttiType: TRttiType; rttiProp: TRttiProperty; rttiPropType: TRttiType; begin rttiType := TRttiContext.Create.GetType(TTestObject); for rttiProp in rttiType.GetDeclaredProperties do begin if rttiProp.Visibility = mvPublic then begin rttiPropType := rttiProp.PropertyType; if rttiPropType.Handle = TypeInfo(String) then ShowMessage(Format('Gefunden: %s', [rttiProp.Name])); end; end; end; Bis bald... Thomas |
AW: Alle Eigenschaften einer komplexen Datenklasse
Zitat:
Guten Morgen, wenn wir wirklich über Delphi 5 (ohne XE) sprechen, dann wird das nix mit System.rtti, dann ist die Unit Types dein Freund, das ist die alte RTTI, funktioniert aber auch super und ja, da muss man anfangs etwas Aufwand reinstecken, aber das ist keine Raketenwissenschaft... |
AW: Alle Eigenschaften einer komplexen Datenklasse
Nein, es geht nicht um Delphi 5. Das ist eine Option, die es wohl nur in bestimmten Bereichen hier gibt und ich wie auch andere oft übersehe. Links steht inzwischen "Delphi 11 Alexandria"
Das mit JSON wäre eine Idee. RTTI ist mir derzeit für mich zu aufwendig. Das soll dann ja auch rekursiv gehen und es muss dann auch eine abgefüllte Instanz davon geben. Als Beispiel für eine Ausgabe:
Delphi-Quellcode:
Destination.Assign(Source);
CheckEquals(Source.Lampen.Count, Destination.Lampen.Count); CheckEquals(Source.Lampe1.Typ, Destination.Lampe1.Typ); CheckEquals(Source.Lampe1.Farbe, Destination.Lampe1.Farbe); CheckEquals(Source.Lampe2.Typ, Destination.Lampe2.Typ); CheckEquals(Source.Lampe2.Farbe, Destination.Lampe2.Farbe); CheckEquals(Source.Lampe3.Typ, Destination.Lampe3.Typ); CheckEquals(Source.Lampe3.Farbe, Destination.Lampe3.Farbe); CheckEquals(Source.Lage.Position.x, Destination.Lage.Position.x); CheckEquals(Source.Lage.Position.y, Destination.Lage.Position.y); CheckEquals(Source.Lage.Position.z, Destination.Lage.Position.z); CheckEquals(Source.Lage.Richtung, Destination.Lage.Richtung); ... |
AW: Alle Eigenschaften einer komplexen Datenklasse
Zitat:
Delphi-Quellcode:
Die Ausgabe von ShowMessage sieht so aus (mORMot berücksichtigt alle published Eigenschaften):
uses
mormot.core.base, mormot.core.data, mormot.core.text, mormot.core.json, mormot.core.variants, mormot.core.unicode, mormot.core.rtti, mormot.core.os; var json: RawJson; docData: TDocVariantData; begin json := ObjectToJson(btnPropInfos, [woHumanReadable, woObjectListWontStoreClassName]); ShowMessage(Utf8ToString(json)); docData.InitJson(json, [dvoAllowDoubleValue]); CheckEquals(..., docData.I['Left']); CheckEquals(..., docData.O['Margins'].I['Left']); initialization RTTI.RegisterClasses([TButton]);
Code:
Bis bald...
{
"Tag": 0, "AlignWithMargins": false, "Left": 24, "Top": 140, "Width": 113, ... "Margins": { "Left": 3, "Top": 3, ... "StyleElements": ["seFont","seClient","seBorder"], Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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