{"id":55000627,"date":"2008-10-01T00:00:00","date_gmt":"2021-02-11T21:22:58","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=627"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Vertikale_Menueleisten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/","title":{"rendered":"Vertikale Men&uuml;leisten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Switchboards oder Men&uuml;- und Symbolleisten und nun auch Ribbons sind die gebr&auml;uchlichen Mittel zur Navigation in Datenbankanwendungen. Switchboards sind nicht sonderlich &uuml;bersichtlich, weil sie immer wieder von Formularen oder Berichten &uuml;berlagert werden. Men&uuml;leisten wiederum haben einen kleinen Nachteil: Sie dehnen sich horizontal aus und nehmen damit in der Vertikalen Raum ein, der ergonomischer etwa f&uuml;r die Anzeige einer zus&auml;tzlichen Reihe Datens&auml;tze verwendet werden k&ouml;nnte. Auf Webseiten hingegen d&uuml;rfte ein seitliches Men&uuml; die h&auml;ufigste Navigationsmethode sein. Ist das, was dort m&ouml;glich ist, nicht auch unter Access machbar<\/b><\/p>\n<p><b>Men&uuml; zur Seite<\/b><\/p>\n<p>Es ist etwas paradox: Der f&uuml;r die eigentlichen Inhalte zur Verf&uuml;gung stehende Raum wird immer kleiner. Nehmen wir etwa ein aktuelles Notebook mit der &uuml;blichen Bildschirmaufl&ouml;sung von 1280 x 800 Pixel und ein installiertes Office 2007.<\/p>\n<p>Das Ribbon nimmt, wenn die Schnellstartleiste unten angedockt ist, bereits 170 Pixel H&ouml;he ein. Ist f&uuml;r Formulare und Tabellen die Registerkartenansicht aktiviert &#8211; plus 20 Pixel f&uuml;r die Reiter &#8211; und soll auch die Statusleiste (22 Pixel) angezeigt werden, dann bleibt f&uuml;r die Datenblattanzeige abz&uuml;glich ihrer Navigationsleiste (22 Pixel) und der meist unten angedockten Taskleiste (26 Pixel) gerade noch eine H&ouml;he von 540 Pixel vertikal &uuml;brig. Das steht im Gegensatz zur Tatsache, dass sich Tabellen und Listen eher vertikal ausdehnen als horizontal. Man hat also vergleichsweise wenige Datens&auml;tze im Blick.<\/p>\n<p>Auch, wenn eine Men&uuml;leiste an sich eine geringe H&ouml;he aufweist, ist zu fragen, warum man ein Men&uuml; nicht genau so gut seitlich anbringen k&ouml;nnte, wie das in anderen Anwendungen, etwa in Outlook oder im Internet, ja auch praktiziert wird.<\/p>\n<p>F&uuml;r diesen Zweck existieren tats&auml;chlich spezielle ActiveX-Steuerelemente namens &#8222;Outlook-Bars&#8220;, die aber den Nachteil haben, dass sie als Container ein Formular ben&ouml;tigen, das dauernd im Hintergrund ge&ouml;ffnet sein muss.<\/p>\n<p>Es l&auml;sst sich jedoch auch mit Access-Bordmitteln durchaus ein brauchbares Seitenmen&uuml; realisieren &#8211; denn Men&uuml;- und Symbolleisten lassen sich schlie&szlig;lich auch seitlich und vertikal andocken.<\/p>\n<p>F&uuml;r diesen Beitrag lassen wir Access 2007 au&szlig;en vor und beschr&auml;nken uns auf die fr&uuml;heren Versio-nen, die noch andockbare Men&uuml;leisten unterst&uuml;tzen. Eine analoge L&ouml;sung f&uuml;r Access 2007 w&auml;re das Erstellen eines benutzerdefinierten Taskpanes (siehe Beitrag <b>Custom Task Panes mit VB6<\/b>, Shortlink 528).<\/p>\n<p><b>Vertikale Men&uuml;leisten<\/b><\/p>\n<p>Wer eine der Standardmen&uuml;- oder Symbolleisten seitlich im Access-Rahmenfenster andockt, ist ern&uuml;chtert. Denn auch die Schaltfl&auml;chen und ihre Beschriftungen erscheinen dann vertikal ausgerichtet und wer nicht dauernd den Kopf verrenken m&ouml;chte, dem bringt das wenig. &Uuml;ber den &#8222;Anpassen&#8220;-Dialog der Men&uuml;leisten kann man die Schaltfl&auml;chen jedenfalls nicht dazu bewegen, sich anders auszurichten. Das ist unverst&auml;ndlich, denn Microsoft hat durchaus eine Einstellung vorgesehen, mit der die 90&deg;-Drehung vollzogen werden kann. Nur l&auml;sst sich die ausschlie&szlig;lich per VBA vornehmen.<\/p>\n<p>Inspiziert man die M&ouml;glichkeiten eines CommandbarButton-Objekts, also einer Men&uuml;schaltfl&auml;che, im Objektkatalog (Microsoft Office-Library), dann trifft man auf die Eigenschaft <b>Style<\/b>.<\/p>\n<p>Diese kann den Wert einer der vordefinierten <b>msoButtonStyle<\/b>-Konstanten annehmen. Setzt man <b>Style <\/b>auf <b>msoButtonWrapCaption<\/b>, dann dreht sich die Schaltfl&auml;che und wird zu einem brauchbaren Steuerelement. Testen Sie selbst:<\/p>\n<p>Ziehen Sie die Datenbank-Symbolleiste von Access mit der Maus oben ab und docken Sie sie links am Rand von Access wieder an. Setzen Sie danach diese Anweisung im VBA-Direktfenster ab:<\/p>\n<pre>Commandbars(\"Database\").Controls(1).Style = msoButtonWrapCaption<\/pre>\n<p>Der Men&uuml;eintrag f&uuml;r <b>Neu&#8230; <\/b>hat sich damit gedreht. Interessant ist nun, dass sich die Breite der Symbolleiste automatisch der Breite einer Beschriftung anpasst:<\/p>\n<pre>Commandbars(\"Database\").Controls(1).Caption = _\r\n\"Neue_Datenbank_anlegen...\"<\/pre>\n<p>Setzte man statt der Unterstriche Leerzeichen in die Beschriftung, dann w&uuml;rde der Text umbro-chen. Access legt grunds&auml;tzlich f&uuml;r jedes Leerzeichen in Schaltfl&auml;chenbeschriftungen einen Umbruch an.<\/p>\n<p>Das geht so weit, dass eine Schaltfl&auml;che, deren Beschriftung nur aus drei Leerzeichen besteht, dreimal so hoch wird wie &uuml;blich. Man kann das vermeiden, indem man statt der &#8222;korrekten&#8220; Leerzeichen mit dem Ordinalwert <b>32 <\/b>gesperrte Leerzeichen mit dem Wert <b>160 <\/b>verwendet:<\/p>\n<pre>Set oCmd = Commandbars(\"Database\").Controls(1). _\r\nCaption = Replace(\"Neue Datenbank anlegen\", _\r\n\" \", Chr(160))<\/pre>\n<p>Wenn die Schaltfl&auml;che sich nun durch die l&auml;ngere Beschriftung verbreitert, dann m&uuml;sste sich folge-richtig auch ihre Eigenschaft <b>Width<\/b> ver&auml;ndert haben &#8211; denkt man. Tats&auml;chlich betr&auml;gt sie nun 136 statt 37 Pixel:<\/p>\n<pre>Debug.Print oCmd.Width<\/pre>\n<p>Der Versuch, die Schaltfl&auml;che &uuml;ber diese Eigenschaft weiter zu verbreitern, f&uuml;hrt indessen zu einem irritierenden Ergebnis:<\/p>\n<pre>oCmd.Width = 150<\/pre>\n<p>Sie wird nun nicht breiter, sondern h&ouml;her! Ver&auml;ndert man hingegen die H&ouml;he mit<\/p>\n<pre>oCmd.Height = 150<\/pre>\n<p>dann wird sie nicht h&ouml;her, sondern breiter. Es scheint, dass sich durch die Drehung der Schaltfl&auml;che &uuml;ber die <b>Style<\/b>-Eigenschaft die Koordinaten vertauscht haben.<\/p>\n<p>Merkw&uuml;rdigerweise gibt die Abfrage von <b>Width <\/b>und <b>Height <\/b>nun aber durchaus die korrekten Ausma&szlig;e wieder. Lesen und Setzen der Eigenschaften <b>Width <\/b>und <b>Height <\/b>unterscheiden sich demnach. <\/p>\n<p>Was man sich hierbei lediglich merken sollte: Die Breite einer Schaltfl&auml;che und damit der vertikalen Men&uuml;leiste insgesamt l&auml;sst sich mit der Eigenschaft <b>Height <\/b>ver&auml;ndern. Und das ist auch schon der einzige Weg, um die Breite der Leiste zu setzen, denn die Anweisung<\/p>\n<pre>Commandbars(\"Database\").Width = 150<\/pre>\n<p>f&uuml;hrt zu einem Automatisierungsfehler &#8211; die Men&uuml;leiste bleibt hinsichtlich der Breite hartn&auml;ckig dynamisch an deren Elemente angepasst.<\/p>\n<p>Wer zus&auml;tzlich zum Text der Schaltfl&auml;chen auch noch Symbole anzeigen will, der kann die <b>Style<\/b>-Eigenschaft auf <b>msoButtonIconAndWrapCaption <\/b>stellen, wird dann aber m&ouml;glicherweise entt&auml;uscht sein, denn die Bildchen zeigen sich nun grunds&auml;tzlich zentriert &uuml;ber der Beschriftung, was nicht gut aussieht und au&szlig;erdem die Schaltfl&auml;che doppelt so hoch macht. Es gibt keine <b>Style<\/b>-Konstante, die dem abhelfen k&ouml;nnte. Wir beschr&auml;nken uns daher im Folgenden auf reine Textmen&uuml;s.<\/p>\n<p>Bevor es an die Erstellung der kompletten Leiste geht, soll noch die Frage gekl&auml;rt werden, ob auch Untermen&uuml;steuerelemente eingesetzt werden k&ouml;nnen.<\/p>\n<p>Das ist jedoch schnell beantwortet: Nein. Ein Untermen&uuml; entspricht dem Objekt <b>CommandbarPopup<\/b>, welches keine <b>Style<\/b>-Eigenschaft kennt.<\/p>\n<p>Deshalb bliebe es immer vertikal ausgerichtet und passt nicht mehr ins Bild. Wie man dennoch verschachtelte Men&uuml;s erzeugen kann, dazu gibt es sp&auml;ter L&ouml;sungsangebote.<\/p>\n<p>Nebenbei: Sollten Sie mit den bisherigen Code-Anweisungen Ihre Datenbank-Symbolleiste optisch verhunzt haben, dann ziehen Sie sie wieder in die fr&uuml;here horizontale Position, gehen auf <b>Anpassen<\/b> und aktivieren f&uuml;r die fraglichen Steuerelemente den Kontextmen&uuml;eintrag <b>Schaltfl&auml;chensymbol zur&uuml;cksetzen<\/b>. Das sollte auch Breite und H&ouml;he der Buttons wieder in die alte Form bringen.<\/p>\n<p><b>Nordwind extended<\/b><\/p>\n<p>Damit Sie sich schon mal ein Bild davon machen k&ouml;nnen, wie die Men&uuml;leiste letztendlich aussehen soll, finden Sie einen Screenshot in Bild 1. Es handelt sich um die originale Nordwind-Datenbank, welche um die Sidebar-Navigation erweitert wurde und auf der Heft-CD unter dem Namen <b>de-mo_navibar.mdb <\/b>zu finden ist. Nordwind-Formulare und -Berichte lassen sich komplett &uuml;ber die neue vertikale Men&uuml;leiste aufrufen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/nordwind_opt.jpeg\" alt=\"nordwind.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Nordwind-Datenbank mit neuer Benutzerf&uuml;hrung in Gestalt einer vertikalen Men&uuml;leiste<\/span><\/b><\/p>\n<p>Schauen wir uns die grundlegenden Features der Men&uuml;f&uuml;hrung an.<\/p>\n<p>Zun&auml;chst sind alle Standardmen&uuml;- und Symbolleisten ausgeblendet. Dadurch bleibt zus&auml;tzlicher vertikaler Platz f&uuml;r maximierte Formulare und Berichte. Ganz unten jedoch gibt es eine zus&auml;tzliche Leiste, die lediglich eine Schaltfl&auml;che <b>Schlie&szlig;en<\/b> beherbergt.<\/p>\n<p>Diese wird aktiv, sobald ein Formular oder Bericht ge&ouml;ffnet ist. Die <b>Schlie&szlig;en<\/b>-Schaltfl&auml;che macht dann auch das, was sie verhei&szlig;t, und schlie&szlig;t jegliches offene Objekt. Damit spart man sich entsprechende Schaltfl&auml;chen in den einzelnen Formularen ein.<\/p>\n<p>&Uuml;ber den <b>Anpassen<\/b>-Dialog finden Sie drei neue Leisten in der Datenbank, wovon eine, die <b>NavibarSub<\/b>, ausgeblendet oder noch gar nicht vorhanden ist (siehe Bild 2). Ihre Bedeutung wird sp&auml;ter erl&auml;utert.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/navibars_opt.jpeg\" alt=\"navibars.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Abb.3: Einstellungen der benutzerdefinierten Leisten<\/span><\/b><\/p>\n<p>Alle Leisten sind so eingestellt, dass sie sich vom Benutzer nicht &auml;ndern lassen (siehe Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/barsettings_opt.jpeg\" alt=\"barsettings.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Die fertige Hauptmen&uuml;leiste der Anwendung<\/span><\/b><\/p>\n<p>Im Auslieferungszustand enth&auml;lt die Hauptmen&uuml;leiste noch keine Steuerelemente, denn diese werden als tempor&auml;re Objekte erst nach dem Start der Anwendung &uuml;ber das <b>AutoExec<\/b>-Makro dynamisch angelegt, und zwar gesteuert &uuml;ber die Tabelle <b>tbl_Navibar<\/b>.<\/p>\n<p>Die Hauptmen&uuml;leiste (siehe Bild 4) zeigt einige bunte Schaltfl&auml;chen, die den Eindruck aufkommen lassen, dass hier mit unterschiedlichen Farbzuweisungen gearbeitet wurde. Tats&auml;chlich gibt es in dieser Hinsicht aber keinerlei Anpassungsm&ouml;glichkeiten f&uuml;r Men&uuml;s.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/arrowbutton_opt.jpeg\" alt=\"arrowbutton.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: <\/span><\/b><\/p>\n<p>Die Farben, die &uuml;brigens nur unter Office 2003 so aussehen und in Office 2000 in reinem Grau erstrahlen, kommen durch einen Trick zustande: Die <b>Enabled<\/b>-Eigenschaft der <b>CommandbarButtons <\/b>wirkt sich auf die Schriftfarbe aus und wird bei <b>False <\/b>ausgegraut dargestellt.<\/p>\n<p>Wird der Status der Schaltfl&auml;che &uuml;ber die Eigenschaft <b>State <\/b>jedoch zus&auml;tzlich auf <b>msoButtonDown <\/b>gestellt, also gedr&uuml;ckt, dann wechselt die Oberfl&auml;chenfarbe in Orange.<\/p>\n<p>&Uuml;ber diese Farben haben Sie die M&ouml;glichkeit, quasi Labels als &Uuml;berschriften zu logischen Anweisungsbl&ouml;cken anzulegen &#8211; die deaktivierten Schaltfl&auml;chen k&ouml;nnen ja nicht angeklickt werden.<\/p>\n<p>Um die einzelnen Schaltfl&auml;chen besser von einander abzusetzen, haben sie au&szlig;erdem alle die Eigenschaft <b>BeginGroup = True <\/b>&#8211; &#8222;Gruppierung beginnen&#8220; -, was die Unterteilungslinien zwischen Steuerelementen anzeigt.<\/p>\n<p>Handicap: Wenn Sie eine solche Men&uuml;leiste anlegen, dann hat sie leider f&uuml;r unseren Zweck einen Makel, weil ab Office XP an ihrem unteren Rand ein Pfeil sichtbar ist, der auf Klick die M&ouml;glichkeit zum <b>Schaltfl&auml;chen hinzuf&uuml;gen oder entfernen<\/b> anbietet (siehe Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/menucontrols_opt.jpeg\" alt=\"menucontrols.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die drei benutzerdefinierten Men&uuml;leisten f&uuml;r die Navigation in Nordwind Extended<\/span><\/b><\/p>\n<p>Diese M&ouml;glichkeit, unsere Navigationsleiste zu verunstalten, soll dem Benutzer jedoch vorenthalten werden. Doch leider gibt es keine Methode &uuml;ber das Objektmodell von Office auf das Pfeilchen einzuwirken. In die Demodatenbank ist deshalb eine Gewaltl&ouml;sung eingebaut, die den unteren Rand der Leiste per API unsichtbar macht. Dazu sp&auml;ter mehr.<\/p>\n<p><!--30percent--><\/p>\n<p>In umfangreichen Datenbanken wird es die H&ouml;he des Access-Fensters nicht hergeben, dass ausrei-chend Men&uuml;eintr&auml;ge angezeigt werden k&ouml;nnen. Da Untermen&uuml;s in vertikalen Leisten, wie erw&auml;hnt, wegen fehlender Drehbarkeit nicht wirklich m&ouml;glich sind, kommt f&uuml;r Untermen&uuml;s ein weiterer Trick zum Einsatz.<\/p>\n<p>Bei Klick auf eine Men&uuml;schaltfl&auml;che mit Pfeil, wie etwa in Bild 6 die f&uuml;r Ums&auml;tze &gt;, &ouml;ffnet sich rechts eine zus&auml;tzliche Men&uuml;leiste, die die Schaltfl&auml;chen f&uuml;r die Untermen&uuml;punkte enth&auml;lt. Wird dort eine Schaltfl&auml;che angeklickt, dann schlie&szlig;t sich die Leiste wieder.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/table_navibar_opt.jpeg\" alt=\"table_navibar.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Das Pseudo-Untermen&uuml; eines Men&uuml;eintrags<\/span><\/b><\/p>\n<p>Zu beurteilen, ob diese L&ouml;sung das Gelbe vom Ei ist, &uuml;berlasse ich Ihnen. Denn das Ganze hat einen unsch&ouml;nen Nebeneffekt: Ein maximiert ge&ouml;ffnetes Formular wird beim Einblenden der zus&auml;tzlichen Leiste horizontal zusammengequetscht.<\/p>\n<p>Deshalb gibt es mit der zweiten Beispieldatenbank zu diesem Beitrag, der Datei <b>demo_navibar_ol.mdb<\/b>, eine alternative L&ouml;sung, die ohne zus&auml;tzliche Leiste auskommt.<\/p>\n<p>Dort werden die Schaltfl&auml;chen der Hauptmen&uuml;leiste dynamisch nach oben oder unten verschoben und es ist immer nur eine Kategorie sichtbar &#8211; der &#8222;Outlook-Effekt&#8220; eben.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Tabellensteuerung<\/p>\n<p>Beim Start der Datenbank <b>Nordwind Extended <\/b>f&uuml;hrt das <b>AutoExec<\/b>-Makro die Funktion <b>CreateNaviGUI <\/b>aus, die sich &uuml;brigens mit allen weiteren Prozeduren zur Steuerung der Leisten im Modul <b>mdlNavi <\/b>befindet.<\/p>\n<p>Sie k&ouml;nnen dieses Modul neben den ben&ouml;tigten Tabellen <b>tbl_NaviBar <\/b>und <b>tlb_NavibarSub <\/b>auch in Ihre Datenbanken importieren, wenn Sie eigene Sidebars realisieren m&ouml;chten.<\/p>\n<p>Die Prozedur <b>CreateNaviGUI <\/b>tut nur wenig: Sie blendet die Standardmen&uuml;leisten von Access aus, die untere benutzerdefinierte (<b>NavibarClose<\/b>) ein und ruft schlie&szlig;lich die Prozedur <b>FillNaviBar <\/b>zum Anlegen der Schaltfl&auml;chen in der Hauptmen&uuml;leiste <b>Navibar <\/b>auf:<\/p>\n<pre>Function CreateNaviGUI()\r\n    On Error Resume Next\r\n    CommandBars(\"Menu bar\").Enabled = False\r\n    CommandBars(\"Database\").Visible = False\r\n    CommandBars(\"NavibarClose\").Visible = True\r\n    FillNaviBar\r\nEnd Function<\/pre>\n<p><b>FillNaviBar<\/b> st&uuml;rzt sich nun &uuml;ber ein Recordset auf die Tabelle <b>tbl_Navi <\/b>(siehe Bild 7) und erzeugt aus ihren Datens&auml;tzen Schaltfl&auml;chen mit den gew&uuml;nschten Eigenschaften.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/submenu_opt.jpeg\" alt=\"submenu.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Tabelle tbl_Navibar zur Steuerung der Men&uuml;leistenschaltfl&auml;chen<\/span><\/b><\/p>\n<p>Die Felder der Tabelle haben folgende Bedeutung:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Ein Datensatz steht f&uuml;r jeweils eine Men&uuml;schaltfl&auml;che.<\/li>\n<li class=\"aufz-hlung\"><b>ID <\/b>ist der Prim&auml;rschl&uuml;ssel (Autowert) der Tabelle und wirkt sich selbst nicht auf die Schaltfl&auml;-chenerzeugung aus.<\/li>\n<li class=\"aufz-hlung\"><b>Position <\/b>ist ein <b>Long<\/b>-Wert, der die Reihenfolge bestimmt, in der die Schaltfl&auml;chen von oben nach unten angelegt werden.<\/li>\n<li class=\"aufz-hlung\"><b>Caption<\/b> ist die Beschriftung einer Schaltfl&auml;che.<\/li>\n<li class=\"aufz-hlung\"><b>IsLabel <\/b>gibt an, ob die Schaltfl&auml;che als Gruppierungs-Label dienen soll und unter Access 2003 dann orange erscheint. In der Routine f&uuml;hrt dieses Feld zum Setzen der <b>State<\/b>-Eigenschaft auf <b>msoButtonDown<\/b>.<\/li>\n<li class=\"aufz-hlung\"><b>Enabled <\/b>steuert, ob die Schaltfl&auml;che aktiviert sein soll oder nicht.<\/li>\n<li class=\"aufz-hlung\"><b> Height <\/b>steuert die H&ouml;he der Schaltfl&auml;che. Der erlaubte Wertebereich erstreckt sich von <b>1 <\/b>bis <b>3<\/b>. Man kann hier etwa f&uuml;r die orangefarbenen Gruppierungsschaltfl&auml;chen einen h&ouml;heren Wert als <b>1 <\/b>angeben, um sie deutlicher hervorzuheben.<\/li>\n<li class=\"aufz-hlung\"><b>Action <\/b>ist ein String, der bei Klick auf eine Schaltfl&auml;che als Parameter an die benutzerdefinierte Funktion <b>fuCmbAction <\/b>geleitet wird, wo er &uuml;ber ein <b>Select Case<\/b>-Statement ausgewertet und in die gew&uuml;nschten nachfolgenden Funktionsaufrufe umgesetzt wird.<\/li>\n<li class=\"aufz-hlung\"><b>Tooltipp <\/b>ist ein String, der zus&auml;tzliche Infos zur Bedeutung einer Men&uuml;schaltfl&auml;che ausgeben soll, wenn der Mauszeiger sich &uuml;ber ihr befindet.<\/li>\n<\/ul>\n<p>An den Pluszeichen vor ID erkennen Sie, dass an die Tabelle ein Unterdatenblatt angeflanscht ist. Hierbei handelt es sich um die Tabelle <b>tbl_NavibarSub<\/b>, die genau den gleichen Aufbau hat und die Eintr&auml;ge f&uuml;r m&ouml;gliche Untermen&uuml;s enth&auml;lt. <\/p>\n<p>Ein Klick auf das Pluszeichen zum Datensatz mit der ID 7 (Ums&auml;tze) etwa offenbart, dass zu diesem ein Untermen&uuml; mit Detaildatens&auml;tzen existiert.<\/p>\n<p>Die Untermen&uuml;leiste wird in <b>FillNavibar <\/b>aber noch nicht erzeugt. Das geschieht erst zur Laufzeit &uuml;ber die Prozedur <b>ShowSubNavi<\/b>, wenn ein entsprechender Men&uuml;eintrag angeklickt wird.<\/p>\n<p>Der Kern der Routine <b>FillNavibar<\/b> durchl&auml;uft die auf der Tabelle <b>tbl_Navibar <\/b>basierende Datensatzgruppe <b>rstNavi <\/b>(s. Listing 1). Bei <b>CtlB<\/b> handelt es sich dabei um eine als <b>CommandbarButton <\/b>deklarierte Variable, bei <b>cmb <\/b>um ein <b>Commandbar<\/b>-Objekt, das auf die Men&uuml;leiste <b>Navibar <\/b>verweist.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Tabellengesteuertes Anlegen der CommandbarButtons der Men&uuml;leiste in einer Schleife<\/p>\n<pre>Do While Not rstNavi.EOF\r\n    Set CtlB = cmb.Controls.Add(msoControlButton, , , , True)\r\n    With CtlB\r\n    .Height = 160\r\n    .Style = msoButtonWrapCaption\r\n    .DescriptionText = Nz(rstNavi!Tooltip)\r\n    .TooltipText = Nz(rstNavi!Tooltip)\r\n    strCaption = Nz(rstNavi!Caption, \" \")\r\n    ReplaceSpaces strCaption\r\n    If rstNavi!IsLabel Then\r\n        strCaption = fuTitleCaption(strCaption)\r\n        .BeginGroup = False\r\n        .state = msoButtonDown\r\n        .Enabled = False\r\n        bLastGrouped = True\r\n    Else\r\n        strCaption = Trim(strCaption)\r\n        .BeginGroup = Not bLastGrouped And (Len(strCaption) &gt; 0)\r\n        bLastGrouped = False\r\n        .Enabled = rstNavi!Enabled And (Len(strCaption) &gt; 0)\r\n        If Not IsNull(rstNavi!Action) Then\r\n            .OnAction = _\r\n            \"=fuCmbAction(\" &amp; Chr$(34) &amp; rstNavi!Action &amp; Chr$(34) &amp; \")\"\r\n        End If\r\n    End If\r\n    .Caption = strCaption\r\n    .Width = Choose(rstNavi!Height, 16, 24, 36)\r\n    End With\r\n    rstNavi.MoveNext\r\nLoop<\/pre>\n<p>Zun&auml;chst wird f&uuml;r jeden Datensatz eine Schaltfl&auml;che &uuml;ber die <b>Controls.Add<\/b>-Methode des <b>Commandbars <\/b>erzeugt, wobei der optionale Parameter <b>Temporary <\/b>auf <b>True <\/b>gesetzt wird.<\/p>\n<p>Damit hat die Schaltfl&auml;che nur f&uuml;r diese Access-Sitzung Bestand. Das ist nicht ganz unwichtig, denn auf diese Weise wird sie nicht in den internen Systemtabellen (<b>MSysAccessStorage<\/b>) der Datenbank gespeichert, was sonst &uuml;ber kurz oder lang zu ihrer zus&auml;tzlichen Aufbl&auml;hung f&uuml;hren k&ouml;nnte.<\/p>\n<p>Die Breite der Schaltfl&auml;chen und damit der Leiste insgesamt wird &uuml;ber ihre <b>Height<\/b>-Eigenschaft (!) auf den fixen Wert von 160 Pixel eingestellt. Den k&ouml;nnen Sie nach Belieben anpassen oder auch ein zus&auml;tzliches Feld in der Tabelle <b>tbl_Navibar <\/b>f&uuml;r ihn anlegen.<\/p>\n<p>Das Setzen der restlichen Eigenschaften der Schaltfl&auml;chen &uuml;ber die Datenfelder von <b>rstNavi <\/b>ist hoffentlich selbsterkl&auml;rend und ergibt sich aus dem Objektmodell f&uuml;r <b>CommandbarButtons<\/b>. Einige Feinheiten sind beachtenswert:<\/p>\n<p>Die Steuerung, wann die Eigenschaft <b>BeginGroup <\/b>(Gruppierung beginnen) auf <b>True <\/b>gesetzt wird, ist etwas diffizil und in erster Linie der Optik geschuldet.<\/p>\n<p>Es sieht n&auml;mlich nicht gut aus, wenn nach einer orangefarbenen Kategorieschaltfl&auml;che eine solche Gruppierungslinie sichtbar wird.<\/p>\n<p>Das steuert die Variable <b>bLastGrouped<\/b>. Wird in der Schleife eine Kategorieschaltfl&auml;che erzeugt (<b>IsLabel = True<\/b>), dann wird <b>bLastGrouped <\/b>auch auf <b>True <\/b>gesetzt. Im n&auml;chsten Schleifendurchlauf wird <b>BeginGroup <\/b>nur dann gesetzt, wenn <b>bLastGrouped <\/b>eben nicht <b>True <\/b>ist, also vorher eine normale Schaltfl&auml;che erzeugt wurde.<\/p>\n<p>Die Beschriftung der Kategorieschaltfl&auml;chen soll designm&auml;&szlig;ig kapital und gesperrt ausfallen. Das &uuml;bernimmt die Funktion <b>fuTitleCaption <\/b>bei allen Datens&auml;tzen mit dem Eintrag <b>IsLabel=True<\/b>. <b>fuTitleCaption <\/b>setzt zwischen alle Zeichen eines Strings ein Leerzeichen.<\/p>\n<p>Die Beschriftung der Schaltfl&auml;chen wird aus dem Feld <b>Caption <\/b>des Recordsets ausgelesen, vor der Zuweisung an den <b>CommandbarButton <\/b>aber noch spezialbehandelt. In der Funktion <b>ReplaceSpaces <\/b>werden aus allen Leerzeichen gesperrte Leerzeichen gemacht, damit Zeilenumbr&uuml;che unterbleiben:<\/p>\n<pre>Private Sub ReplaceSpaces(strCaption As String)\r\n    strCaption = Replace(strCaption, \" \", _\r\n    Chr$(160))\r\n    End Sub<\/pre>\n<p>Die H&ouml;he der Schaltfl&auml;chen (<b>Width<\/b>!) wird &uuml;ber eine <b>Choose<\/b>-Funktion gesetzt:<\/p>\n<pre>CtlB.Width = Choose(rstNavi!Height, 16, 24, 36)<\/pre>\n<p>Das sind willk&uuml;rliche Pixel-Werte, die Sie nach Belieben &auml;ndern k&ouml;nnen.<\/p>\n<p>Die Funktion, die bei Klick auf die Schaltfl&auml;chen aufgerufen werden soll (<b>OnAction<\/b>), ist immer die gleiche und hei&szlig;t <b>fuCmbAction<\/b>.<\/p>\n<p>&Uuml;brigens wird zu Beginn der Prozedur das Aktualisieren der Access-Oberfl&auml;che &uuml;ber <b>Application.Echo = False <\/b>ausgeschaltet und zum Schluss wieder eingeschaltet. Das verhindert, dass das Men&uuml; wie ein Rollladen &uuml;ber Access herf&auml;llt.<\/p>\n<p>Ganz zum Schluss wird noch die Prozedur <b>DisableCmdbarArrow <\/b>aufgerufen, die das Anpassen-Pfeilchen der Men&uuml;leiste unter Access XP ff. verschwinden l&auml;sst. Sie arbeitet fast nur mit Windows-API-Anweisungen und kann hier nicht ersch&ouml;pfend beschrieben werden. Im Prinzip l&auml;uft dies so ab:<\/p>\n<p>Erst wird das Fenster-Handle der Men&uuml;leiste &uuml;ber <b>WindowFromAccessible <\/b>ermittelt. Dann werden die Ausma&szlig;e des Fensters in einer <b>RECT<\/b>-Struktur gespeichert.<\/p>\n<p>Von der Vertikalen wird ein Offset abgezogen, der leider je nach Office-Version unterschiedlich ist, weil der Pfeilbereich darin nicht immer gleich hoch ist.<\/p>\n<p>Schlie&szlig;lich wird auf Basis dieses neu berechneten Rechtecks der sichtbare Fensterbereich &uuml;ber <b>SetWindowRgn <\/b>zugewiesen &#8211; der untere Rand verschwindet damit und wird transparent.<\/p>\n<p>Diese Methode wird &uuml;brigens auch in der zweiten Demo zum Beitrag eingesetzt. Dort ver&auml;ndert sich die H&ouml;he der Men&uuml;leiste dynamisch fortw&auml;hrend wegen des erw&auml;hnten Outlook-Effekts.<\/p>\n<p>Das bedeutet aber, dass die Funktion <b>DisableCmdbarArrow <\/b>nach jedem Klick auf eine Kategorieschaltfl&auml;che aufgerufen und der sichtbare Bereich des Men&uuml;leistenfensters neu berechnet werden muss.<\/p>\n<p><b>Action<\/b><\/p>\n<p>Alle Klicks auf Men&uuml;schaltfl&auml;chen rufen die Funktion <b>fuCmbAction <\/b>auf und &uuml;bergeben ihr als Parameter einen eindeutigen String zur Identifikation. F&uuml;r den Button <b>Ums&auml;tze <\/b>w&auml;re das etwa <b>fuCmbAction(&#8222;umsaetze&#8220;)<\/b>.<\/p>\n<p>Die Prozedur <b>fuCmbAction <\/b>l&auml;sst nun mittels <b>Select Case<\/b>-Statement auf den Parameter-String weitere Aktionen folgen.<\/p>\n<p>Diese <b>Case<\/b>-Zweige sind es, die Sie in Ihrer Datenbank neben den Datens&auml;tzen in <b>tbl_Navibar <\/b>anpassen m&uuml;ssen.<\/p>\n<pre>Case \"lieferant\"\r\nfuOpenForm \"Lieferanten; 16\"\r\nCase \"versandfirma\"\r\nDoCmd.OpenTable \"Versandfirmen\"<\/pre>\n<p>Hier ist als Schmankerl noch eine separate Funktion <b>fuOpenForm <\/b>zum Aufruf von Formularen im Einsatz. Man &uuml;bergibt ihr den Namen des Formulars und optional, durch Semikolon getrennt, noch einen weiteren Parameter, der die <b>OpenArgs <\/b>des aufgerufenen Formulars setzt.<\/p>\n<p>So weit ganz einfach. Wie verh&auml;lt es sich jedoch mit jenen Schaltfl&auml;chen, die lediglich die Untermen&uuml;leiste erscheinen lassen sollen, ohne weitere Aktionen auszul&ouml;sen<\/p>\n<p>Deren <b>Case<\/b>-Zweige rufen alle nur eine Funktion auf, die <b>ShowSubNavi <\/b>lautet, und &uuml;bergeben ihr als Parameter die ID des Men&uuml;datensatzes in <b>tbl_Navibar<\/b>:<\/p>\n<pre>Case \"umsaetze\"\r\nShowSubNavi 7<\/pre>\n<p>Und die Prozedur <b>ShowSubNavi <\/b>ist es nun, die die zus&auml;tzliche Untermen&uuml;leiste <b>NavibarSub <\/b>dynamisch erzeugt und einblendet. Ihr Aufbau ist weitgehend identisch, wie jener der Prozedur <b>FillNavibar<\/b>.<\/p>\n<p>Ein Unterschied besteht darin, dass hier die Tabelle <b>tbl_NavibarSub <\/b>als Datensatzgruppe herangezogen und das Recordset nach der &uuml;bergebenen ID des Hauptdatensatzes (<b>IDNaviBar<\/b>) gefiltert wird.<\/p>\n<p>Die Schaltfl&auml;chen dieser Untermen&uuml;leisten rufen &uuml;brigens wiederum die Action-Funktion <b>fuCmbAction <\/b>auf, sodass das gleiche <b>Select Case<\/b>-Konstrukt der Prozedur f&uuml;r beide Men&uuml;leisten herhalten kann.<\/p>\n<p>Au&szlig;erdem wird in der Routine jeweils noch eine zus&auml;tzliche Schaltfl&auml;che an die oberste Stelle gesetzt, die gleichlautend wie die aufrufende Hauptmen&uuml;schaltfl&auml;che ist, abweichend jedoch immer die Funktion <b>fuEsc <\/b>aufruft.<\/p>\n<p>Die ist nur dazu da, um die Hilfsleiste wieder &uuml;ber die <b>Visible<\/b>-Eigenschaft verschwinden zu lassen. Das ist leider ein Notbehelf, um das Untermen&uuml; wieder auszublenden, ohne dass ein echter Eintrag angeklickt werden muss.<\/p>\n<p>Denn im Unterschied zu echten Untermen&uuml;s verschwindet die Untermen&uuml;leiste ja nicht einfach, wenn man mit der Maus sonstwohin klickt. Dieses Verhalten nachzubilden w&auml;re nicht unm&ouml;glich, aber (API-)aufwendig.<\/p>\n<p><b>Outlook-Effekt<\/b><\/p>\n<p>Etwas schicker als das schr&auml;ge Pseudountermen&uuml; ist sicherlich die L&ouml;sung mit nur einer Leiste und dem dynamischen Ein- und Ausblenden bestimmter Schaltfl&auml;chen oder -gruppen (siehe Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/olbar_opt.jpeg\" alt=\"olbar.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Vertikale Men&uuml;leiste mit Outlook-Bar-Funktionalit&auml;t<\/span><\/b><\/p>\n<p>Im Ausgangszustand sind hier nur die Gruppenschaltfl&auml;chen sichtbar. Ein Klick etwa auf &#8222;Grunddaten&#8220; &ouml;ffnet die untergeordneten Schaltfl&auml;chen zu dieser Kategorie, indem alle folgenden Kategorie-Labels nach unten verschoben werden. Ein Klick auf <b>Vorgang<\/b> schlie&szlig;t die Grunddateneintr&auml;ge wieder und &ouml;ffnet daf&uuml;r die Palette der Vorgangseintr&auml;ge. Damit lassen sich weit mehr Men&uuml;eintr&auml;ge realisieren als mit der statischen Hauptmen&uuml;leiste der vorigen L&ouml;sung.<\/p>\n<p>Was auf den ersten Blick wegen der Verschiebung der Schaltfl&auml;chen eine technisch anspruchsvollere Programmierung vermuten l&auml;sst, ist in Wahrheit sogar einfacher zu realisieren.<\/p>\n<p>Zun&auml;chst gibt es nur noch eine flache Tabelle <b>tbl_Navibar <\/b>zur Steuerung der Schaltfl&auml;chen (siehe Bild 9). Auch die Prozeduren des Moduls <b>mdlNavi <\/b>sind hier &auml;hnlich wie in der alten L&ouml;sung.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/NaviBars-web-images\/table_navibar2_opt.jpeg\" alt=\"table_navibar2.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Die alternative Steuertabelle tbl_Navibar enth&auml;lt Verweise auf Elterndatens&auml;tze<\/span><\/b><\/p>\n<p>Die Prozedur <b>FillNavibar <\/b>ist aber sogar k&uuml;rzer als die zur F&uuml;llung der Men&uuml;leiste bei Mischung von Gruppen- und Men&uuml;schaltfl&auml;chen, weil zun&auml;chst eben nur Gruppenschaltfl&auml;chen sichtbar sein m&uuml;ssen. Das wird durch Filterung der Datensatzgruppe nach dem Kriterium <b>IsLabel <\/b>erreicht:<\/p>\n<pre>SELECT * FROM tbl_Navibar WHERE IsLabel=TRUE ORDER BY Position<\/pre>\n<p>Der Rest der Routine ist weitgehend identisch, nur dass hier der Algorithmus zur Bestimmung der <b>BeginGroup<\/b>-Eigenschaften entfallen kann.<\/p>\n<p>Beim Klick auf eine Kategorieschaltfl&auml;che wird auch hier jeweils die Navigationsfunktion <b>fuCmbAction <\/b>aufgerufen, jedoch immer mit dem Parameter <b>mysubmenu<\/b> plus einem neuen Parameter namens <b>ID<\/b>.<\/p>\n<p>Der wurde f&uuml;r die Kategorieschaltfl&auml;chen in der Schleife mit folgender Zeile angelegt:<\/p>\n<pre>CtlB.OnAction = \"=fuCmbAction(\" &amp; Chr$(34) &amp; rstNavi!Action &amp; _\r\nChr$(34) &amp; \",\" &amp; rstNavi!ID &amp; \")\"<\/pre>\n<p><b>rstNavi!ID <\/b>ist der Prim&auml;rschl&uuml;ssel des Datensatzes einer Kategorieschaltfl&auml;che.<\/p>\n<p>Ein Klick auf <b>Grunddaten<\/b> ruft also die Zielfunktion so auf:<\/p>\n<pre>fuCmbAction \"mysubmenu\", 14<\/pre>\n<p>Das l&auml;uft auf diesen <b>Case<\/b>-Zweig:<\/p>\n<pre>Case \"mysubmenu\"\r\nShowSubMenuItems ID<\/pre>\n<p>Die Prozedur <b>ShowSubMenuItems <\/b>ist es nun, die die eigentlichen Men&uuml;schaltfl&auml;chen zur Kategorie <b>Grunddaten <\/b>in die Men&uuml;leiste einf&uuml;gt.<\/p>\n<p>&auml;hnlich wie in der zuvor vorgestellten Prozedur <b>ShowSubNavi<\/b> wird nun die Datenherkunft der Tabelle <b>tbl_Navibar <\/b>nach der <b>ParentID <\/b>gefiltert:<\/p>\n<pre>SELECT * FROM tbl_Navibar\r\nWHERE ParentID=\" &amp; IDParent &amp; \"\r\nORDER BY Position DESC<\/pre>\n<p><b>ParentID<\/b> Richtig, dieses Feld gab es in der vorigen L&ouml;sung noch nicht. In der neuen <b>tbl_Navibar <\/b>enth&auml;lt es f&uuml;r alle Men&uuml;eintr&auml;ge ein Verweis auf die ID des Kategoriedatensatzes:<\/p>\n<p><b>ShowSubMenuItems <\/b>macht mit der gefilterten Datenquelle anschlie&szlig;end Folgendes:<\/p>\n<pre>Set cmb = CommandBars(\"Navibar\")\r\nSet CtlB = cmb.FindControl(Tag:=IDParent)\r\nidx = CtlB.Index + 1\r\nCtlB.BeginGroup = False\r\n...\r\nSet CtlB = cmb.Controls.Add(msoControlButton, , , idx, True)<\/pre>\n<p>Die <b>Commandbar<\/b>-Methode <b>FindControl <\/b>sucht zun&auml;chst unter allen <b>CommandbarButtons <\/b>jenen, dessen <b>Tag<\/b>-Eigenschaft mit der ID der Kategorieschaltfl&auml;che &uuml;bereinstimmt.<\/p>\n<p>Dieser <b>Tag<\/b>-Eigenschaftswert wurde allen <b>Kategorie<\/b>-Buttons beim Anlegen in <b>FillNavibar <\/b>verpasst:<\/p>\n<pre>CtlB.Tag = rstNavi!ID<\/pre>\n<p>Nachdem <b>FindControl<\/b> das Element gefunden hat, wird die vertikale Position dieser &#8222;Elternschaltfl&auml;che&#8220; &uuml;ber deren Eigenschaft <b>Index <\/b>bestimmt und dieser Wert um <b>1 <\/b>hochgez&auml;hlt &#8211; das ist dann die Einf&uuml;geposition <b>idx <\/b>der ersten &#8222;Kindschaltfl&auml;che&#8220;. Die <b>Controls.Add<\/b>-Methode kennt ja einen optionalen Parameter <b>Before<\/b>, f&uuml;r den man angeben kann, vor welchem Element ein Button eingef&uuml;gt werden soll.<\/p>\n<p>In einer Schleife werden schlie&szlig;lich alle weiteren Buttons mit der passenden Eltern-ID angelegt, wobei dies immer an der gleichen Position <b>idx <\/b>erfolgt.<\/p>\n<p>Hier wird auch deutlich, warum die Datens&auml;tze des Recordsets &uuml;ber die angef&uuml;hrte <b>SELECT<\/b>-Anweisung absteigend (DESC) sortiert wurden: Das ausschlie&szlig;liche Einf&uuml;gen an der Position hinter der Kategorieschaltfl&auml;che bewirkt, dass sich die bereits eingef&uuml;gten Elemente jeweils nach unten verschieben und so automatisch eine umgekehrte Sortierung erzeugt wird.<\/p>\n<p>Am Ende der Routine haben wir also einen Block eingef&uuml;gter Buttons.<\/p>\n<p>Jede Men&uuml;schaltfl&auml;che bekommt &uuml;brigens die <b>Tag<\/b>-Eigenschaft <b>submenu<\/b> verpasst. Das hat einen besonderen Grund: Wenn eine neue Kategorieschaltfl&auml;che bet&auml;tigt wird, dann soll ja der alte Men&uuml;block verschwinden, bevor die neue Kategorie aufgeklappt wird.<\/p>\n<p>Vorhandene Men&uuml;eintr&auml;ge m&uuml;ssen dazu komplett gel&ouml;scht werden, sodass nur noch Kategorie-Buttons &uuml;brig bleiben. Und das wird in der L&ouml;schprozedur <b>DeleteSubMenuItems <\/b>gemacht, die alle Elemente aus der Men&uuml;leiste entfernt, die in der <b>Tag<\/b>-Eigenschaft dieses <b>submenu<\/b> stehen haben:<\/p>\n<pre>For i = cmb.Controls.Count To 1 Step -1\r\n    cmb.Controls(i).BeginGroup = False\r\n    If cmb.Controls(i).Tag = \"submenu\" Then _\r\n    cmb.Controls(i).Delete\r\nNext i<\/pre>\n<p>Diese L&ouml;schprozedur wird grunds&auml;tzlich als Erstes aufgerufen, wenn eine Kategorieschaltfl&auml;che angeklickt wird. Erst danach erfolgt das Einf&uuml;gen des neuen Men&uuml;blocks.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Weiterverwenden<\/p>\n<p>Wenn Sie dieses Men&uuml;system in Ihrer eigenen Datenbank verwenden m&ouml;chten, dann importieren Sie einfach die Tabelle <b>tbl_Navibar<\/b> und das Modul <b>mdlNavi <\/b>aus der <b>demo_navibar_ol.mdb <\/b>und setzen im Importdialog &uuml;ber <b>Optionen <\/b>au&szlig;erdem das H&auml;kchen auf <b>Men&uuml;s und Symbolleisten<\/b>, um auch die vorhandenen Men&uuml;leisten <b>Navibar <\/b>und <b>NavibarClose <\/b>in Ihre Anwendung zu transferieren.<\/p>\n<p>Danach versehen Sie nur noch die Tabelle mit Eintr&auml;gen Ihrer Wahl und passen die <b>Case<\/b>-Zweige der Funktion <b>fuCmbAction <\/b>den Erfordernissen Ihres VBA-Projekts an.<\/p>\n<p><b>Zusammenfassung<\/b><\/p>\n<p>Die vorgestellten L&ouml;sungen f&uuml;r ein Sidebar-Men&uuml; lassen sich selbstverst&auml;ndlich in Funktion und Erscheinungsbild modifizieren und erweitern.<\/p>\n<p>Klar sollte allerdings sein, dass in eine vertikale Men&uuml;leiste ausschlie&szlig;lich Schaltfl&auml;chen eingef&uuml;gt werden k&ouml;nnen, weil nur diese &uuml;ber die Eigenschaft Style um 90&deg; gedreht werden k&ouml;nnen.<\/p>\n<p>Alle anderen <b>Commandbar<\/b>-Objekte, wie Dropdownboxen, Textboxen oder Untermen&uuml;s bleiben au&szlig;en vor. Symbole k&ouml;nnen Sie verwenden, verdoppeln allerdings aufgrund der Anordnung &uuml;ber dem Beschriftungstext die H&ouml;he der Eintr&auml;ge.<\/p>\n<p>Die Rechnung zum Schluss: Auf eingangs erw&auml;hntem Notebook entsteht in Ihrer Access-Anwendung bei einem &#8222;Outlookmen&uuml;&#8220; mit der Breite von 160 Pixel f&uuml;r maximierte Formulare und Berichte nun eine gro&szlig;z&uuml;gige Fl&auml;che von etwa 1100 x 720 Pixel.<\/p>\n<p>F&uuml;r Anwendungen, die viele Datenblattansichten und Formulare mit vertikaler Ausdehnung enthalten, ist das sicher eine gute Sache. &Uuml;brigens finden in der Men&uuml;leiste dann etwa maximal 220 Eintr&auml;ge Platz.<\/p>\n<p><b><span style=\"color:darkgrey\">Anpassen-Pfeil am Rand von Men&uuml;- und Symbolleisten<\/span><\/b><\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>demo_navibar.mdb<\/p>\n<p>demo_navibar_ol.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/8D32E3F5-2D2B-4EEA-8534-074D88D5D49F\/aiu_627.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Switchboards oder Men&uuml;- und Symbolleisten und nun auch Ribbons sind die gebr&auml;uchlichen Mittel zur Navigation in Datenbankanwendungen. Switchboards sind nicht sonderlich &uuml;bersichtlich, weil sie immer wieder von Formularen oder Berichten &uuml;berlagert werden. Men&uuml;leisten wiederum haben einen kleinen Nachteil: Sie dehnen sich horizontal aus und nehmen damit in der Vertikalen Raum ein, der ergonomischer etwa f&uuml;r die Anzeige einer zus&auml;tzlichen Reihe Datens&auml;tze verwendet werden k&ouml;nnte. Auf Webseiten hingegen d&uuml;rfte ein seitliches Men&uuml; die h&auml;ufigste Navigationsmethode sein. Ist das, was dort m&ouml;glich ist, nicht auch unter Access machbar<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662008,66052008,44000028],"tags":[],"class_list":["post-55000627","post","type-post","status-publish","format-standard","hentry","category-662008","category-66052008","category-Ergonomie_und_Benutzeroberflaeche"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Vertikale Men&uuml;leisten - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vertikale Men&uuml;leisten\" \/>\n<meta property=\"og:description\" content=\"Switchboards oder Men&uuml;- und Symbolleisten und nun auch Ribbons sind die gebr&auml;uchlichen Mittel zur Navigation in Datenbankanwendungen. Switchboards sind nicht sonderlich &uuml;bersichtlich, weil sie immer wieder von Formularen oder Berichten &uuml;berlagert werden. Men&uuml;leisten wiederum haben einen kleinen Nachteil: Sie dehnen sich horizontal aus und nehmen damit in der Vertikalen Raum ein, der ergonomischer etwa f&uuml;r die Anzeige einer zus&auml;tzlichen Reihe Datens&auml;tze verwendet werden k&ouml;nnte. Auf Webseiten hingegen d&uuml;rfte ein seitliches Men&uuml; die h&auml;ufigste Navigationsmethode sein. Ist das, was dort m&ouml;glich ist, nicht auch unter Access machbar\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:22:58+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"24\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Vertikale Men&uuml;leisten\",\"datePublished\":\"2021-02-11T21:22:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/\"},\"wordCount\":4527,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/6efb126326fb42c39f68efd37230925d\",\"articleSection\":[\"2008\",\"5\\\/2008\",\"Ergonomie und Benutzeroberfl\u00e4che\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/\",\"name\":\"Vertikale Men&uuml;leisten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/6efb126326fb42c39f68efd37230925d\",\"datePublished\":\"2021-02-11T21:22:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/6efb126326fb42c39f68efd37230925d\",\"contentUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/6efb126326fb42c39f68efd37230925d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vertikale_Menueleisten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vertikale Men&uuml;leisten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vertikale Men&uuml;leisten - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/","og_locale":"de_DE","og_type":"article","og_title":"Vertikale Men&uuml;leisten","og_description":"Switchboards oder Men&uuml;- und Symbolleisten und nun auch Ribbons sind die gebr&auml;uchlichen Mittel zur Navigation in Datenbankanwendungen. Switchboards sind nicht sonderlich &uuml;bersichtlich, weil sie immer wieder von Formularen oder Berichten &uuml;berlagert werden. Men&uuml;leisten wiederum haben einen kleinen Nachteil: Sie dehnen sich horizontal aus und nehmen damit in der Vertikalen Raum ein, der ergonomischer etwa f&uuml;r die Anzeige einer zus&auml;tzlichen Reihe Datens&auml;tze verwendet werden k&ouml;nnte. Auf Webseiten hingegen d&uuml;rfte ein seitliches Men&uuml; die h&auml;ufigste Navigationsmethode sein. Ist das, was dort m&ouml;glich ist, nicht auch unter Access machbar","og_url":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:22:58+00:00","og_image":[{"url":"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"24\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Vertikale Men&uuml;leisten","datePublished":"2021-02-11T21:22:58+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/"},"wordCount":4527,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d","articleSection":["2008","5\/2008","Ergonomie und Benutzeroberfl\u00e4che"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/","url":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/","name":"Vertikale Men&uuml;leisten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d","datePublished":"2021-02-11T21:22:58+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#primaryimage","url":"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d","contentUrl":"http:\/\/vg03.met.vgwort.de\/na\/6efb126326fb42c39f68efd37230925d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Vertikale_Menueleisten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Vertikale Men&uuml;leisten"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000627"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000627\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}