Dynamisches Button-Menü realisieren

In einer bestehenden Anwendung für den Verein habe ich ein Menü aus Befehlsschaltflächen – also Buttons – erstellt:
Jetzt sollte aber die Anordnung der Menüpunkte verändert werden können, und auch einzelne Menüpunkte ein- bzw. ausgeblendet werden können. Hört sich kompliziert an, ist es aber eigentlich nicht.
Was wir brauchen ist eine zusätzliche Tabelle tblSettings mit den Feldern ID (Autowert), cmdIconsOrder (Text), cmdIconsVisibility (Text) und UserID (long). Außerdem ein zusätzliches Formular in dem wir die Menüpunkte bearbeiten, und ein bisschen VBA-Code im Load() Ereignis des Formular wo das Menü sich befindet.
Fangen wir mal mit dem zusätzlichen Formular an.
Wir brauchen für jeden Menüpunkt eine Befehlsschaltfläche und eine Checkbox mit der wir den Menüpunkt sichtbar/unsichtbar schalten. Außerdem brauchen wir für jede Position eine Art „Anker“ mit Hilfe dessen wir die Position des Menüpunktes einstellen. Dazu verwende ich ganz einfach kurze, unsichtbare Linien. Das verschieben bzw. ein-/ausblenden machen wir mit je einer weiteren Befehlsschaltfläche. Und zum Schluss noch eine Befehlsschaltfläche zum Speichern. Bei mir sind es 12 Menüpunkte, und das formular sieht in der Entwurfsansicht wie folgt aus:
Um die Position und die Sichtbarkeit zu speichern, benutze ich 2 Arrays die im Deklarationsteil definiert sind:
Dim buttonOrder() As String
Dim checkOrder() As String
Das Verschieben der Menüpunkte mittels der Buttons hoch/runter geht relativ einfach, indem die Top-Position der jeweiligen Controls getauscht werden.
Klickt man dann auf Speichern wird in einer For/Next-Schleife ein Semikolon-Separierter Textstring gebildet, einer für die Position und einer für die Sichtbarkeit. Mittels Aktionsabfrage werden diese dann in die Tabelle geschrieben.
Das ist relativ viel Code, und ich hab sicherlich viel unnützer Ballast darin, so dass ich den Code im Detail nicht Posten werde. Aber ich werde demnächst eine Beispiel-Datei machen und hier hochladen.
Dann gehts weiter mit dem eigentlichen Formular wo das Menü abgebildet ist.
Um jetzt die einzelnen Punkte anzuordnen bzw. unsichtbar zu schalten, habe ich im Form_load() Ereignis folgenden Code:
Private Sub Form_Load() Dim i%, k%, m% buttonOrder = Split(fcDomWert("cmdIconsOrder", "tabSettings", "ID=1", ltDLookup), ";") checkOrder = Split(fcDomWert("cmdIconsVisibility", "tabSettings", "ID=1", ltDLookup), ";") For i = 1 To 12 k = k + 1 If checkOrder(i) = "0" Then Me("KB" & buttonOrder(i)).visible = False k = k - 1 ElseIf m = 0 Then m = 1 Else '... End If Me("KB" & buttonOrder(i)).Left = Me("ln" & k).Left Next i Me("KB" & m).SetFocus End Sub
Lasst euch nicht von der Funktion „fcDomWert“ verwirren, das ist eine Domänenersatzfunktion die ich verwende, also anstelle von Dlookup().
Die Buttons haben den Namen KB1 bis KB12, die Checkboxen den Namen chk1 bis chk12, und die Linien den Namen ln1 bis ln12
Die Position, also an welcher Linie der Button plaziert wird, wird über den Zähler „k“ realisiert. k weicht von i dann ab, wenn einzelne Menüpunkte unsichtbar sind. Man möchte ja im Menü keine Lücken haben. In der Variable m wird die Nummer des ersten sichtbaren Buttons erfasst, um auf diesen dann den Focus zu setzen.
Für wen oder was ist dieser Aufwand denn überhaupt gut? Nun, stellt euch vor, eure Anwendung wird von verschiedenen Personen bedient, aber auch von einem der mehr Berechtigungen haben muss um z.B. bestimmte Einstellungen zu tätigen, Datenimport durchzuführen etc. Dann macht es durchaus Sinn eine Art Benutzeranmeldung beim Start vorzunehmen und einem Standard-Nutzer nur wenige Menüpunkte anzuzeigen. Dazu könnte man dann z.B. einen Benutzer-ID in der Tabelle tblSettings speichern, damit beim Start die Einstellung für genau diesen Benutzer geladen werden.
Soweit jetzt aber mal für heute,
bis dahin, euer Andi.