Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Eine Datenbank mit Access 2013 richtig entwickeln

Dynamisches Menü einrichten

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Anstatt viele Schaltflächen einzeln auf dem Menüband anzulegen, ist es viel praktischer, per VBA ein dynamisches Menü anzulegen.

Transkript

Sie können tatsächlich das Menüband hier weiter so füllen. So ist das durchaus auch gedacht, dass Sie hier Schaltfläche um Schaltfläche daranbauen, und entsprechend Ihre ganzen Aktionen dort unterbringen. Da spricht auch nichts gegen, außer irgendwann die Menge der Schaltflächen, die dort unterzubringen sind, und die durchaus mühsame Steuerung, welche jetzt aktiv sind, oder, wie diese hier, "enabled" auf "false" stehen haben, und in welchem Zusammenhang was wo stehen soll. Deswegen würde ich an der Stelle eine andere Methode empfehlen, nämlich ein Menü. Aber nicht wie bisher ein altes, normales Menü, sondern ein Dynamic Menu. Das hat nämlich den Vorteil, dass Sie hier eine einzige Schaltfläche haben, und das eigentliche Menü hier ausklappt, und per Programmierung länger, kürzer sichtbar, deaktiviert, was immer Sie wollen, werden kann. Das macht anfangs ein bisschen mehr Schreibarbeit, aber auf Dauer rentiert sich das. Das werden Sie sehen. Also, ich brauche erstmal einen neuen Eintrag, hier in USysRibbons, und das bedeutet, hier kommt eine Zeile dazu, die ich kopieren muss. Hier habe ich also den bisherigen Text. Und ich habe mir bereits in die Zwischenablage geholt den neuen Eintrag. Der wird hier hinter diese Zeile kommen. Und den können wir uns gleich mal genauer angucken. So, das passt jetzt in der Breite nicht ganz. Das ist aber nicht wirklich schlimm. Den Separator werde ich nach da drüben nehmen, also hinter das "Beenden", damit das Menü so ein bisschen getrennt ist. Das Ganze nennt sich Dynamic Menu. Deswegen ist das da auch das Schlüsselwort. Und es erzeugt eine Art Button mit einem Ausklappmenü daran. Das ist meine eindeutige Bezeichnung, wie sonst auch die IDs. Und ich habe dort ein Label, wie bei einer normalen Schaltfläche auch, mit zwei Besonderheiten: Das erste, hier ist ein Umlaut drin, Access akzeptiert das, obwohl es in XML eigentlich nicht erlaubt wäre. Und ich habe hinter dem Minuszeichen ein Leerzeichen, weil sonst kein automatischer Umbruch stattfinden kann. Wenn Sie das in einem Wort schreiben, braucht das auch die entsprechende Breite. Das sieht einfach nicht aus. Size und Image haben Sie schon einmal gesehen. Ich muss also gleich dafür sorgen, dass dieses "icnMenue.gif" vorhanden ist. Und die beiden Neuigkeiten sind hier ein "GetContent"-Attribut mit der entsprechenden Callback-Prozedur, und ein "invalidateContentOnDrop", welches auf "true" steht. Diese Einstellung macht nichts anderes, als jedes Mal, wenn der Benutzer oben auf den Button klickt, das Menü frisch und neu zu erzeugen. Das heißt, Sie müssen nicht während irgendwelcher Aktionen immer gucken, muss ich oben in den Ribbons im Menüband irgendwas aktualisieren, aktivieren, deaktivieren, sondern das Menü wird beim Klick erzeugt und kann dann entscheiden, was muss ich jetzt anzeigen, was will ich anzeigen. Das erspart Ihnen viele, viele Verwaltungsaufgaben, weil Sie nicht zwischendurch oben etwas aktualisieren müssen. Ich brauche also abgesehen von dem passenden Bild hier eine Prozedur "GetContent", die nachher beim Klick auf das Menü aufgerufen wird. Das können wir jetzt alles kopieren und in USysRibbons hineinschreiben. Also da wieder strg+V. Das steht soweit drin. Und jetzt brauche ich natürlich wieder die Callback-Funktionen. Ich habe hier schon vorbereitet die, die wir gleich brauchen werden. Das sind noch keine Callbacks, sondern nur die Ergänzungen. Zu den "UserIstAdmin" und so weiter gibt es jetzt auch die noch fehlenden "UserID", "UserName", "UserLogin". Das werden wir nämlich als erstes direkt anzeigen. Dann gibt es bereits ein neues Modul "DynamicMenue". Das könnte ich alles bei den Callbacks hineinschreiben, aber das alleine hat soviel Schreibaufwand, dass das besser in einem eigenen Modul untergebracht ist. Wo Sie das haben, ist erstmal relativ egal. Es heißt noch "ErzeugeMenue". Also, da müssen wir noch die Verbindung schaffen. Aber ich möchte Ihnen vorher schonmal zeigen, was es eigentlich macht. Dieses Menü selber erwartet nämlich eine XML-Struktur. Und zwar eine, die im Ergebnis so aussieht. Ich kann das mal wieder ein bisschen schmaler machen. Und wenn ich das jetzt hier ein bisschen einrücke, sehen Sie vielleicht deutlicher, dass es eigentlich eine herkömmliche XML-Struktur ist. Die möchte da oben lesen "menu", dann einen üblichen "xmlns"-String, und "itemSize=large" heißt nur, die Menüeinträge selber werden groß dargestellt. Sonst hätten sie die normale kleine, einzeilige Struktur. Und hier steht schon ein einziger erster Eintrag drin, ein sogenannter "menuSeparator". Das ist so ein grauer Balken, der keine eigene Funktionalität hat, eine beliebige ID. Und da steht im Moment schonmal einfach "Gast (ohne Rechte)". Ohne Programmierung, das ist erstmal nur so ermittelt. Und diese XML-Struktur möchte das Menü wissen. Das muss ich also als String übergeben, um das Menü zu erzeugen. Die werde ich per Programmierung herstellen. Und das macht dieser Code genau hier. "ErzeugeMenue" macht nichts anderes, als in einer Variablen erstmal die Startzeile zu schreiben. An der ändert sich ja nichts. Und wenn Sie darin Gänsefüßchen brauchen, innerhalb einer Zeichenkette, müssen die einfach aufgedoppelt sein. Das liest sich ein bisschen schwierig, aber im Prinzip ist es genau das, was man auch nachher als Ergebnis haben will. Und je nachdem, ob die User-ID jetzt größer, kleiner, null ist, wir sollten vielleicht sauberer schreiben, die User-ID kann kleiner gleich null sein, dann ist auch minus eins abgefangen, dann bin ich ein Gast ohne Rechte. Oder es wird hier mein echtes User-Login angezeigt. Und das wird nachher ergänzt um die Schlusszeile, "/menu", und an den Funktionsnamen zurückgegeben. Dieses "Debug.Print" dient nur zu Testzwecken. Das heißt, wenn Sie irgendwie das Gefühl haben, das funktioniert nicht, dann gucken Sie einfach in das Ergebnis rein. Das kann man nicht unterbrechen. Deswegen muss das mit "Debug.Print" erzeugt werden. Jetzt kommt die Verbindung zu den Callbacks, denn dies ist ja eine eigene Prozedur, und ich hatte in dem XML vereinbart, dass es "GetContent" heißen muss. Also gehe ich zu den Callbacks und erweitere das. Es ist eine normale Sub mit dem Namen "GetContent". Und die übergibt wie immer "control as IRibbonControl,", und dann kommt der zweite Teil, der ist, das werden Sie bemerken, auch immer relativ ähnlich, "byref image", "byref label", "byref" in diesem Fall "content". Da übergebe ich nämlich, ich schreibe das mal dahinter, "für DynamicMenu", da übergebe ich die Inhalte. Und hier steht jetzt ganz schlicht, der Content ist das, was ich mit "ErzeugeMenue" ermittelt habe. Dann muss ich nur noch überprüft haben, dass das Bild auch in dem Verzeichnis liegt. Und dann kann es schon losgehen. Also probieren wir einfach, das Ganze zu komprimieren und neu zu starten, alle Module zu speichern. Keine Fehlermeldung ist schon gut. Das Bild ist da. Das ist das Menü. Das zeigt immer automatisch diesen kleinen Pfeil an. Wenn ich daraufklicke, wird "GetContent" aufgerufen und da es leer ist, hat noch etwas nicht funktioniert. Da müssen wir jetzt einfach nachgucken. Aber es wird immerhin schon etwas erzeugt. An dieser Stelle ist es ein bisschen lästig, diesen Fehler zu finden, denn es ist eigentlich nicht wirklich ein Fehler. Es fehlt nur ein kleines Stückchen. Ich muss das jetzt ein bisschen simulieren. Ich täusche den ersten Eintrag vor. Sie würden das mit ein bisschen Probiererei im "Debug.Print" herausfinden, dass die Struktur dort unvollständig ist. Ich werde jetzt einfach hier dazukopieren einen Menüeintrag. Der macht nichts außer "Test" zu schreiben, hat eine fiktive Bezeichnung, ID und den Inhalt "Test". Und ohne dass ich dort etwas geändert habe, werden Sie jetzt sehen, dass es diesmal funktioniert. Also, der Separator ist in Ordnung, aber er wird erst dann angezeigt, wenn auch ein echter Menüeintrag ist. Die brauchen allerdings noch ein bisschen Arbeit, deswegen dieses Provisorium. Das Ganze gespeichert, und dann versuchen wir das gleiche nochmal. Und wie Sie jetzt sehen: alles in Ordnung. An diesem hat sich nichts geändert. Der zeigt jetzt oben immer an, wer angemeldet ist. Das entspricht auch dem, mit ein paar Zusatzinformationen. Der Rest wird hier tatsächlich dann noch mit Bildern, mit ordentlichen Beschriftungen, aktiv und so weiter, erfolgen. Nur dass Sie schonmal sehen, dass das Grundkonzept funktioniert.

Eine Datenbank mit Access 2013 richtig entwickeln

Sehen Sie einem erfahrenen Datenbankentwickler über die Schulter und lernen Sie dabei, wie Sie in Access 2013 optimale und perfekt skalierbare Datenbank anlegen und pflegen.

5 Std. 18 min (53 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!