Translate

Mittwoch, 21. Dezember 2016

ACCESS: Anpassung der Unterformular-Steuerelement-Größe an die exakte Größe des abgebildeten Unterformulars

Wird in einer Formular-Entwurfsansicht ein Unterformular hinzugefügt, dann passt Access das Unterformular-Steuerelement an die Größe des Unterformulars an.
Diese Anpassung ist leider nicht sehr exakt, was wieder manuelle Nachbesserung erfordert.
Noch problematischer ist es, wenn nachträglich die Größe des Unterformulars geändert wird. Dann erfolgt leider keine Anpassung mehr.
Schon alleine das ändern der Bildlaufleisten oder das hinzufügen von einem Formularkopf haben bereits Auswirkung auf die Formulargröße. 

Auch genervt von ständigen Anpassen der Unterformular-Steuerelemente?

Dann lassen wir doch einfach zur Laufzeit die Unterformular-Steuerelement-Größe an die tatsächliche Unterformulargröße anpassen.
Um die Größe des Unterformular korrekt auszulesen, müssen alle Elemente die eine Auswirkung auf die Größe haben berücksichtigt werden, wie z.B. Navigationsschaltflächen/Datensatzmarkierer/Bildlaufleisten/Formularkopf-/fuß

Genau das erledigt die folgende Prozedur:
Public Sub ResizeControlFromSubform(SubformControl As Access.SubForm _
                                , Optional ByRef SubformWidth As Long _
                                , Optional ByRef SubformHeight As Long)
    Dim FormReportOBJ As Object, SectionOBJ As Section
    Const SCROLLBARWIDTH As Integer = 290
    Const BORDERFACTOR As Byte = 20, MINIBORDERWIDTH As Byte = 7
   
    If Not SubformControl Is Nothing Then
        Set FormReportOBJ = SubformControl.Form
        Select Case FormReportOBJ.ScrollBars
            Case 1
                FormReportOBJ.ScrollBars = 0
            Case 3
                FormReportOBJ.ScrollBars = 2
        End Select
       
        SubformHeight = MINIBORDERWIDTH
        SubformWidth = MINIBORDERWIDTH
        If FormReportOBJ.Section(acDetail).Visible = True Then
            SubformHeight = SubformHeight + FormReportOBJ.Section(acDetail).Height
        End If
        If SectionExists(FormReportOBJ, acHeader, SectionOBJ) Then
            If SectionOBJ.Visible = True Then
                SubformHeight = SubformHeight + SectionOBJ.Height
            End If
        End If
        If SectionExists(FormReportOBJ, acFooter, SectionOBJ) Then
            If SectionOBJ.Visible = True Then
                SubformHeight = SubformHeight + SectionOBJ.Height
            End If
        End If
        If FormReportOBJ.NavigationButtons = True Then
            SubformHeight = SubformHeight + SCROLLBARWIDTH
        End If
       
        SubformWidth = SubformWidth + FormReportOBJ.Width
        If FormReportOBJ.ScrollBars = 2 Or FormReportOBJ.ScrollBars = 3 Then
            SubformWidth = SubformWidth + SCROLLBARWIDTH
        End If
        If FormReportOBJ.RecordSelectors = True Then
            SubformWidth = SubformWidth + SCROLLBARWIDTH
        End If
       
        If Not SubformControl.BorderStyle = 0 Then
            SubformHeight = SubformHeight + (SubformControl.BorderWidth * BORDERFACTOR)
            SubformWidth = SubformWidth + (SubformControl.BorderWidth * BORDERFACTOR)
        End If
       
        SubformControl.Width = SubformWidth
        SubformControl.Height = SubformHeight
    End If
End Sub


Hinweis: Es wird die Funktionsprozedur SectionExists() benötigt, die hier mit ausführlicher Beschreibung hinterlegt ist.

Jetzt brauchen wir nur beim starten des Hauptformulars die Prozedur ausführen zu lassen, in dem wir das abgebildete Formular-Objekt übergeben:
Private Sub Form_Load()
    ResizeControlFromSubform (me.MeinUnterformularsteuerelement)
End Sub


Noch besser, wir belasten unser Hauptformular erst gar nicht damit, sondern wir hinterlegen den Code einfach im Unterformular:
Private Sub Form_Load()
    ResizeControlFromSubform ControlFromSubform (Me)
End Sub

Durch die Funktion ControlFromSubform() wird das unterformular-Steuerelement im übergeordneten Formular ermittelt. Diese Funktion ist hier ausführlich beschrieben.

Somit können wir jetzt unser Unterformular in beliebigen Formularen einbetten, es wird immer vollständig dargestellt, byby das Gefummel mit der Steuerelementgröße.
Und an den Hauptformularen muss kein Code hinterlegt werden, den dieser befindet sich ja dank der Funktion ControlFromSubform() im Unterformular :-)

Ein kleines Beispiel mit ausführlicher Kommentierung kann hier heruntergeladen werden.

Anmerkung:  Die Werte der Konstanten SCROLLBARWIDTH / BORDERFACTOR / MINIBORDERWIDTH müssen ggf. angepasst werden, wenn besondere Windows-Design-Einstellungen vorgenommen wurden. Diese könnte man dynamische über Windows-Funktionen auslesen. Vielleicht findet sich jemand, der eine Lösung dazu hier postet.

PS:
Unsere Prozedur ResizeControlFromSubform liefert sogar die entsprechenden ermittelten Werte über die Übergabeparameter-Variablen SubformWidth & SubformHeight zurück.

Wenn gewünscht kann man im Formularentwurf des Hauptformulars die Eigenschaften Breite+Höhe manuell mit den ermittelten Werten befüllen. Achtung, die manuelle Angabe muss in cm erfolgen, geliefert werden jedoch twips. Also einfach die Werte durch 567 teilen ;-)



Keine Kommentare:

Kommentar veröffentlichen