Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Alle Eigenschaften einer komplexen Datenklasse (https://www.delphipraxis.net/211999-alle-eigenschaften-einer-komplexen-datenklasse.html)

freimatz 30. Nov 2022 13:05

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:

Der schöne Günther 30. Nov 2022 17:47

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?

freimatz 3. Dez 2022 08:50

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.

mytbo 5. Dez 2022 22:29

AW: Alle Eigenschaften einer komplexen Datenklasse
 
Zitat:

Zitat von freimatz (Beitrag 1515658)
ich möchte für eine Klasse etwas schreiben das alle Eigenschaften derselben benutzt. (Vorerst ein unit-test)

Ich verstehe nicht, was du machen willst. Mit Eigenschaften meinst du Properties? Was meinst du mit "benutzt"? Mit RTTI lässt sich einiges bewerkstelligen:
Delphi-Quellcode:
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;
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.

Bis bald...
Thomas

Lemmy 6. Dez 2022 05:21

AW: Alle Eigenschaften einer komplexen Datenklasse
 
Zitat:

Zitat von freimatz (Beitrag 1515810)
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.


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...

freimatz 6. Dez 2022 09:30

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);
...

mytbo 6. Dez 2022 13:13

AW: Alle Eigenschaften einer komplexen Datenklasse
 
Zitat:

Zitat von freimatz (Beitrag 1515871)
Das mit JSON wäre eine Idee.

Mit mORMot und DocVariant kommst du für die Klasse TButton so zum Ziel:
Delphi-Quellcode:
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]);
Die Ausgabe von ShowMessage sieht so aus (mORMot berücksichtigt alle published Eigenschaften):
Code:
{
  "Tag": 0,
  "AlignWithMargins": false,
  "Left": 24,
  "Top": 140,
  "Width": 113,
...
  "Margins":
  {
    "Left": 3,
    "Top": 3,
...
  "StyleElements": ["seFont","seClient","seBorder"],
Bis bald...
Thomas


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