Category: Formulardesign

Dynamisches Button-Menü realisieren

comments Kommentare deaktiviert für Dynamisches Button-Menü realisieren
By , 28. Mai 2025

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.

Mehrstufige abhängige Auswahl

comments Kommentare deaktiviert für Mehrstufige abhängige Auswahl
By , 5. November 2024

Vor einiger Zeit stand ich bei einem Programm für die Vereinsmeisterschaft unseres Schützenvereines vor der Aufgabe, die Ergebnisanzeige endlich korrekt zu realisieren. Man sollte folgendes auswählen können:

  1. die Disziplingruppe, also alle Disziplingruppen, Pistole, Gewehr, Flinte, Armbrust etc.
  2. von der Disziplingruppe abhängend die entsprechende Disziplin, also alle Disziplinen, oder einzelne Disziplinen.
  3. die Altersklasse, also alle Klassen, Schüler, Jugend, Junioren, Herren, Damen oder abhängig von der Disziplin Auflageschießen sollen dann Seniorenklassen angezeigt werden. Das ist eine spzielle Eigenart im Deutschen Schützenbund.

Irgendwie dachte ich da spontan an das Portal unseres Landesverbandes, der in der Ergebnisliste genau diese Auswahlmöglichkeit (neben der Vereins- und Schützenauswahl) abbildet. Von da aus war der Schritt, wie konkret die Ergebnisse dargestellt werden sollen, nicht weit, nämlich genau so wie im Webportal.

Also mittels dem Untersuchungs-Werkzeug des Firefox Webbrowsers die Struktur der Darstellung analysiert, teils kopiert teils ergänzt/abgewandelt. Als Ergebnis stand am Schluss eine Prozedur die per Buttonklick aufgerufen wird, welche im ersten Teil in Abhängigkeit der Auswahlen einen SQL-String aufbaut. Eine kleine Schwierigkeit dabei war es die Auswahlen für „Alle …“ zu realisieren.

Gelöst habe ich dies indem ich einen String (strCase) zusammengesetzt habe jeweils aus 1 oder 0 für jede Auswahlmöglichkeit. Also „111“ für den Fall dass alle 3 Auswahlen auf „Alle“ stehen bzw. „000“ falls keine oder eben die Zwischenschritte. Danach habe ich die möglichen Fälle bestimmt die jeweils eine andere Zusammensetzung des SQL-Strings bedingen würden und in einer Select Case Schleife abgearbeitet. Das Ergebnis ist relativ komplex, aber ich denke zumindest die Systematik dahinter kann man relativ einfach verstehen:
Read more »

In Bug-Falle getappt: Registersteuerelement verschieben mit Unterformular

comments Kommentare deaktiviert für In Bug-Falle getappt: Registersteuerelement verschieben mit Unterformular
By , 14. Januar 2020

Hallo,
z.Z. arbeite ich an einem Eigenprojekt – einer Belegungssteuerung für die Pension. Dabei bin ich auf ein Problem gestoßen das wohl ein Bug in Access ist, und zwar zumindest der Version 2010 bis zur aktuellen 2019er Version. Der Sachverhalt ist folgender:
Auf einer Seite eines Registersteuerelementes plazierte ich ein Unterformular-Steuerelement, mit Form als Sourceobject. Die Registersteuerelemente stellen in dem Formular eine Box dar, die zusammengeklappt und aufgeklappt werden kann – mit mehreren solcher „Boxen“ die sich dann entsprechend positionieren. Dazu wird die Move() Funktion verwendet.

Den Style-Fehler, den Access nun produziert, ist dieser:
Verschiebe ich ein RegisterControl dann verschiebt sich die Registerseite natürlich mit, und auch das Unterformular-Control. Soweit alles OK.
ABER das Formular innerhalb des Unterformular-Controls bleibt einfach stehen, fällt also sprichwörtlich aus dem Rahmen mit dem es sich mitbewegen sollte.
Kann man sehr leicht reproduzieren. Kollegen habe mir auch bestätigt dass dieses Verhalten in der neuesten Version 2019 ebenso vorhanden ist.

Nun, tun kann man daran nichts, aber es ist gut dass man das weiß. Ich habe es jetzt so gelöst dass ich hier jetzt kein Register einsetze sondern nur das Unterformular-Control und dieses dann hier verschiebe. Zum Testen hab ich euch ein kleines Beispiel gemacht mit mehreren Optionen:
Testdatenbank

Bis dahin
©2020 Andreas Vogt

OfficeFolders theme by Themocracy