Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Datenmodell automatisch erzeugen (https://www.delphipraxis.net/183844-datenmodell-automatisch-erzeugen.html)

FAM 9. Feb 2015 06:31

Delphi-Version: 5

Datenmodell automatisch erzeugen
 
Hallo Zusammen,

ich bin gerade am überlegen wie ich eine automatische Implementierung eines Datenmodelles, welches korrespondierend mit der auktuellen GUI ist, zu realisieren.

Wenn ich ein Button A in die GUI-Form einfüge soll im Datenmodell eine entsprechende Aktualisierung erfolgen. Ich möchte also immer ein "Live-Abbild" der komplette GUI(-Komponenten-Referenz) haben.

Gibt es dafür irgendwelche (allgemeinen) Ansätze?

mjustin 9. Feb 2015 06:45

AW: Datenmodell automatisch erzeugen
 
Was wäre im konkreten Beispiel im Datenmodell nach dem Hinzufügen des Buttons anschliessend denn als neues Objekt vorhanden?
Angenommen, es gäbe zu Anfang nur ein 'leeres' Datenmodell. Nun füge ich einen Button der GUI hinzu. Wie sieht das Datenmodell danach aus?

FAM 9. Feb 2015 07:24

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von mjustin (Beitrag 1289246)
Was wäre im konkreten Beispiel im Datenmodell nach dem Hinzufügen des Buttons anschliessend denn als neues Objekt vorhanden?
Angenommen, es gäbe zu Anfang nur ein 'leeres' Datenmodell. Nun füge ich einen Button der GUI hinzu. Wie sieht das Datenmodell danach aus?

Datenmodel vor der GUI-Änderung:

Datamodel.Reference.count = 0;

Textfeld wird hinzugefügt:
GUI.Text1FooBar.Name = Text1FooBar

Datenmodel nach der GUI-Änderung:
Datamodel.Data.Text1FooBarData= '';

Datamodel.Reference.count = 1;
Datamodel.Reference['Text1FooBar']['gui'] = @Text1FooBar
Datamodel.Reference['Text1FooBar']['data'] = Datamodel.Data.Text1FooBarData


wenn sich dann im Datenmodel was für Text1FooBarData etwas ändert kann ich das korrespondierende GUI-Element Text1FooBar einfach aktualisieren (BindingRefresher).

Ich möchte einfach eine "GUI-DataModel-Matching" Tabelle automatisch pflegen lassen

FAM 9. Feb 2015 09:10

AW: Datenmodell automatisch erzeugen
 
Habe es jetzt so implementiert.


Delphi-Quellcode:
 

type
  TBinding = packed record
    GUI: TObject;
    DateModelValuePtr: Pointer;
  end;

private
    Bindings: array of TBinding;


implementation

AddBinding(EditContentbarStartMarker, @FViewModel.StartMarker);
AddBinding(EditContentbarEndMarker, @FViewModel.EndMarker);

Add Binding

Delphi-Quellcode:
procedure TForm1.AddBinding(GUIComponent: TObject; DateModelValuePtr: Pointer);
var
  NewBinding: TBinding;

begin

  // Binding Element erstellen
  NewBinding.GUI := GUIComponent;
  NewBinding.DateModelValuePtr := DateModelValuePtr;

  // Neues (globales) Binding erstellen
  SetLength(Bindings, Length(Bindings) + 1);
  Bindings[ High(Bindings)] := NewBinding;

end;
Refresh Binding
Delphi-Quellcode:
procedure TForm1.BindingRefresh;

var
  i: Integer;
  Ptr: ^Integer;
begin

  for i := 0 to High(Bindings) do
  begin
    Ptr := Bindings[i].DateModelValuePtr;
    (Bindings[i].GUI as TEdit).Text := IntToStr(Ptr^);
  end;
end;
entspricht zwar nicht ganz der oben genannten Struktur, aber funktionert.

stahli 9. Feb 2015 11:43

AW: Datenmodell automatisch erzeugen
 
Die Zielsetzung (soweit ich sie verstehe suchst Du eine einfache Bindung zwischen Daten und GUI) kann ich gut nachvollziehen.
Die Realisierung weniger.

Was Du in Deinem array verwaltest scheint mir etwas kritisch zu sein.
In jedem Fall musst Du dafür sorgen, dass das stabil bleibt - auch wenn Controls irgendwann freigegeben werden.

Die LiveBindings haben (oder hatten jedenfalls seinerzeit) damit erhebliche Probleme, so dass andauernd die IDE abgeschmiert ist.
Ich finde daher eine losere Kopplung sinnvoller.


Den Ansatz, das Datenmodell nach der GUI zu gestalten, finde ich auch zweifelhaft. Vom Prinzip könntest Du dann auch das Formular nach TEdit´s durchsuchen und deren Text-Eigenschaften als Datenfeld ansehen.


Besser wäre m.E. einen Klassenexperten zu nutzen, der Dir auf möglichst komfortable Weise Businessklassen und Objekte erzeugt (incl. Speichern und Laden von Daten) und dann einen Weg zu suchen, wie Du die Daten einfach und stabil an die GUI binden kannst.

FAM 9. Feb 2015 14:44

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1289287)
Besser wäre m.E. einen Klassenexperten zu nutzen, der Dir auf möglichst komfortable Weise Businessklassen und Objekte erzeugt (incl. Speichern und Laden von Daten) und dann einen Weg zu suchen, wie Du die Daten einfach und stabil an die GUI binden kannst.


danke für deine Antwort.
kannst du ein wenig mehr über den Klassenexperten sagen?!

mkinzler 9. Feb 2015 14:46

AW: Datenmodell automatisch erzeugen
 
Ich vermute er meint grafische Tools für ORM

stahli 9. Feb 2015 15:20

AW: Datenmodell automatisch erzeugen
 
Genau.
Da haben sich offenbar viele eine Lösung gebaut (ich ja auch mal).

Man gibt dann z.B. einfach die Klassenstruktur an:

Person
- Firstname: String
- LastName: String

Car
- Color: TColor
- Nr: String

Auf Knopfdruck werden dann die Units mit den Klassen erzeugt, die man dann in Delphi kompilieren kann. Der ganze Schreibkram der immer gleichen Funktionalitäten (speichern und laden von Daten und Datenaustausch mit anderen Ebenen) wird dann halt automatisch fertiggestellt. Ergänzen muss man dann nur noch die Businesslogik.

Jedenfalls würde man mit dem Ansatz wirklich das Model definieren (als wenn man die Klassen von Hand schreiben würde, nur dass halt vieles automatisiert wird).

Die GUI kann (und muss) dann unabhängig aufgebaut werden. Natürlich wäre es hilfreich, wenn man dann ein brauchbares Databinding zur Verfügung hätte, das einem wieder Arbeit abnimmt.

Ein MVVM wäre eine weitere Option.


Von einer gebastelten GUI ein Datenmodel ableiten zu wollen, halte ich für keinen guten Ansatz.
Eigentlich sind das wesentlich ja die Daten und BL.
Die GUI ist (lediglich) ein Hilfsmittel, damit der User irgendwie einen Zugang erhalten kann.

hanvas 9. Feb 2015 16:54

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von FAM (Beitrag 1289264)
Habe es jetzt so implementiert.


Delphi-Quellcode:
 

type
  TBinding = packed record
    GUI: TObject;
    DateModelValuePtr: Pointer;
  end;

private
    Bindings: array of TBinding;


implementation

AddBinding(EditContentbarStartMarker, @FViewModel.StartMarker);
AddBinding(EditContentbarEndMarker, @FViewModel.EndMarker);

Probiere es doch mal mit einer Implementierung des MGM Pattern (http://www.atug.com/andypatterns/mgm.htm). TiOPF ( http://tiopf.sourceforge.net/) verwendet/implementiert das ganze in Delphi / FPC.


hth Ha-Jö

FAM 10. Feb 2015 08:32

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1289305)
Genau.
Da haben sich offenbar viele eine Lösung gebaut (ich ja auch mal).

Man gibt dann z.B. einfach die Klassenstruktur an:

Person
- Firstname: String
- LastName: String

Car
- Color: TColor
- Nr: String

Auf Knopfdruck werden dann die Units mit den Klassen erzeugt, die man dann in Delphi kompilieren kann. Der ganze Schreibkram der immer gleichen Funktionalitäten (speichern und laden von Daten und Datenaustausch mit anderen Ebenen) wird dann halt automatisch fertiggestellt. Ergänzen muss man dann nur noch die Businesslogik.

gibt es irgendwo einen Artikel dazu, wie das konkret umzusetzen ist? Wenn ich dich richtig verstehe wird dann einmal initial die Setter und Getter generiert, dann müssten diese kompilierten Units in meinem Source eingebunden / angebunden werden ...

oder ?

Sir Rufo 10. Feb 2015 09:02

AW: Datenmodell automatisch erzeugen
 
Ähm, du weißt doch wie eine Klasse im Delphi-Code aussehen muss?

Jetzt schreibt man sich einen Code-Generator, der aus ein paar Vorgaben diese Klassen komplett erzeugt.

Du gibst vor
Code:
{"name":"TFoo",
[{"Name":"Name","type":"string","GetterSetterKind":"GS"}]}
und das Programme baut daraus
Delphi-Quellcode:
type
  TFoo = class
  private
    FName : string;
    function GetName : string;
    procedure SetName( const Value : string );
  public
    property Name : string read GetName write SetName;
  end;

procedure TFoo.SetName( const Value : string );
begin
  FName := Value;
end;

function GetName : string;
begin
  Result := FName;
end;

stahli 10. Feb 2015 09:04

AW: Datenmodell automatisch erzeugen
 
Wie ich das umgesetzt habe kannst Du hier sehen: http://www.delphipraxis.net/173360-s...framework.html (Beitrag #17)

Einen Artikel dazu kenne ich nicht.
Ich dachte mir einfach, wenn ich immer das selbe schreiben muss (ClassX.pas) dann kann ich mir auch die Textdatei erzeugen lassen.
Entsprechend muss man die genauen Klassen- und Eigenschaftendeklarationen irgendwo kompakt ablegen, so dass die gewünschten Klassen heraus kommen.

Entspricht quasi einfach einer komplexen "Serienbrieffunktion". ;-)

Delphi bietet dann sogar noch die Möglichkeit, die Units gleich in ein Package einzubinden und das zu kompilieren. Jedenfalls funktionierte das bei mir schon mal einigermaßen zufriedenstellend. Ich habe das dann aber nicht mehr weiter verfolgt.

FAM 10. Feb 2015 09:18

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1289355)
Wie ich das umgesetzt habe kannst Du hier sehen: http://www.delphipraxis.net/173360-s...framework.html (Beitrag #17)

ich schau es mir mal an, danke :)

Delphi-Quellcode:
{"name":"TFoo",
[{"Name":"Name","type":"string","GetterSetterKind":"GS"}]}
Ich wusste jetzt nicht das Delphi auch Code generieren kann bzw. habe das bisher noch nicht in betracht gezogen gehabt. Werden dann die entsprechenden Dateien auch gleich richtig gespeichert und abgelegt?

DeddyH 10. Feb 2015 09:20

AW: Datenmodell automatisch erzeugen
 
Das hängt ja davon ab, wie Du den angesprochenen Code-Generator umsetzt.

FAM 10. Feb 2015 09:28

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von DeddyH (Beitrag 1289366)
Das hängt ja davon ab, wie Du den angesprochenen Code-Generator umsetzt.


kannst du das bitte erläutern?

DeddyH 10. Feb 2015 09:34

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1289353)
Jetzt schreibt man sich einen Code-Generator, der aus ein paar Vorgaben diese Klassen komplett erzeugt.

Das macht Delphi nicht automatisch, sondern Du musst selbst tätig werden. Daher liegt es auch an Dir, wo die Dateien gespeichert werden.

Sir Rufo 10. Feb 2015 10:11

AW: Datenmodell automatisch erzeugen
 
@FAM

Eine .pas Datei ist eine einfache stumpfe Textdatei. Schreibe ein Programm, dass eine Textdatei erzeugt. Wenn diese Textdatei jetzt zufälligerweise den Vorgaben für eine Delphi-Unit entspricht, dann hast du - Simsalabim - eine Delphi-Unit erzeugt.

Kann das Programm jetzt auch noch diese ominöse Textdatei nach Vorgaben, die es irgendwo irgendwie herbekommt, was in einem beliebigen Format sein kann, was eben dieses Programm versteht, dann hat man ein Delphi-Unit-Generator geschrieben.

FAM 10. Feb 2015 12:46

AW: Datenmodell automatisch erzeugen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1289383)
@FAM

Eine .pas Datei ist eine einfache stumpfe Textdatei. Schreibe ein Programm, dass eine Textdatei erzeugt. Wenn diese Textdatei jetzt zufälligerweise den Vorgaben für eine Delphi-Unit entspricht, dann hast du - Simsalabim - eine Delphi-Unit erzeugt.

Kann das Programm jetzt auch noch diese ominöse Textdatei nach Vorgaben, die es irgendwo irgendwie herbekommt, was in einem beliebigen Format sein kann, was eben dieses Programm versteht, dann hat man ein Delphi-Unit-Generator geschrieben.

Ok verstanden :)


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