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

Eigene Schaltfläche mit Bild

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Im Zusammenspiel mit mehreren Prozeduren und XML-Attributen können Sie eigene Schaltflächen mit eigenen Bildern im Menüband einfügen.

Transkript

Diese beiden Schaltflächen sind integrierte Befehle. Das heißt, ich muss im Grunde nur aufrufen, und den Rest regelt Access selber. Aber natürlich können und wollen Sie sicherlich auch eigene Befehle eingeben, das heißt, die nicht nur eigene Aktionen erledigen, sondern auch eigene Bilder haben. Das möchte ich als nächstes machen. Wir brauchen also im USysRibbons wieder diesen Code. Den werde ich in die Zwischenablage kopieren und in einer Textdatei wieder bearbeiten. Und dort können wir im Grunde, basierend auf der vorherigen Zeile, fast dasselbe schreiben. Fast heißt, es ist auch ein Button. Er kriegt dieses Mal wieder eine ID ohne den Zusatz "Mso". Es ist also meine eigene ID. Und ich werde ihn als "btnBeenden" bezeichnen, denn damit möchte ich meine Datenbank schließen können. Das erfordert nicht viel Programmieraufwand, aber daran kann man schonmal alles sehen. Soweit ist er erstmal sehr ähnlich, nämlich Size auf "large", das soll ein großer Knopf werden, und das Label dazu nenne ich "Beenden". Da könnte man noch ausführlicher schreiben "Datenbank beenden", was ehrlich gesagt auch praktischer ist, weil Zweizeiler besser aussehen. Und jetzt kommen die Änderungen. Zuerst gebe ich nämlich an, welches Bild ich haben möchte. Da gibt es ein Image-Attribut, und ich habe schon eines hinterlegt. Das, können Sie einmal kurz gucken, das liegt bereits in dem Unterverzeichnis "Grafik" und heißt "icnBeenden.gif", sieht so aus, ist also nichts besonders Originelles. Und deswegen schreibe ich jetzt hier "icnBeenden.gif" hinein. Und ich muss noch Bescheid sagen können, was passiert, wenn jemand daraufklickt. Das ist diese Callback-Technik. Die erfordert ein Attribut "onAction". Achtung wieder auf Groß- und Kleinschreibung, kleines "on", großes "Action", und dann kann ich völlig frei einen Prozedurnamen vergeben. Völlig frei heißt, dass sich trotzdem bestimmte Standards so einbürgern, aber ich kann an sich schreiben, was ich will. Ich nenne diese Prozedur nachher "OnActionButton", und zwar deshalb, weil es auch andere "OnActions" geben könnte, "OnActionToggleButton" und so etwas. "OnActionButton" rufe ich tatsächlich für alle Buttons gleichzeitig auf. Die Prozedur muss also später nachfragen: Wer hat mich hier eigentlich aufgerufen? Theoretisch könnte ich jetzt hier "OnActionBeendenButton" machen und dann nur genau eine Aktion durchführen. Das ist aber tatsächlich lästiger als wenn Sie alle gemeinsam aufrufen. Das war es erstmal schon. Diese neue Zeile muss ich also wieder mit strg+A, strg+C in das USysRibbon hineinkopieren. Ein Klick hier, dort wieder einfügen, und dann wie üblich komprimieren und damit wieder aufrufen. Soweit war das schon ein netter Versuch, und Sie kriegen hier natürlich schon die erste Fehlermeldung. Es fehlt nämlich noch Einiges. Sie sehen, auch das Bild ist nicht erschienen. Die Schaltfläche ist da, und ich gehe einfach mal auf "Alle OK". Aber jetzt müssen wir uns bisschen um das im Hintergrund kümmern, was da eigentlich alles passiert. Sie haben schon gemerkt, das Ribbon hat schon versucht, eine Prozedur aufzurufen, die das Bild nachlädt, denn die Tatsache, dass ich es im Attribut hineingeschrieben habe, ist nett, aber unverbindlich. Es muss ein Onload beziehungsweise ein LoadImage stattfinden. Das ist schonmal im Code selber. Also, ich muss hier nachbessern, kopieren und da wieder hineinschreiben. Und zwar da oben. Erstens sollte ich schonmal vorbereiten, ein Onload. Das heißt, beim Laden des Ribbons wird eine Prozedur ausgeführt, die ich nach diesem gleichen Muster immer fast genauso nenne, also "OnRibbonLoad". Und vor allem brauche ich eine LoadImage, "=", und ich nenne die normalerweise eigentlich ziemlich gleich, außer dass ich den ersten Buchstaben wieder groß schreibe. Dann kann man die Zusammengehörigkeit gut erkennen. Hier unterscheide ich, weil es auch andere OnActions gibt. Also diese Prozedur vor allem wurde vermisst. Diese wird früher oder später auch vermisst. Deswegen kann ich sie schonmal einbauen. Aber das bedeutet, wir brauchen letzten Endes drei Prozeduren: Eine wird heißen "OnRibbonLoad", eine wird heißen "LoadImage", und die "OnActionButton" wird es auch brauchen. Das wiederum kopiert und in USysRibbons eingefügt. Aber noch gar nicht neu starten, nur erstmal speichern, denn jetzt kommt die eigentliche Arbeit, die im VVA-Editor stattfindet. Mit alt+F11 gehe ich wieder herüber. Das hier können wir alles schließen. Ich lege dafür ein neues Modul an. Das ist nicht zwingend notwendig, aber es ist schon durchaus sinnvoll. Und dieses nenne ich einfach "modCallbacks". Das ist das Modul für die ganzen Callbacks. Es ist ansonsten eigentlich eine ganz normale Programmierung, nur hat sie ein paar Namen aus dem XML und vor allem ein paar Signaturen vorgegeben. Allerdings müssen wir an dieser Stelle noch ein neues Objekt einfügen. Das heißt, ich muss auf das Ribbon allgemein Bezug nehmen können. Und wir brauchen auch einen neuen Verweis. Das Ribbon ist sozusagen eine Mehr-Fähigkeit, das, was Access normalerweise so nicht kann in der Programmierung. Fangen wir mit dem Verweis an. Es braucht einen Verweis, bei "Extras" - "Verweise", auf die Office Object Library, in diesem Fall Version 15. Das steht unter "Microsoft". Hier irgendwo muss es zwischen sein. Da, diese "Microsoft Office 15.0 Object Library". Die enthält unter anderem die Datentypen, die wir gleich für das Ribbon brauchen. Nach dem "OK" sehen Sie davon erstmal natürlich nichts. Und dann kann ich überhaupt erst sinnvoll diese globale Variable einfügen, in der ich das Ribbon zwischenspeichern kann, wenn ich darauf zugreifen will. Also eine globale Variable, die setze ich mal oben davor. Eine "public", fängt deswegen mit "p_" an. Und es ist im weitesten Sinne eine Object-Variable. Ich könnte da jetzt auch wieder "Ribbon" vorschreiben, aber dieselbe heißt schon "Ribbon" und deswegen muss ich die deklarieren, "as IRibbonUI". Wenn dieser Eintrag nicht kommt, dann haben Sie den Verweis noch nicht gesetzt. Dann fehlen nämlich diese Datentypen. Das ist also ein spezieller Datentyp für das Ribbon User Interface. Vielmehr brauchen Sie davon nicht. Wir können also wieder zurück zu den Callbacks. Und jetzt fange ich zuerst an mit der Prozedur, die als erstes gefordert war, "OnRibbonLoad". Das ist ein ganz normales Sub. Ich muss jetzt noch wissen, wie sie heißt. Was ich vereinbart hatte, das kann man zur Not im XML nochmal nachgucken. Was Sie aber dort nicht nachgucken können, ist die Signatur. Also "ribbon as IRibbonUI". Das wird automatisch übergeben. Deswegen ist diese Signatur, also der Datentyp und die Reihenfolge der Parameter, zwingend vorgegeben. Nur, es lässt sich hier leider nicht herausfinden. Auf den entsprechenden Websites, wo die Ribbons erläutert werden, können Sie das gerne nachgucken, aber hier leider nicht. Das muss man wissen oder in Hilfe-Dateien finden. Und jetzt verweise ich einfach nur darauf, dass meine Variable "p_objRibbon" gleich dem übergebenen Ribbon ist. Wir haben den gleichen Datentypen. Das kann ich also so weiterreichen. Diese Prozedur wird exakt einmal ausgeführt, wenn das Ribbon beim Start der Datenbank geladen wird. Die können Sie nicht selber aufrufen. Sie werden automatisch aufgerufen, aber Sie können es nicht selbst auslösen. Das bedeutet unter anderem, wann immer wir Fehler haben oder auf "Zurücksetzen" klicken, müssen Sie die Datenbank neustarten. Das ist ein bisschen lästig. Und dann war außerdem gefordert, eine Sub, die hieß "LoadImage". Und die übergibt Ihnen automatisch eine "imageId as String", nämlich der Name der Datei, das ist das, was ich dort gegeben hatte. Und "byref", das heißt, es wird an das Ribbon zurückgegeben als Referenz, ein Image. Und das bedeutet, ich bekomme eine Image-ID als String mache irgendwas damit und gebe es an das Ribbon zurück als Picture, als Image. Und dafür gibt es einen eigenen Befehl, also dieses "set Image" ist gleich, und da rufen Sie die "LoadPicture"-Methode auf, und die möchte jetzt den Pfad und den Dateinamen wissen. Und der Pfad ist der Knackpunkt, denn an sich könnten Sie sagen: Das habe ich doch alles schon reingeschrieben in das XML. Aber dort steht ja nur der Dateiname. Hier kann ich jetzt den Pfad dazuzaubern. Und, Sie erinnern sich, wir hatten so eine "DBPfadGrafiken"- Funktion geschrieben. Und die verbinde ich jetzt mit dem "imageid". Und damit ist das schon fertig. Die Bezeichnung "imageid" ist nicht ganz glücklich. Die könnte ich hier ändern, aber die ist allgemein üblich. Es ist keine ID, sondern es ist ein Dateiname. Und außerdem, das sollten wir zumindest schonmal als Struktur vorbereiten, war ja gefordert dieses "OnActionButton". Das heißt, die Prozedur heißt "sub OnActionButton", und die kriegt übergeben ein "control as IRibbonControl". Das ist eine Datenstruktur, die mehrere Informationen enthält, vor allem zum Beispiel die ID. Das heißt, ich fange zuerst an mit einem "select case control.id". Und auch da, völlig irreführend, hinter "ID" verbirgt sich keine im üblichen Access-Sinne vermutete ID, eine Nummer oder so etwas, sondern es ist der Name, den Sie in XML auch hinter das Attribut "ID" geschrieben haben. Nur, damit ich es nochmal deutlich gesagt habe, "ID" ist ein Text. Und deswegen kann ich jetzt hier schreiben: "case btnBeenden". Und in dem Fall kommt erstmal einfach nur eine MessageBox. Mehr braucht es erstmal nicht, "vbInformation", und denken Sie immer daran, dass Sie sagen, wer es war, nämlich ich. Und ich werde deswegen, weil hier mehrere in die Prozedur hineinlaufen, direkt dafür sorgen, dass es eine "Case Else"-Meldung gibt, die sagt "msgbox Button" soundso. Jetzt kann ich den nämlich nennen "control.id". Wurde aufgerufen. Sie werden relativ zuverlässig irgendwann Schreibfehler bekommen. Und immer dann, wenn Sie sich verschrieben haben, das können wir nachher simulieren, kommt diese Meldung, und Sie sehen hier den richtigen Namen. Soweit sind jetzt alle Callbacks hoffentlich fertig. Im einfachsten Fall speichern und testen wir das mal. Also hier wieder "Datenbank komprimieren". Mal gucken, was passiert. Keine Fehlermeldung, sieht schon gut aus. Das Bild ist da, nicht durchsichtig. Wundern Sie sich hier nicht. Transparenz ist ein Problem bei Access im Moment. Aber es ist da, und wenn ich jetzt daraufklicke, meldet es sich korrekt. Soweit alles super. Ich werde nochmal schnell provozieren. Wenn ich mich hier vertippt hätte und jetzt daraufklicke, dann gibt es diese Meldung. Dafür ist diese Rest-"Case Else"- Konstruktion gedacht. Das heißt, jetzt hier natürlich wieder das richtige Wort. Wir haben also im Prinzip erstmal alles fertig. Es funktioniert. Ich habe eine eigene Schaltfläche mit einem eigenen Bild, und wenn ich daraufklicke, läuft meine eigene Prozedur ab. Und ab jetzt sind Sie vorbereitet für alles, was da oben drinsteht.

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!