Ich widmete mich mal wieder dem Listenfeld (ListBox) von
Microsoft Access.
Die Spaltenbreiten bei
Listenfelder können flexibel gehalten werden, in dem die
Spaltenbreiten nicht explizit auf eine genaue Breite festgelegt werden.
Wobei es durchaus ausreicht, dass nur einer der Spalten ohne festgelegte
Breite definiert ist. Dies könnte z.B. so aussehen:
Private Sub Form_Load() Me.MeinListenfeld.ColumnWidths = "2cm;;1cm;;4cm" End Sub
Was ist wichtig an dieser Stelle? Dass für die Spalte, deren
Breite flexibel eingestellt werden soll, keinen numerischen Wert
angeben, sondern den Platz zwischen den entsprechenden Semikola (;) einfach freilassen.
Seit der Version 2007 gibt es die Möglichkeit über die
Eigenschaft Horizontaler Anker (HorizontalAnchor), die Einstellung so vorzunehmen,
das die Breite der Steuerelemente sich automatisch entsprechend der Breite vom
Formular anpassen. Das finde ich tatsächlich eine sehr hilfreiche Funktion, die
ich für die vorherigen Access-Versionen aufwendig in VBA programmiert habe.
Leider hat Microsoft es verpasst für diesen
Steuerelementtyp die Spaltenbreiten bei Änderung der Formulargröße auch mit anpassen zu lassen.
Das ist sehr schade, den dadurch ist die dynamik in der Breite bei Listenfelder so ziemlich nutzlos.
Abhilfe schafft da einen kleiner VBA Code beim Event Bei Größenänderung (Resize), der die
Spaltenbreiten einfach jeweils erneut setzt:
Private Sub Form_Resize() Me.MeinListenfeld.ColumnWidths = Me.MeinListenfeld.ColumnWidths End Sub
Das Ergebnis überzeugt: Von nun an ändert sich die Breite der Spalte mit der Größenänderung des Formulars.
Damit könnte mein Post auch schon zu Ende sein.
Aufmerksame Leser meines Blogs wissen jedoch, dass ich gerne auch
Multiselect-Listenfelder verwende.
Und schon haben wir das nächste Problem vorliegen.
In Kombination der Resize-Lösung, schmeißt das
Multiselect-Listenfeld alle aktuellen Markierungen raus!
An dieser Stelle habe ich meine Lösung in Frage gestellt
und nach einer anderen Lösung gesucht, die nicht dieses Problem hervorruft.
Leider vergebens. Ich würde mich sehr freuen, wenn jemand hierfür bereits eine
Lösung gefunden hat, die erst gar nicht das Problem auslöst. Bitte als
Kommentar posten, danke!
Das ist jetzt wieder sehr ärgerlich, aber auch hierfür
habe ich mir eine Lösung überlegt:
Bevor wir die ColumnWidths erneut festlegen, merken wir
uns die aktuellen Markierungen über die Auflistung ItemsSelected in einer
Array-Variable. Anschließend setzen wir die ColumnWidths, und die verlorenen
Markierungen stellen wir über unser zuvor erstelltes Array wieder her:
Public Sub RefreshColumnWidths(cListbox As Access.ListBox) Dim itms() As Long, i As Variant, ii As Long For Each i In cListbox.ItemsSelected ReDim Preserve itms(ii) itms(ii) = i ii = ii + 1 Next cListbox.ColumnWidths = cListbox.ColumnWidths If ii > 0 Then For i = 0 To UBound(itms) cListbox.Selected(itms(i)) = True Next End If End Sub
Bei eine große Menge an Einträgen, kann die Funktion
durchaus etwas länger dauern (im Sekunden Bereich), da sollten wir diese nicht
nach jedem Resize-Event des Formulars ausführen lassen. Nutzen wir doch einfach
das Timer-Event des Formulars, um erst nach einer gewissen Verzögerung die
Spaltenbreiten neu setzen zu lassen.
Private Sub Form_Resize() Me.TimerInterval = 100 End Sub Private Sub Form_Timer() Me.TimerInterval = 0 RefreshColumnWidths MeinListenfeld End Sub
Wir benötigen nun also 3 Prozeduren (2 Event- und eine
Public-Prozedur), um die Versäumnisse von Microsoft nachzuholen. Also Code, der
für das eigentliche Projekt nicht dient, sondern nur für Korrekturen.
In meinem Post Markierung geht in ListBox mit Multiselect (extended) Einstellung verloren hatte ich ja bereits die Listenfelder behandelt. Daher habe ich die drei benötigten Prozeduren einfach in das dort vorliegende Klassenmodul integriert und schon sind wir fertig.
Es bleibt bei einem Minum an Anweisungen pro Formular:
Dim cCorrectionControls As clsCorrectionControls Private Sub Form_Load() Set cCorrectionControls = New clsCorrectionControls cCorrectionControls.SetForm = Me End Sub
Die aktuelle Datei steht hier zum Herunterladen bereit.
Keine Kommentare:
Kommentar veröffentlichen