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