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.