Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Projektvorschlag Automatische Datenbank Eingabemasken (https://www.delphipraxis.net/181475-projektvorschlag-automatische-datenbank-eingabemasken.html)

delphifan2004 19. Aug 2014 09:01


Projektvorschlag Automatische Datenbank Eingabemasken
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

ich beschäftige mich gerade damit, automatische Datensatz-Eingabemasken zu erzeugen. Wie wir alle wissen, erscheint in der Delphi Datenbankoberfläche je nach Anzahl der Datenfelder in der konkreten Datenbankdatei immer die richtige Anzahl Eingabefelder für den Datensatz. Dies war im guten alten DBase zu DOS Zeiten genauso. Je nach Anzahl der Datenfelder hatten wir die richtige Anzahl Eingabefelder auf dem Bildschirm. Das will ich nun mit Delphi auch haben, noch dazu mit für den jeweiligen Feld-Datentyp passenden Eingabefeldern. Für ein Boolean Feld zum Beispiel eine TCheckBox für einen Bild-Datentyp ein TImage, ...

Mein Ansatz ist folgender:

- ich habe zunächst eine Unit gebaut mit einer TCustomInputmask-Klasse, die von TScrollBox abstammt.
- Diese Inputmask stellt Methoden bereit, die später die Datenfelder erzeugen.
- Eine nachfolgende TInputmask Klasse kann für Pascal Records dieselbe Aufgabe erfüllen.

- Es folgt eine weitere Unit für die DBInputmask. Hier kommen die Daten von einer TDataSource Komponente. Die Eingabefelder hängen nun vom Datentyp des konkreten Feldes in DataSource.DataSet.Field.DataType ab.


Verbesserungsvorschläge sind jederzeit willkommen. Das Ganze soll GPL werden und somit OpenSource.

DP-Maintenance 19. Aug 2014 09:45

Dieses Thema wurde am "19. Aug 2014, 10:45 Uhr" von "mkinzler" aus dem Forum "Klatsch und Tratsch" in das Forum "Software-Projekte der Mitglieder" verschoben.

Dejan Vu 19. Aug 2014 09:45

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Nur mal so ins Blaue: Wie ist das mit Foreign-Key Beziehungen? muss man da manuell eingreifen oder wie sieht das aus?
Schade, das Du eventuelle Konfigurationen in die Feldnamen kodieren willst. Hier wäre eine separate Konfiguration sinnvoller. Wieso sollte ich meine hübschen Feldnamen verhunzen, nur um dein Tool verwenden zu können? ;-)

Boolean können immer zu Checkboxen werden.
Integer immer zu Eingabefeldern (TMaskEdit oder ein TNumericEdit)
Double/Real etc. immer zu Eingabefeldern mit Nachkommastellen. Die Anzahl der Vor- und Nachkommastellen kannst Du manchmal aus dem SQL-Datentyp extrahieren (Numeric (X,Y), Decimal(X,Y))
VarChar werden zu Eingabefeldern. Die maximale Eingabelänge kannst du auch extrahieren
DateTime wird zu einem Datetimepicker.
Image/BLOB als TImage
Text/BLOB als TMemo etc.

Damit kommst du schon mal ziemlich weit. Fehlen noch Comboboxen bzw. Radiogroups. Dahinter verbergen sich manchmal Lookuptabellen (FK) und manchmal ist das einfach eine Spalte mit einer von N Ausprägungen (Rot, Grün, Blau, oder R,G,B oder 1,2,3). Da müsstest Du dir überlegen, wie Du hier eine Konfiguration anlegst. Sinnvoll wäre das wirklich in einer separaten Konfigurationsdatei.
Code:
[FarbenFeld]
Values=R|Red;G|Green;B|Blue
Control=ComboBox

[GeschlechtFeld]
Values=1|Männlich;2|Weiblich;3|Mix;4|Weiss ich noch gar nicht
Control=RadioGroup

[ZahlenFeld]
Format=#,0.00
Und dann gibt es da noch die Foreign-Keys, also Fremdschlüssel. Wenn Du einen Kundendatensatz hast, und der hat jetzt z.B. ein Adressfeld (ist blöd, der hat i.A. mehrere, aber egal jetzt), dann müsste man das erkennen (das Feld ist ja ein FK) und als Control könnte man einen Button anzeigen, bei dem dann deine Eingabemaske der referenzierten Tabelle aufgeht. Usw.

So, wie Du das jetzt machst, ist das Einsatzgebiet -sagen wir mal- begrenzt.

mkinzler 19. Aug 2014 09:49

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Ich habe den Code in den Anhang gepackt und das Thema verschoben. Hier ist es besser aufgehoben. Der 1. Beitrag bleibt bearbeitbar, so dass neuere Versionen leicht hier hinterlegt werden können.

Dejan Vu 19. Aug 2014 10:23

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Wenn Du ihn noch aus dem Beitrag geschnippelt hättest, wäre es vielleicht noch besser. Denn so gibt es immer eine Diskrepanz zwischen gezeigtem (alten) und upgedatetem Code (im Anhang)

delphifan2004 19. Aug 2014 12:10

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
@MKinzler:

Danke für das Verschieben in eine passendere Rubrik. Ich war mir nicht sicher, wohin ich den Beitrag schreiben sollte. Und nun kann ich auch neuere Versionen als Anhänge in meinem Beitrag speichern. :wink:

@Dejan Vu:
Danke auch Dir für Deine Anregungen!
Mit Foreighn Keys habe ich mich in diesem Zusammenhang noch gar nicht beschäftigt. Woran erkennt man ein Schlüsselfeld überhaupt in der Datenbank?

Ok, mit einer externen Konfigurationsdatei könnte ich das Problem vielleicht lösen, aber dann doch wohl nur spezifisch für meine konkrete Datenbankanwendung? Wenn aber das Schlüsselfeld als solches in der DB Datei codiert wäre...

Wenn ich eine Master Detail Beziehung im Objektinspektor herstelle, wähle ich in der Detailtabelle das Masterfeld/die Masterfelder aus. Wenn ich dann die Datensätze per DBGrid in der Mastertabelle anwähle, erhalte ich in der Detailtabelle die richtigen Datensätze, in denen der Inhalt des Masterfeldes/der Masterfelder mit dem Inhalt des gleichnamigen Feldes/der gleichnamigen Felder der Detailtabelle übereinstimmt. Aber woher weiß meine Mastertabelle dann von dieser Verknüpfung? Wo gibt es da Quellcodebeispiele. Ich sehe, der OI ist zwar bequem, aber hier kann ich eine Anregung in Quellcode, der so eine Master/Detail Beziehung realisiert, gut gebrauchen. Ich würde da die Eigenschaft Masterfields belegen, aber wie sieht das syntaktisch dann im Quelltext aus?

Im Objektinspektor habe ich ja dazu den Feldverbindungs-Designer. Der Quelltext zur Laufzeit dürfte anders aussehen, aber wie?

Dann aber habe ich immer noch keine Vorstellung, wie eine Eingabmaske da ein Schlüsselfeld erkennen soll. Geht doch dann nur für die Detailtabelle und dann auch nur mit enger Verzahnung mit der konkreten Anwendung anstatt sauberer Trennung Datenbank von Oberfläche?. Gibt es da Ansätze, die ich mir anschauen sollte/kann?

Dejan Vu 19. Aug 2014 12:58

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Die Foreign-Keys bekommst Du entweder auch über deine Konfig-Datei heraus, oder Du fragst das RDBMS. Das gibt dir (jedenfalls die meisten) ausführliche Informationen über Tabellen, Felder, Beziehungen usw.

jobo 19. Aug 2014 13:03

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Referential Contraints und einiges andere kannst Du über das Information Schema auslesen. Leider kochen hier die Anbieter trotz Standardisierung gern ihr eigenes Süppchen.
http://en.wikipedia.org/wiki/Information_schema
http://www.sqlusa.com/bestpractices/..._schema_views/

Die verschiedenen Anbieter haben natürlich auch ihre eigenen Dictionaries, die ggF. mehr bieten oder z.B. schneller antworten.

In meiner Lieblings-IDE zu meiner Lieblings DB bekomme ich FK Felder automatisch als Lookup angezeigt, wenn ich auf die bloße Tabelle zugreife und im Edit Mode bin.

Jumpy 19. Aug 2014 15:16

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Zitat:

Zitat von jobo (Beitrag 1269073)
In meiner Lieblings-IDE zu meiner Lieblings DB bekomme ich FK Felder automatisch als Lookup angezeigt, wenn ich auf die bloße Tabelle zugreife und im Edit Mode bin.

Das klingt ja fast nach Access :-D

Sherlock 19. Aug 2014 15:23

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Woher kommen die Beschriftungen der Controls? Wie wird mit dem zur Verfügung stehenden Platz umgegangen (Mehrspaltigkeit?)? Wie legst Du die Reihenfolge der Felder fest? Wir setzen begrenzt das TwwRecordViewPanel von Woll2Woll ein, das wohl das gleiche tut aber wirklich schön wird das nicht.
Ich bin kein Freund von automatisch erstellten Formularen aufgrund einer DB-Struktur. Dann doch lieber von Hand "liebevoll" zusamengeklickert. Aber als Projekt an sich, ist das sicherlich ne schöne Sache.

Sherlock

jobo 19. Aug 2014 21:33

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Zitat:

Zitat von Jumpy (Beitrag 1269096)
Zitat:

Zitat von jobo (Beitrag 1269073)
In meiner Lieblings-IDE zu meiner Lieblings DB bekomme ich FK Felder automatisch als Lookup angezeigt, wenn ich auf die bloße Tabelle zugreife und im Edit Mode bin.

Das klingt ja fast nach Access :-D

Wir haben mal tolle Sachen mit access gemacht, aber das ist lange her, das war access 97. Hatte ich aber fast nichts mit zu tun.

Meine Lieblingsdb ist Oracle.

Wir verwenden übrigens auch dynamisch erstellte Formulare. Das ist vor allem kostengünstig und ermöglicht eine sehr hohe Umsetzungsgeschwindigkeit. Schön ist ein anderes Thema. Aber das kann der Kunde sich ja aussuchen.
Lookups erstellen wir dabei allerdings nicht anhand von FK Constraints automatisch, sondern gezielt deklarativ, so wie sie benötigt werden.

delphifan2004 21. Aug 2014 09:48

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

hier ist die Nachfolgeversion meines Eingabemasken Generators. Keyfelder sind noch nicht berücksichtigt, aber die Erzeugung der Feldtypabhängigen Eingabe-Controls dagegen schon.

Überschrieben werden nur noch die Methoden DoCreateXXXX.

Zum Beispiel DoCreateDBEdit, DoChreateDBCheckBox, ...

Jetzt geht es weiter.

Es gibt eine Methode Adjust(Control), wie folgt definiert:

Delphi-Quellcode:
procedure TInputmask.Adjust(AControl: TControl);
begin
  case FLabAlignmt of
   alLabelLeft: FCurrentLeft := FCurrentLeft + FHorSpacing;
   alLabelRight: FCurrentLeft := FCurrentLeft + FHorSpacing + FEdtSpacing;
   alLabelTop: FCurrentTop := FCurrentTop + AControl.Height + FVertSpacing;
  end;
end;

//FCurrentLeft,FCurrentTop werden in den DoCreateXXXX Methoden angepasst.

//Hier ist mein Testformular:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, UDBInputMask, DB, DBTables, DBClient;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    Bezeichnung: TClientDataSet;          
    BezeichnungBezeichnung: TStringField;  //Mit MyBase -> TClientDataSet -> Feld Bezeichnung
    BezeichnungMenge: TIntegerField;       //Mit MyBase -> TClientDataSet -> Feld Menge
    BezeichnungBestellt: TBooleanField;    //Mit MyBase -> TClientDataSet -> Feld Bestellt
    BezeichnungBeschreibung: TMemoField;   //Mit MyBase -> TClientDataSet -> Feld Beschreibung
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FMask: TDBInputMask;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  FMask := TDBInputMask.Create(self);
  FMask.DataSource := DataSource1;
  FMask.LabelSpacing := 3;
  FMask.Left  := 3;
  FMask.Top   := 8;
  FMask.Width := ClientWidth - 6;
  FMask.Height := ClientHeight - 56;
  FMask.CreateMask;
  FMask.Parent := self;
end;

end.
Leider kann ich meinen ersten Beitrag nicht mehr bearbeiten, das heißt, den Text ändern geht, aber ich kann keine Dateianhänge nizufügen, deshalb die neue Version hier.

.

mkinzler 21. Aug 2014 09:51

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Bitte bearbeite den 1. Beitrag:
-Entferne die Sourcen (aus Beitrag)
-Übersicht über Projekt
-Versions/Änderungsübersicht

und hänge die neue Version(en) an diesen Beitrag an.

Danke.

delphifan2004 21. Aug 2014 10:04

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Sourcen sind raus aus dem ersten Beitrag, Neue Dateien als Anhang dranhängen kann ich nicht, leider, dazu fehlt das Büroklammernsymbol, auf das ich sonst hierzu klicke. Ich kriege dieses Projekt nicht bezahlt und werde deshalb nicht in den Tiefen der Menüs der DP diese Funktion suchen, wie ich das als bezahlter Programmierer vielleicht tun müsste. So bleibt die neue Version meiner Inputmask Units jetzt in diesem neuen Beitrag oder einer von Euch transferiert die in meinen ersten Beitrag. In diesem Eingabememo hier ist oben das Büroklammersymbol zu sehen, das ich zum Anhängen von Dateien anklicken muss, beim Editieren meines ersten Beitrages nicht mehr. Sorry. Habe jetzt noch andere Termine.

mkinzler 21. Aug 2014 10:12

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dies ist nur im erweiterten Beitragseditor möglich. In diesem gelangt man, in dem man bearbeiten doppelklickt (statt einfach) oder im einfachen Editor in den erweiterten wechselt

joehd 19. Mai 2019 17:25

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Ich suche eigentlich so was auch wenn der Beitrag schon älter ist gibt es da eine Anleitung wie das gemacht werden soll das die Eingabemaske erzeugt wird ? Danke schon mal
Grüße joe

hoika 19. Mai 2019 18:48

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Hallo,
also ich baue mir meine Eingabefelder selbst zusammen.

joehd 20. Mai 2019 07:23

AW: Projektvorschlag Automatische Datenbank Eingabemasken
 
Zitat:

Zitat von hoika (Beitrag 1432557)
Hallo,
also ich baue mir meine Eingabefelder selbst zusammen.

Das mache ich ja auch so aber es wäre doch cool wenn man eine Hand voll eingabekomponenten gemäß der Datenbank ggf SQL Source schon automatisch hätte. Zb. Anlegen eines Records, anlegen der Eingabefelder, Löschen der Eingaben, Löschen des Records , aufruf und abspeicherfunktionen . Das ist immer viel geschreibsel und wehe eine Kleinigkeit ist falsch ...


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