PDA

Vollständige Version anzeigen : Controls dynamisch erstellen


MarcHüfing
27.09.2005, 16:50
Hallo,
ich möchte für meine Formulare mit einer zentralen Funktion jeweils eine Listenansicht (Endlosformular oder Datenblatt) erstellen. Ich hatte mir das so vorgestellt, dass ich dieser Funktion das Quell Formular übergebe, durch die Funktion ein neues Formular mit allen Datenfeldern des Quell Formulars erstellt und in der Endlosansicht dargestellt wird. Ich möchte halt nicht für jedes Einzelformular eine Endlosdarstellung entwickeln müssen.
Das folgende Beispiel zur Erstellung von Controls habe ich in der VBA Hilfe gefunden.

Sub NewControls()
Dim frm As Form
Dim ctlLabel As Control, ctlText As Control
Dim intDataX As Integer, intDataY As Integer
Dim intLabelX As Integer, intLabelY As Integer

' Create new form with Orders table as its record source.
Set frm = CreateForm
frm.RecordSource = "Orders"
' Set positioning values for new controls.
intLabelX = 100
intLabelY = 100
intDataX = 1000
intDataY = 100
' Create unbound default-size text box in detail section.
Set ctlText = CreateControl(frm.Name, acTextBox, , "", "", _
intDataX, intDataY)
' Create child label control for text box.
Set ctlLabel = CreateControl(frm.Name, acLabel, , _
ctlText.Name, "NewLabel", intLabelX, intLabelY)
' Restore form.
DoCmd.Restore
End Sub

Mir hilft aber die feste Deklaration der Control Veriablen nicht weiter.
Gibt es eine Möglichkeit die Deklaration und auch das Set dynamisch zu gestalten? So wie in dem folgenden Versuch, in dem die Set Zuweisung aber nicht funktioniert:

Dim rs As ADODB.Recordset
Set rs = frmQuell.RecordsetClone

For Each fld In rs.Fields
Set fld.Name = CreateControl(frm.Name, acTextBox, acDetail, , fld.Name, 100, 0, 500, 80)
Next fld


Gruß
Marc

-----------------------------
Acc2003, SQL Server 2000 SP3

Anne Berg
27.09.2005, 17:15
Wozu der Aufwand, wenn du auch mit der Datenblattansicht leben könntest?

Das "Set fld.name = ..." geht natürlich nicht, da musst du ein Control-Steuerelement benutzen, wie im ersten Codeauszug!

MarcHüfing
27.09.2005, 20:11
@Anne
Weil doch auch eine Datenblattansicht für jedes Formular einzeln entwickelt werden müsste. Ich suche halt eine allgemeingültige Lösung. Wobei die Datenblattansicht für den Anwendungsfall die beste wäre, da der Benutzer dort Spaltenbreiten verändern könnte.

Da die Formulare unterschiedlich viele Datenfelder haben können die Controls nicht im Vorfeld deklariert werden. Ich suche hier also etwas dynamisches.
Daher die Idee fld.name als Bezeichnung für eine als Control deklarierte Variable zu benutzen, doch wie funktioniert eine solche Zuweisung?

Gruß
Marc

Anne Berg
27.09.2005, 23:29
Die Datenblattansicht ist bei jedem Formular optional, ebenso wie die Ansicht "Endlosformular", die ich eigentlich überhaupt nicht verwende.
Es kommt nur darauf an, wie du das Formular anbietest/öffnest. Darum verstehe ich deine Bemühungen nicht.

Andererseits: Die "Idee" fld.name als Bezeichnung für eine als Control deklarierte Variable zu benutzen, setzt du doch bereits um, indem du fld.name in der Parameterliste der CreateControl-Methode verwendest.

Wo ist da der Denkfehler?! - Schau dir doch die Beschreibungen der eingesetzten Befehle/Methoden mal in der Online-Hilfe an! :)

Nouba
27.09.2005, 23:30
Ich würde bei Unschlüssigkeit das Ziel/Aufgabe der DB, den zu erwartenden Handlungsablauf und die bisherige vorhandene Datenstruktur zur Diskussion stellen.

MarcHüfing
28.09.2005, 06:39
Dann möchte ich noch mal mein Ziel verdeutlichen:
Ich habe eine fertige Anwendung mit vielen Formularen die in der Ansicht "Einzelnes Formular" angezeigt werden.
Nun möchte ich mit einem einzigen neuen Programmteil für all meine vorhandenen Formulare zur Laufzeit eine Datenblattansicht generieren können. Der Benutzer soll dann später mit einer Funktionstaste oder über eine eigene Symbolleiste diesen Programmteil aktivieren können. Das Programm soll dann auf Basis des gerade geöffneten Formulares ein neues Formular in der Datenblattansicht mit allen Controls des Quell Formulars zur Laufzeit erstellen.
Die Datenblattansicht soll dem Benutzer eine schnelle Übersicht über die vorhandenen Daten geben. Durch Auswahl eines Datensatzes und schließen des Datenblattansicht-Forms soll man dann wieder zu eben diesem Datensatz im Quell Formular gelangen.

Ich will mir mit der zentralen Prozedur halt die Entwicklung eines zweiten Formulars für alle Formulare bei denen die Datenblattansicht Sinn macht sparen.

Gruß
Marc

Anne Berg
28.09.2005, 07:12
Versteh doch bitte: du brauchst kein zweites Formular für die Datenblattansicht. Du kannst deine Formulare nach Belieben in der Formular- oder Datenblattansicht öffnen. Du kannst in einem geöffneten Formular von einer Ansicht in die andere wechseln. Dazu gibt es z.B. eine Schaltfläche in der Symbolleiste.

BeckerThomas
28.09.2005, 08:29
Hallo,
1.) Kann man die Formularansicht während der Laufzeit umschalten
Auszug aus der Hilfe:

-------------------------------------------------------------------------
DefaultView-Eigenschaft (Standardansicht)

Einstellung Visual Basic Beschreibung
Einzelnes Formular 0 (Standardeinstellung) Zeigt jeweils einen Datensatz an.

Endlosformular 1 Zeigt so viele Datensätze an, wie in das aktuelle Fenster passen, jeweils in einer eigenen Kopie des Detailausschnitts des Formulars.

Datenblatt 2 Zeigt die Felder des Formulars in Zeilen und Spalten an, wie in einem Tabellenblatt.

PivotTable 3 Zeigt das Formular als PivotTable an.

PivotChart 4 Zeigt das Formular als PivotChart an.

Welche Ansichten in der Liste der Schaltfläche Ansicht sowie im Menü Ansicht angezeigt werden, hängt von der Einstellung der ViewsAllowed-Eigenschaft ab. Ist die ViewsAllowed-Eigenschaft z. B. auf Datenblatt eingestellt, ist Formularansicht sowohl in der Liste der Schaltfläche Ansicht als auch im Menü Ansicht deaktiviert.

Durch Kombination dieser Eigenschaften sind folgende Zustände möglich.

Standardansicht ZugelasseneAnsicht(en) Beschreibung
Einzelnes Formular, Endlosformular oder Datenblatt Beide Benutzer können zwischen Formularansicht und Datenblattansicht wechseln.
Einzelne Formulare oder Endlosformulare Formular Benutzer können von der Formularansicht nicht zur Datenblattansicht wechseln.
Einzelne Formulare oder Endlosformulare Datenblatt Benutzer können von der Formularansicht zur Datenblattansicht, aber nicht wieder zurück wechseln.
Datenblatt Formular Benutzer können von der Datenblattansicht zur Formularansicht, jedoch nicht wieder zurück wechseln.
Datenblatt Datenblatt Benutzer können nicht von der Datenblattansicht zur Formularansicht wechseln.

-------------------------------------------------------------------------

2. wenn man nicht alle Felder aus dem Grundformular möchte (wäre z. B. bei mir auch der Fall) ist die Idee mit einem zentralen Formular eigentlich super.

Vorschlag: übergebe das Formular einer Funktion die dann das Entsprechende Formular generiert. Geht leider nur in der Entwurfsansicht, deshalb würde ich die Bildschirmausgabe für diese Zeitraum ausschalten. (Echo=false bzw. Painting=false) . Ich würde die Felder die man nicht im Formular haben will mit einem Kennzeichen in der Control.Tag Eigenschaft kennzeichen.

Sub NewControls(byval objForm as Form)
Dim frm As Form
Dim ctlLabel As Control, ctlText As Control
Dim intDataX As Integer, intDataY As Integer
Dim intLabelX As Integer, intLabelY As Integer
Dim objCtrl as Control

' Create new form with Orders table as its record source.
Set frm = CreateForm
''' frm.RecordSource = "Orders"

For objCtrl in objForm.Controls
' Set positioning values for new controls.
intLabelX = 100
intLabelY = 100 + (567 * (lngI-1))
intDataX = 1000
intDataY = 100 + (567 * (lngI-1))

-> hier noch eine Prüfung ob das Control ein Datenfeld ist (SourceObject-Eigenschaft) und Tag-Eigenschaft prüfen
-> ebenso kann man auch die Label-Eigenschaft übernehmen und was man
noch sonst aus dem Originalfromular übernehmen will.
(Sorry Zeitmangel)

' Create unbound default-size text box in detail section.
Set ctlText = CreateControl(frm.Name, objCtrl.controltype, , "", "", _
intDataX, intDataY)

' Create child label control for text box.
Set ctlLabel = CreateControl(frm.Name, acLabel, , _
ctlText.Name, "NewLabel", intLabelX, intLabelY)

next objCtrl
' Restore form.
DoCmd.Restore
End Sub

Mit der For Next Schleife kannst Du soviele Controls erzeugen wie Du willst.
Die generellen Formulareinstellungen ganz normal per VBA -> und fertig ist das Ding.

Gruß
Thomas

Anne Berg
28.09.2005, 08:41
Ist zwar eine nette Spielerei (und dafür bin ich eigentlich immer zu haben ;)) aber ich rate doch eher davon ab, zur Laufzeit immer wieder neue Formulare zu generieren.

Wenn es denn unbedingt ein separates Formular für die Datenblattansicht sein muss, so kann man ein allgemein gültiges mit sämtlichen Feldern erstellen und beim Anzeigen die Spalten ohne gültige Datenherkunft ausblenden. Somit ist diese AussageDa die Formulare unterschiedlich viele Datenfelder haben können die Controls nicht im Vorfeld deklariert werden. schlichtweg nicht zutreffend.

Genausogut kann man aber auch im Formular beim Wechseln der Ansicht einzelne Textfelder/Spalten nach Bedarf ein- oder ausblenden.
... aber von einem unterschiedlicher Datenumfang in den verschiedenen Ansichten war ja bislang gar nicht die Rede!

MarcHüfing
28.09.2005, 12:49
@Anne
Jetzt hat es dann auch bei mir geschnaggelt. Ich kann die Ansicht direkt umschalten. Ich hatte mich da wohl etwas verrannt.
Da die Datenblattansicht aber keinen Kopf- bzw. Fußbereich hat treten bei meinen Formularen hier an einigen Stellen Fehler auf. Damit werde ich aber klar kommen.

@Thomas
Genau eine solche dynamische Zuweisung meinte ich. Ich werde das damit auf jeden fall noch testen. Allerdings hatte ich mit diesen Entwurfsänderungen zur Laufzeit auch noch das Problem, dass nicht alles bei der mde bzw. ade Datei funktioniert. Auch das werde ich testen.

Vielen Dank für Eure Unterstützung.
Gruß
Marc