Tausendsassa Datenblatt – Teil 2

Einlesen der Konfiguration und Anpassen derDatenblattansicht

Im ersten Teil Artikelserie haben Sie ja bereits erfahren, wie Sie die Funktionen eines Formulars und seiner Steuerelemente in einer separaten Klasse kapseln. Die dazu notwendigen Routinen wurden für diesen Artikel ein wenig angepasst.

Der einzige Code, der im eigentlichen Formular untergebracht werden muss, ist der aus Listing 3. Nach dem Instanzieren des Objekts obj- Form weist die Routine lediglich noch der Eigenschaft Unterformular den Namen des Unterformulars mit der Datenblattansicht zu.

Dim objForm As clsForm
Private Sub Form_Open(Cancel As Integer)
Set objForm = New clsForm
Set objForm.Unterformular = Me.sfmArtikelNachKategorie
End Sub

Beim Zuweisen des Unterformulars wird die entsprechende Property-Prozedur ausgelöst. Den ersten Teil und die Deklaration der Membervariablen kennen Sie bereits; interessant sind die beiden Prozeduraufrufe KontextmenueErweitern und LadeKonfiguration am Ende der Routine.

Dim mSubform As SubForm
Dim WithEvents mForm As Form
Dim mColControls As Collection
Public Property Set Unterformular(sfmSubform As SubForm)
Dim ctl As Control
Dim objControl As clsControl
Set mSubform = sfmSubform
Set mForm = mSubform.Form
Set mColControls = New Collection
mSubform.Form.OnUnload = "[Event Procedure]"
For Each ctl In mSubform.Controls
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or _
ctl.ControlType = acCheckBox Then
Set objControl = New clsControl
Set objControl.FormControl = ctl
mColControls.Add objControl
End If
Next ctl
KontextmenueErweitern
LadeKonfiguration
End Property

Schauen Sie sich zunächst die Routine LadeKonfiguration an (Listing 5). Sie öffnet eine Datensatzgruppe, die alle Datensätze der Tabelle tblFel der zu Steuerelementen des aktuellen Unterformulars enthält.

Private Sub LadeKonfiguration()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strFormular As String
strFormular = mSubform.Name
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM tblFelder WHERE Formular = '" & _
strFormular & "' ORDER BY LetzteReihenfolge")
mSubform.SetFocus
DoCmd.RunCommand acCmdUnfreezeAllColumns
Do While Not rst.EOF
mSubform.Controls(rst!Feldname).ColumnOrder = rst!LetzteReihenfolge
mSubform.Controls(rst!Feldname).ColumnWidth = rst!LetzteBreite
mSubform.Controls(rst!Feldname).ColumnHidden = rst!Versteckt
If rst!Fixiert = True Then
mSubform.Controls(rst!Feldname).SetFocus
DoCmd.RunCommand acCmdFreezeColumn
End If
rst.MoveNext
Loop
Set rst = Nothing
Set db = Nothing
End Sub

Bevor die Routine die Datensätze für die einzelnen Steuerelemente durchläuft, muss sie eine eventuell vorhandene Fixierung entfernen. Dazu setzt sie den Fokus auf das Unterformular und ruft die RunCommand-Anweisung mit dem passenden Parameter auf. Der Grund für diese Vorgehensweise ist, dass bei bestehender Fixierung keine Änderungen an den fixierten Feldern vorgenommen werden können.

Dann geht es endlich los: In einer Do-While-Schleife durchläuft die Routine alle Steuerelemente, passt Breite, Reihenfolge und Sichtbarkeit an und fixiert gegebenenfalls die angegebenen Felder.