AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alle Eigenschaften einer komplexen Datenklasse

Ein Thema von freimatz · begonnen am 30. Nov 2022 · letzter Beitrag vom 6. Dez 2022
Antwort Antwort
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#1

Alle Eigenschaften einer komplexen Datenklasse

  Alt 30. Nov 2022, 14:05
Delphi-Version: 5
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 30. Nov 2022, 18:47
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?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 3. Dez 2022, 09:50
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.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#4

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 5. Dez 2022, 23:29
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
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 6. Dez 2022, 06:21
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...
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 6. Dez 2022, 10:30
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);
...
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#7

AW: Alle Eigenschaften einer komplexen Datenklasse

  Alt 6. Dez 2022, 14:13
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:17 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