AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi dynamisches Erstellen von Oberfläche und Speicherung in DB ?

dynamisches Erstellen von Oberfläche und Speicherung in DB ?

Offene Frage von "IBExpert"
Ein Thema von Berndd · begonnen am 15. Jan 2004 · letzter Beitrag vom 8. Okt 2018
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#1

Re: dynamisches Erstellen von Oberfläche und Speicherung in

  Alt 19. Jan 2004, 07:42
Zitat von Berndd:
Habe mich nun auch mit dem dynamischen Erstellen von Komponenten befasst.
Kann schon die Buttons in der Laufzeit erstellen. Bekomme es aber leider absolut nicht hin, diese anzusprechen(/ihnen OnClick ereignisse zuzuweisen) oder sie auf die TabControls Komponente zu bringen.
...
Das is schon das nächste Problem, die TabControls Komponente. Wie kann ich bei dieser in der Laufzeit neue Tabs/Reiter erstellen, den einzelnen Tabs Namen zuweisen und die Buttons gleichzeitig drauf platzieren.
Du erstellst eine Methode auf dem Formular:
Delphi-Quellcode:
procedure TForm1.DynButtonClick(sender: TObject);
begin
   if sender is TButton then
   begin
      // hier die Methodik - z.B. Button erkennen
   end;
end;
Beim erstellen der Buttons machst Du ja sowas wie:
Delphi-Quellcode:
var
   myVar: TButton;
begin
   myVar := TButton.Create(self);
   myVar.Parent := TTabPage1; // der 'Parent' ist die TabPage, auf der der Button erscheinen soll
   myVar.OnClick := DynButtonClick; // hier die OnClick - Methode.
   myVar.Name := 'Button'; // anhand des Namens kannst Du oben in der OnClick - Methode den Button identifizieren: ( TButton(sender).Name )
end;
Der Code ist freilich nicht getestet, sollte aber den Ablauf prinzipiell erklären. Die Methode wird übrigens für _jeden_ Button zugewiesen, d.H. Du musst tatsächlich über den Sender herausfinden, welcher Button gedrückt wurde.

Ich würde in Deinem Fall empfehlen, den Button eine Konstante und eine durchlaufende Nummer zu geben. Mit Hier im Forum suchenFindcomponent kannst Du den Button wieder finden und damit arbeiten.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
mbulm1

Registriert seit: 3. Okt 2018
24 Beiträge
 
#2

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 3. Okt 2018, 16:18
Hallo,

ich finde das Thema sehr interessant!
Grundsätzliche habe ich aber 2-3 Verständnisfragen:

1. Bei "myVar := TButton.Create(self);" Wie speichere ich "TButton.Create(self)" in der DB ab und wie kann ich das dann nachher aus der DB an myVar zuweisen?

2. Wie kann ich das was eine "OnClick-Procedure oder -Function" machen soll - ebenfalls aus der DB holen und zuweisen?

Vielen Dank vorab!

Beste Grüße

mbulm1

Geändert von mbulm1 ( 3. Okt 2018 um 16:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#3

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 3. Okt 2018, 16:54
Ich für meinen Teil mache das schon seit Jahren so in der Art, aber bei mir sind Tabellenfelder immer der Grund dafür, das es bestimmte Controls gibt, text blobs werden als Tmemo erzeugt, varchar als TEdit, Datum als TDateEdit usw.

Alle Infos bekommst du auf dem Weg über die TField Objekte aus einem Dataset, wenn du einfach mit select * from tabelle die Daten holst und dann auf dem offenen Dataset durch fields[i] gehst mit i<fieldcount. Das TField Objekt liefert dir ggf über die Property classname ausreichend Infos, um dann zu entscheiden was kommen soll (für jedes Feld erzeuge ich dann auch noch automatisch ein TLabel als Caption).

In der DB hab ich dann in einer tabelle die positionen gespeichert, das sieht dann in etwa so aus

Code:
cbxARCLADEN_CB.LEFT=178
cbxARCLADEN_CB.TOP=950
cbxARCLADEN_CB.WIDTH=26
cedARBEITSGANG_POSDIFF.HILFE=leeres Feld = Ag an letzter Stelle , -1 = AG an vorletzter Stelle etc.
cedARBEITSGANG_POSDIFF.LEFT=439
cedARBEITSGANG_POSDIFF.TOP=438
cedARBEITSGANG_POSDIFF.WIDTH=56
cedAUSLASTUNGMAPROZ.HILFE=Zu wieviel % seiner Arbeitszeit ist der AV hier beschäftigt?
cedDLZ.HILFE=auf 1 setzen, um neu zu berechnen
cedDLZ.LEFT=440
cedDLZ.WIDTH=55
dteBELEGDATUM.LEFT=112
dteBELEGDATUM.TOP=30
dteBESTELLDATUM.LEFT=112
dteBESTELLDATUM.TOP=346
dteLIEFERTERMIN.LEFT=112
dteLIEFERTERMIN.TOP=865
edtAB_CALC.LEFT=113
edtAB_CALC.TOP=731
edtAB_CALC.WIDTH=77
edtANGEBOT_ID_.HILFE=Verknüpfung löschen: Shift + Lupe / leer suchen / leer übernehmen
edtANGEBOT_ID_.LEFT=114
edtANGEBOT_ID_.TOP=692
edtANGEBOT_ID_.WIDTH=226
edtARBEITSVORBEREITUNG_ID_.LEFT=112
edtARBEITSVORBEREITUNG_ID_.TOP=318
edtARBEITSVORBEREITUNG_ID_.WIDTH=48
Beim Erzeugen des Formulars lese ich die Daten aus dem Datenbankfeld Blob Sub_type text die daten in eine TStringlist und über Feldname und Komponenten Präfix such ich mir aus der TStringlist mit Values dann die Werte raus, die mein Code zum jeweiligen Feld bereits kennt (Meinen Eintrag .HILFE kann man zB. im Hint oder in einer Statusbar anzeigen, die kann der Endkunde selber ergänzen).

Die Properties kannst du dir ggf. alle durch eine Objektinspektor Komponente anzeigen lassen oder so wie ich das mach, einfach nur some basic functions wie positionieren erlauben (bei meiner Software schaltet der Kunde, sofern berechtigt, die exe in den Designmode, klickt die Felder an, die er neu positionieren möchte (die wechseln dann einfach in background color rot und werden bei onclick in eine TList gepackt. Mit Ctrl+Cursortasten kann er nun left und top aller gewählter Komponenten pixelweise verändern und mit Alt+cursortasten height und width. Wenn er zurück vom Deignmodus in den Normalmodus schaltet, klapper ich auf dem Form alle components[i] bis i<componentcount ab und schreib die mir relevanten eigenschaften zurück die die TStringlist Values und den kompletten inhalt wieder zurück in die DB, so das dann beim nächsten Aufbau des Formulars die position in onshow wieder so legen kann, wie der Kunde das wollte, ohne das ich irgendwas neu compilieren muss.

Mein Kunde (der keine Programmierkenntnisse hat) nutz das Verfahren gerne und stellt sich die Formulare damit so um wie er will. Teilweise werden unwichge Felder hinter andere gelegt, man könnte aber auch visible unterstützen etc.

Der Vorteil, das über die Datenbankfelder zu machen liegt darin, das du die zum Speichern ggf eh brauchst und ich neue Felder in einer Tabelle ergänzen kann und die sofort beim nächsten Aufruf im Form sind. Wenn die noch keine Positionsdaten in der o.a. TStringlist haben, werden die einfach sequentiell am Ende vom Form angelegt. Taborder läuft bei mir über die Eigenschaft top, also immer von oben nach unten. Von Hand eingetragen werden zum Beispiel Attribute wie Readonly wenn sich die nicht eh schon aus dem TField ergeben und die brauchen eh kein Tabstop.

Es hindert dich aber auch niemand dran, einfach mal ein eigenes Format zu entwickeln und dabei dann einfach so was wie
Edit1=TEdit
Label2=TLabel
aus einem Text auszulesen und durch if then else oder andere Konstrukte passende Instanzen zu erstellen (in der TStringlist kannst du mit names[i] finden wie der Eintrag heisst und mit values[i] dann eben sehen, was rechts neben dem gleich steht).

wenn der Kram aber auch irgendwo in einer DB gespeichert werden soll muss ggf dein code auch das anpassen oder erstellen der Tabellen mit übernehmen, so das 2 Referenzen zusammen passen müssen. Mein Ansatz ermöglicht es, völlig unterschiedliche Datenmodelle mit der gleichen exe zu öffnen und zu visualisieren,

Ich hab meine Exe daher im Prinzip so ähnlich ausgelegt wie ein webbrowser, nur das der eben nicht mit html/http/webserver kommuniziert, sondern direkt mit einer DB.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#4

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 3. Okt 2018, 16:58
wenn du mehr auf fertige Komponenten setzen willst, dann schau dir zum Beispiel diese varianten an
https://www.fast-report.com/de/product/fast-script/
https://www.tmssoftware.com/site/scriptstudio.asp

Damit kannst du nahezu alles unbegrenzt zur Laufzeit machen, aber eigentlich ist man dann ganz schnell auf dem Level,
das der Anwender der eigenen Software, der diese Features benutzen soll, das gleiche wissen muss wie du selber
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
689 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 3. Okt 2018, 18:20
Wir haben das damals über den Stream writer gemacht, mit TStream.ReadComponent und TStream.WriteComponent, bei ReadComponent aber drauf achten, dass er die komponenten neu erzeugt, falls du auf dem Formular schon was hast, was standardmässig da ist.
Den Stream dann als Blob in die DB schreiben.
Das setzt übrigends auch die events, wenn ich mich recht entsinne (schon 15 Jahre her)
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
302 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 4. Okt 2018, 06:07
Der Vorteil, das über die Datenbankfelder zu machen liegt darin, das du die zum Speichern ggf eh brauchst und ich neue Felder in einer Tabelle ergänzen kann und die sofort beim nächsten Aufruf im Form sind.
Moin IBExpert!

Das kenn ich unter dem Schlagwort: data driven software.

Ich habe aber folgenden Frage dazu: Woher bekommst Du denn anschließend die Anwendung dazu? Das Du auf die Art und Weise Felder in die Anwendung bekommst, ist schon klar. Aber was machst Du mit dem Feld dann? Nehmen wir an Du erzeugst ein neues TEdit. Ok. Nun hat der Anwender ein neues Eingabefeld und schreibe da z. B. "Peter" rein. Und nun? Was macht die Software nun mit "Peter"? Wie legst Du diese Information nun beispielsweise in einer DB ab, ohne Dein Programm zu ändern und ohne es neu zu compilieren? Irgendwoher müsste ja nun ein INSERT oder ein UPDATE kommen, der den "Peter" in die DB schreibt - oder?

Gruß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 4. Okt 2018, 06:55
Das sind 2 verschiedene Dinge. Das eine ist es die Oberflächenelemente aus einer Datenbank zu Streamen.
Datenbindung ist ja eine andere Baustelle.
Hier unterscheidet sich eine Oberfläche, welche sich aus einer DB erzeugt wurde nicht von einer, welche aus einer Ressource der Exe geladen wird.
Markus Kinzler
  Mit Zitat antworten Zitat
mbulm1

Registriert seit: 3. Okt 2018
24 Beiträge
 
#8

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 4. Okt 2018, 14:51
Hallo Jungs,

ich muss meine Fragen etwas aufteilen - sonst kann ich die Antworten nicht mehr zuordnen!

1. Ihr habt gute Ideen und danke für Eure Hinweise - aber ich habe noch keinen Plan - wie ich zum Beispiel ein "ONCLICK"-Ereignis in der DB abspeichere?
Eigentlich muss ich den Quellcode doch vorher schon in einer Procedure ablegen und dann dem Button diese Procedure zuweisen - aber ich muss vorher schon wissen - was der Button machen soll - oder?

2. Gibt es bei Lazarus auch ein TDataset oder was Vergleichbares - ich finde es nicht!

3.
Wir haben das damals über den Stream writer gemacht, mit TStream.ReadComponent und TStream.WriteComponent, bei ReadComponent aber drauf achten, dass er die komponenten neu erzeugt, falls du auf dem Formular schon was hast, was standardmässig da ist.
Den Stream dann als Blob in die DB schreiben.
Das setzt übrigends auch die events, wenn ich mich recht entsinne (schon 15 Jahre her)
Wie geht das genau?

Danke vorab!
Beste Grüße
mbulm1
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 4. Okt 2018, 14:56
Zitat:
ich muss meine Fragen etwas aufteilen - sonst kann ich die Antworten nicht mehr zuordnen!
Am Besten in einem neuen Thread.
Markus Kinzler
  Mit Zitat antworten Zitat
mbulm1

Registriert seit: 3. Okt 2018
24 Beiträge
 
#10

AW: dynamisches Erstellen von Oberfläche und Speicherung in DB ?

  Alt 8. Okt 2018, 16:38
1. Ihr habt gute Ideen und danke für Eure Hinweise - aber ich habe noch keinen Plan - wie ich zum Beispiel ein "ONCLICK"-Ereignis in der DB abspeichere?
Eigentlich muss ich den Quellcode doch vorher schon in einer Procedure ablegen und dann dem Button diese Procedure zuweisen - aber ich muss vorher schon wissen - was der Button machen soll - oder?
Hallo nochmal - gibt es dafür auch eine Lösung oder habe ich was überlesen?
Danke!
BG MB
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz