AGB  ·  Datenschutz  ·  Impressum  







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

TClientDataSet aus Klassenstruktur

Ein Thema von hzzm · begonnen am 25. Apr 2019 · letzter Beitrag vom 25. Apr 2019
Antwort Antwort
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#1

TClientDataSet aus Klassenstruktur

  Alt 25. Apr 2019, 08:48
Delphi-Version: 10 Seattle
Gibt es eine Moeglichkeit, ein TClientDataSet automatisch aus einer Objekt-Struktur zu bestuecken?
Ich will vermeiden, fuer eine Klasse
Delphi-Quellcode:
type
  TIngredient = class(TCollectionItem)
  private
    FName, // <<---
    FArticleNumber,
    FScaleUnit,
    FBarcode,
    FCategory: String;
  published
    property Name: String read FName write FName; // <<---
    property ArticleNumber: String read FArticleNumber write FArticleNumber;
    property ScaleUnit: String read FScaleUnit write FScaleUnit;
    property Barcode: String read FBarcode write FBarcode;
    property Category: String read FCategory write FCategory;
  end;

  TIngredients = class(TPersistent)
  private
    FIngredients: TCollection;
  public
    constructor Create;
    destructor Destroy;
    procedure Read;
    procedure Write;
    function GetIngredient(Index: Integer): TIngredient;
    procedure SetIngredient(Index: Integer; Value: TIngredient);
    property Item[Index: Integer]: TIngredient read GetIngredient write SetIngredient; default;
  published
    property Items: TCollection read FIngredients write FIngredients;
  end;
ein TClientDataSet ausfuehrlich mit TClientDataSet.FieldDefs.Add('Name', ftString, 0, False); // <<--- etc. zu bestuecken.

Ich will die Klasse TIngredient angeben und die FieldDefs automatisch aus den published properties ableiten lassen.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TClientDataSet aus Klassenstruktur

  Alt 25. Apr 2019, 09:21
Gibt es eine Moeglichkeit, ein TClientDataSet automatisch aus einer Objekt-Struktur zu bestuecken?
Ich will vermeiden, fuer eine Klasse
Delphi-Quellcode:
type
  TIngredient = class(TCollectionItem)
  private
    FName, // <<---
    FArticleNumber,
    FScaleUnit,
    FBarcode,
    FCategory: String;
  published
    property Name: String read FName write FName; // <<---
    property ArticleNumber: String read FArticleNumber write FArticleNumber;
    property ScaleUnit: String read FScaleUnit write FScaleUnit;
    property Barcode: String read FBarcode write FBarcode;
    property Category: String read FCategory write FCategory;
  end;

  TIngredients = class(TPersistent)
  private
    FIngredients: TCollection;
  public
    constructor Create;
    destructor Destroy;
    procedure Read;
    procedure Write;
    function GetIngredient(Index: Integer): TIngredient;
    procedure SetIngredient(Index: Integer; Value: TIngredient);
    property Item[Index: Integer]: TIngredient read GetIngredient write SetIngredient; default;
  published
    property Items: TCollection read FIngredients write FIngredients;
  end;
ein TClientDataSet ausfuehrlich mit TClientDataSet.FieldDefs.Add('Name', ftString, 0, False); // <<--- etc. zu bestuecken.

Ich will die Klasse TIngredient angeben und die FieldDefs automatisch aus den published properties ableiten lassen.
Eine fertige Lösung kenne ich nicht dafür, aber ein prinzipielles Problem ist das nicht. Für published properties wird seit Delphi 1 runtime type information erzeugt (siehe unit TypInfo), also ist es relative einfach, sich eine Klasse zu schreiben, die für beliebige Objekte einen passenden TClientDataset konfigurieren und die published properties darin speichern bzw. daraus lesen kann.
Peter Below
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: TClientDataSet aus Klassenstruktur

  Alt 25. Apr 2019, 09:29
Eine fertige Lösung kenne ich nicht dafür, aber ein prinzipielles Problem ist das nicht. Für published properties wird seit Delphi 1 runtime type information erzeugt (siehe unit TypInfo), also ist es relative einfach, sich eine Klasse zu schreiben, die für beliebige Objekte einen passenden TClientDataset konfigurieren und die published properties darin speichern bzw. daraus lesen kann.
Jo, ich dachte ich koennte kurzerhand vermeiden, das selbst auszucoden.
Kann aber echt nichts fertiges finden. Komisch, das Problem stellt sich sicher oefters...

Danke fuers Lesen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#4

AW: TClientDataSet aus Klassenstruktur

  Alt 25. Apr 2019, 09:36
In seinem Buch Mastering Delphi 7 beschreibt Marco Cantú im Kapitel A Dataset of Objects eine Methode dafür:


Delphi-Quellcode:
procedure TMdObjDataSet.InternalInitFieldDefs;
var
  i: Integer;
begin
  if FObjClass = nil then
    raise Exception.Create ('TMdObjDataSet: Unassigned class');
   
  // field definitions
  FieldDefs.Clear;
  nProps := GetTypeData(fObjClass.ClassInfo)^.PropCount;
  GetMem(PropList, nProps * SizeOf(Pointer));
  GetPropInfos (fObjClass.ClassInfo, PropList);
   
  for i := 0 to nProps - 1 do
    case PropList [i].PropType^.Kind of
      tkInteger, tkEnumeration, tkSet:
        FieldDefs.Add (PropList [i].Name, ftInteger, 0);
      tkChar: FieldDefs.Add (PropList [i].Name, ftFixedChar, 0);
      tkFloat: FieldDefs.Add (PropList [i].Name, ftFloat, 0);
      tkString, tkLString:
        FieldDefs.Add (PropList [i].Name, ftString, 50); // TODO: fix size
      tkWString: FieldDefs.Add (PropList [i].Name, ftWideString, 50);
        // TODO: fix size
    end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#5

AW: TClientDataSet aus Klassenstruktur

  Alt 25. Apr 2019, 09:43
In seinem Buch Mastering Delphi 7 beschreibt Marco Cantú im Kapitel A Dataset of Objects eine Methode dafür
Boah. Vielen, vielen Dank!
  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 02:49 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