{"id":55001433,"date":"2023-06-01T00:00:00","date_gmt":"2023-06-17T09:26:55","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1433"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bilder_per_COMAddIn_hinzufuegen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/","title":{"rendered":"Bilder per COM-Add-In hinzuf&uuml;gen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/f669d80c633642bb9678463ed87c2c44\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen&#8220; haben wir eine Prozedur und eine Funktion vorgestellt, mit der Sie mehrere Bilder f&uuml;r die Anzeige in Schaltfl&auml;chen et cetera gleichzeitig zu einer Access-Datenbank hinzuf&uuml;gen k&ouml;nnen. Allerdings ist es unpraktisch, eine solche Funktion in jede Datenbank kopieren zu m&uuml;ssen, in der wir sie sehen wollen. Also bauen wir uns ein COM-Add-In, mit dem wir nicht eine weitere Schaltfl&auml;che mit der neuen Funktion zum Ribbon hinzuf&uuml;gen &#8211; sondern gleich die vorhandene Schaltfl&auml;che mit der neuen Funktion belegen! Der Benutzer braucht sich also gar nicht umzugew&ouml;hnen und kann wie gewohnt Bilder zur Anwendung hinzuf&uuml;gen.<\/b><\/p>\n<h2>Hinweis<\/h2>\n<p>Die hier verwendete Entwicklungsumgebung <b>twinBASIC <\/b>ist f&uuml;r die Erstellung von DLLs f&uuml;r 32-Bit-Office kostenlos, bei der 64-Bit-Version wird ein Splash-Screen eingeblendet.<\/p>\n<p>Die 64-Bit-Version kann unter folgendem Link erworben werden (in einer Zeile):<\/p>\n<pre>https:\/\/shop.minhorst.com\/access-tools\/364\/twinbasic-professional-edition-jahreslizenz?c=78<\/pre>\n<p>Der Download enth&auml;lt jedoch die 64-Bit-DLL zum Einsatz auf Ihrem System inklusive Setup.<\/p>\n<h2>Ausgangssituation<\/h2>\n<p>Wenn wir wie in Bild 1 auf den Ribbonbefehl <b>Durchsuchen&#8230;<\/b> klicken, erscheint ein Dateiauswahldialog, mit dem allerdings nur eine Bilddatei gleichzeitig ausgew&auml;hlt werden kann. Im Beitrag <b>Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen <\/b>(<b>www.access-im-unternehmen.de\/1436<\/b>) haben wir eine Funktion vorgestellt, mit der wir auf die gleiche Weise mehrere Bilddateien zur Datenbank und somit zur Tabelle <b>MSysResources <\/b>hinzuf&uuml;gen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_001.png\" alt=\"Hinzuf&uuml;gen eines Bildes als Inhalt eines Bildsteuerelements oder f&uuml;r andere Belange\" width=\"700\" height=\"238,6544\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen eines Bildes als Inhalt eines Bildsteuerelements oder f&uuml;r andere Belange<\/span><\/b><\/p>\n<h2>Funktion per Ribbonanpassung &#8222;&uuml;berschreiben&#8220;<\/h2>\n<p>Diese Funktion wollen wir nun so in Access integrieren, dass sie durch Anklicken der Schaltfl&auml;che <b>Durchsuchen&#8230; <\/b>statt der eingebauten Funktion ausgel&ouml;st wird. Das k&ouml;nnen wir durch eine entsprechende Ribbon-Definition erreichen, in der wir in einem <b>command<\/b>-Element einen Verweis auf das entsprechende Steuerelement und einen Aufruf einer alternativen Prozedur angeben.<\/p>\n<p>Die Ribbon-Definition sieht wie folgt aus:<\/p>\n<pre>&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/ office\/2006\/01\/customui\"&gt;\r\n   &lt;commands&gt;\r\n     &lt;command onAction=\"onAction\" idMso=\"SharedImageBrowse\"\/&gt;\r\n   &lt;\/commands&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p>Die hier angegebene Prozedur f&uuml;r das Attribut <b>onAction<\/b> k&ouml;nnen wir wie folgt definieren:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n         ByRef CancelDefault)\r\n     BilderImportieren <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ruft die Prozedur <b>BilderImportieren <\/b>auf, die wir im oben genannten Beitrag beschrieben haben.<\/p>\n<p>Wenn wir diese Ribbondefinition in der Anwendung unterbringen, zum Beispiel f&uuml;r ein Formular oder als Anwendungsribbon, steht die Funktion zwar zur Verf&uuml;gung und &uuml;berschreibt auch die eingebaute Funktion des Ribbon-Steuerelements, aber diese hilft uns dann auch nur in der aktuellen Anwendung weiter. Und wer sucht schon in den eingebauten Steuerelementen des Ribbons nach benutzerdefinierten Funktionen? Deshalb machen wir es einen Schritt professioneller und bauen die Funktion in ein COM-Add-In ein, das die Funktion fortan in jeder Access-Instanz zur Verf&uuml;gung stellt &#8211; egal, welche Anwendung wir darin ge&ouml;ffnet haben.<\/p>\n<h2>Einbau in ein COM-Add-In<\/h2>\n<p>Den Einbau der beiden Routinen aus dem oben genannten Artikel in ein COM-Add-In beziehungsweise dessen Erstellung erfolgt mit dem Tool <b>twinBASIC<\/b>, das wir schon in einigen Beitr&auml;gen erw&auml;hnt haben. Interessant als Zusatzinformation zu dem, was Sie im vorliegenden Beitrag lesen, d&uuml;rfte der Beitrag <b>twinBASIC &#8211; COM-Add-Ins f&uuml;r Access <\/b>(<b>www.access-im-unternehmen.de\/1306<\/b>) sein.<\/p>\n<h2>Download und Installation von twinBASIC<\/h2>\n<p>Da twinBASIC mittlerweile eine andere Plattform als Entwicklungsumgebung verwendet, weisen wir nochmal auf den Download und die Installation hin.<\/p>\n<p>Der Download der jeweils neuesten Version erfolgt &uuml;ber diesen Link:<\/p>\n<pre>https:\/\/github.com\/twinbasic\/twinbasic\/releases<\/pre>\n<p>Hier erweitern Sie f&uuml;r die gew&uuml;nschte Version den Bereich Assets (siehe Bild 2) und laden die Datei herunter, beispielsweise <b>twinBASIC_IDE_BETA_277.zip<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_002.png\" alt=\"Download der twinBASIC-Entwicklungsumgebung\" width=\"649,559\" height=\"386,0317\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Download der twinBASIC-Entwicklungsumgebung<\/span><\/b><\/p>\n<p>Anschlie&szlig;end stellen Sie die Option <b>Zulassen <\/b>f&uuml;r die heruntergeladene Datei auf <b>Ja <\/b>ein (siehe Bild 3). Die Eigenschaft finden Sie im <b>Eigenschaften<\/b>-Dialog der Datei, den Sie mit dem entsprechenden Kontextmen&uuml;-Befehl &ouml;ffnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_003.png\" alt=\"Aktivieren der Sicherheit der Zip-Datei\" width=\"349,5589\" height=\"490,1528\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Aktivieren der Sicherheit der Zip-Datei<\/span><\/b><\/p>\n<p>Danach extrahieren Sie die in der Zip-Datei enthaltenen Dateien in ein Verzeichnis Ihrer Wahl.<\/p>\n<p>Anschlie&szlig;end k&ouml;nnen Sie durch einen Doppelklick auf die Datei <b>twinBASIC.exe<\/b> direkt mit der Anwendung arbeiten &#8211; es ist keine Installation n&ouml;tig.<\/p>\n<h2>Neues COM-Add-In anlegen<\/h2>\n<p>Wir legen nach dem Start von twinBASIC dort ein neues Projekt auf Basis der Vorlage <b>Sample 5. MyCOMAddin <\/b>an, das auf der Seite <b>Samples <\/b>der Startseite von <b>twinBASIC <\/b>angezeigt wird.<\/p>\n<p>Dieses Projekt enth&auml;lt alles, was man f&uuml;r das Erstellen eines eigenen COM-Add-Ins braucht &#8211; angefangen von einer Ribbon-Anpassung mit einem individuellen <b>tab<\/b>-Element plus Button, der die ebenfalls integrierte Prozedur ausl&ouml;st.<\/p>\n<p>Wir wollen unser Projekt <b>amvAddPictures <\/b>benennen und auch die einzige Klasse des Projekts erh&auml;lt diesen Namen. Der eindeutige Klassen-Identifizierer wurde von twinBASIC automatisch vergeben. Die Klasse implementiert zwei Schnittstellen, n&auml;mlich <b>IDTExtensibility2 <\/b>und <b>IRibbonExtensibility<\/b>:<\/p>\n<pre>[ ClassId (\"061EF79E-7E28-4BF7-870F-01AF336670CD\") ]\r\n<span style=\"color:blue;\">Class<\/span> amvAddPictures\r\n     Implements IDTExtensibility2\r\n     [ WithDispatchForwarding ]\r\n     Implements IRibbonExtensibility\r\n     ... mehr Code\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Implementieren der Schnittstelle IDTExtensibility2<\/h2>\n<p>Die Schnittstelle <b>IDTExtensibility2 <\/b>gibt die Methoden vor, die zu verschiedenen Ereignissen beim &Ouml;ffnen, Schlie&szlig;en et cetera der Access-Anwendung ausgef&uuml;hrt werden. Uns interessiert nur eine davon, n&auml;mlich <b>OnConnection<\/b>. Diese wird n&auml;mlich genau dann ausgel&ouml;st, wenn der Benutzer eine Access-Instanz &ouml;ffnet und liefert einige interessante Parameter. Auch hier interessiert uns nur einer, n&auml;mlich <b>Application<\/b>. Dieser liefert einen Verweis auf die aufrufende Anwendung, in diesem Fall <b>Access.Application<\/b>. Da die Funktionen eines COM-Add-Ins meist auf die aktuelle Access-Instanz zugreifen sollen, speichern wir den Verweis auf diese Instanz in einer Objektvariablen, die wir wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application<\/pre>\n<p>F&uuml;r die Verwendung dieser Klasse ben&ouml;tigen wir, &auml;hnlich wie im VBA-Editor beim Zugriff auf die Objekte anderer Bibliotheken, einen Verweis.<\/p>\n<p>Diesen f&uuml;gen wir &uuml;ber die Projekteigenschaften hinzu, die wir &uuml;ber den Eintrag <b>Settings <\/b>im Projektexplorer &ouml;ffnen k&ouml;nnen. Hier scrollen wir zum Bereich <b>COM Type Library \/ ActiveX References<\/b>, wo wir im unteren Feld nach <b>Access <\/b>suchen und den gew&uuml;nschten Eintrag anhaken (siehe Bild 4). Damit diese &Auml;nderung wirksam wird, m&uuml;ssen wir das Projekt speichern, schlie&szlig;en und erneut &ouml;ffnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_004.png\" alt=\"Verweis auf die Access-Bibliothek hinzuf&uuml;gen\" width=\"424,5589\" height=\"383,1569\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Verweis auf die Access-Bibliothek hinzuf&uuml;gen<\/span><\/b><\/p>\n<h2>Schnittstellen implementieren<\/h2>\n<p>Die Methoden der Schnittstelle implementieren wir darunter wie in Listing 1. Wir bilden hier auch die weiteren, nicht mit Anweisungen gef&uuml;llten Methoden ab, da diese auf jeden Fall im Projekt implementiert werden m&uuml;ssen.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnConnection\r\n     <span style=\"color:blue;\">Set<\/span> objAccess = Application\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n     \r\n<span style=\"color:blue;\">Sub <\/span>OnDisconnection(ByVal RemoveMode<span style=\"color:blue;\"> As <\/span>ext_DisconnectMode, ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n         Implements IDTExtensibility2.OnDisconnection\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n     \r\n<span style=\"color:blue;\">Sub <\/span>OnAddInsUpdate(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnAddInsUpdate\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n     \r\n<span style=\"color:blue;\">Sub <\/span>OnStartupComplete(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnStartupComplete\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n     \r\n<span style=\"color:blue;\">Sub <\/span>OnBeginShutdown(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnBeginShutdown\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Implementierung der Methoden der Schnittstelle IDTExtensibility2<\/span><\/b><\/p>\n<h2>Implementierung der Schnittstelle IRibbonExtensibility<\/h2>\n<p>Die zweite Schnittstelle erlaubt das Implementieren einer Funktion, die ebenfalls beim Start von Access ausgel&ouml;st wird und die es uns erm&ouml;glicht, eine Ribbon-Definition zur&uuml;ckzugeben, die dann von Access angewendet wird. Das einzige Element dieser Schnittstelle haben wir in Listing 2 abgebildet. Hier stellen wir die oben beschriebene Anpassung des Ribbons in der Variablen <b>strXML <\/b>zusammen und geben diese als Funktionsergebnis zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2006\/01\/customui\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;commands&gt;&lt;command onAction=\"\"onAction\"\" idMso=\"\"SharedImageBrowse\"\"\/&gt;&lt;\/commands&gt;\"\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span>        <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Funktion, die eine Ribbondefinition entgegennimmt<\/span><\/b><\/p>\n<p>Diese sorgt, wie bereits beschrieben, nicht f&uuml;r das Hinzuf&uuml;gen eines neuen Elements zum Ribbon, sondern sie legt fest, dass beim Anklicken der Schaltfl&auml;che <b>Bild einf&uuml;gen <\/b>die mit dem Attribut <b>onAction <\/b>angegebene Prozedur ausgef&uuml;hrt wird.<\/p>\n<p>Diese Prozedur hinterlegen wir in der Klasse wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n         ByRef CancelDefault)\r\n     BilderImportieren <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier rufen wir vor allem die Prozedur <b>BilderImportieren<\/b> auf, der wir den Wert <b>True <\/b>f&uuml;r den Parameter <b>bolBeiVorhandenNummerieren <\/b>zuweisen. Diesen Parameter kann man auch auf False einstellen, aber in diesem Fall haben wir uns daf&uuml;r entschieden, die von Access standardm&auml;&szlig;ig vorgegebene Verhaltensweise nachzubauen.<\/p>\n<p>Die Prozedur <b>onAction <\/b>enth&auml;lt zwei Parameter. Der erste namens control liefert einen Verweis auf das ausl&ouml;sende Steuerelement. Da das COM-Add-In nur ein Steuerelement im Ribbon abbilden soll, werten wir diesen Parameter nicht aus. Der zweite Parameter hei&szlig;t <b>CancelDefault <\/b>und nimmt einen <b>Boolean<\/b>-Wert entgegen, der angibt, ob die eingebaute Funktion des Steuerelements ebenfalls ausgef&uuml;hrt werden soll. Das ist hier nicht der Fall &#8211; sonst w&uuml;rden zwei Dateiauswahl-Dialoge nacheinander angezeigt werden. Da der Standardwert dieses Parameters <b>True <\/b>lautet, brauchen wir diesen nicht zu &auml;ndern.<\/p>\n<p>Wichtig bei der Definition des Parameters <b>CancelDefault <\/b>ist, dass wir diesen nicht mit einem Datentyp versehen &#8211; beispielsweise <b>Boolean<\/b> -, auch wenn er ohne Datentyp im Editor markiert wird. Damit w&uuml;rde das COM-Add-In nicht funktionieren.<\/p>\n<h2>Das Importieren der Bilder<\/h2>\n<p>Die Prozedur <b>BilderImportieren<\/b>, die wir bereits im Beitrag <b>Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen <\/b>(<b>www.access-im-unternehmen.de\/1436<\/b>) vorgestellt haben, m&uuml;ssen wir an einer Stelle anpassen. Dazu stellen wir der in der Zeile, in der wir die Variable <b>objFiledialog <\/b>f&uuml;llen, der <b>FileDialog<\/b>-Klasse die Objektvariable <b>objAccess<\/b> voran (siehe Zeile 04 in Listing 3).<\/p>\n<pre>01  Public Sub BilderImportieren(<span style=\"color:blue;\">Optional<\/span> bolBeiVorhandenNummerieren<span style=\"color:blue;\"> As Boolean<\/span>)\r\n02      Dim objFiledialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n03      Dim varBildpfad<span style=\"color:blue;\"> As Variant<\/span>\r\n04      <span style=\"color:blue;\">Set<\/span> objFiledialog = &lt;b&gt;objAccess.&lt;\/b&gt;FileDialog(msoFileDialogFilePicker)\r\n05      <span style=\"color:blue;\">With<\/span> objFiledialog\r\n06          .AllowMultiSelect = <span style=\"color:blue;\">True<\/span>\r\n07          .Filters.Clear\r\n08          .Filters.Add \"Bilddatei (*.png)\", \"*.png\"\r\n09          .Filters.Add \"Alle Dateien (*.*)\", \"*.*\"\r\n10          If .Show = <span style=\"color:blue;\">True<\/span> Then\r\n11            For Each varBildpfad In .SelectedItems\r\n12                  BildImportieren CStr(varBildpfad), bolBeiVorhandenNummerieren\r\n13              <span style=\"color:blue;\">Next<\/span> varBildpfad\r\n14          Else\r\n15              <span style=\"color:blue;\">Debug.Print<\/span> \"Keine Datei ausgew&auml;hlt\"\r\n16         End If\r\n17      End <span style=\"color:blue;\">With<\/span>\r\n18  End Sub        <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Importieren von Bildern<\/span><\/b><\/p>\n<p>Das ist notwendig, damit wir die <b>FileDialog<\/b>-Klasse im Kontext der aktuellen Access-Anwendung &ouml;ffnen und das Ergebnis auch von dieser verarbeitet wird.<\/p>\n<p>In der Funktion <b>BildImportieren<\/b>, die eines der gew&auml;hlten Bilder in die Datenbank importiert, sind ein paar weitere &Auml;nderungen n&ouml;tig (siehe Listing 4). In Zeile 07 verwenden wir die Klasse <b>DLookup <\/b>des Objekts <b>objAccess<\/b>, um auf die Daten dieser Datenbank zuzugreifen. Auch die folgende Zeile 08 verwendet das <b>CurrentProject<\/b>-Objekt von <b>objAccess<\/b>. Gleiches gilt wieder f&uuml;r Zeile 14 und 18 bei der <b>DLookup<\/b>-Funktion.<\/p>\n<pre>01  Public Function BildImportieren(strBildpfad<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolBeiVorhandenNummerieren<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n02      Dim strBildname<span style=\"color:blue;\"> As String<\/span>\r\n03      Dim strBildnameNummeriert<span style=\"color:blue;\"> As String<\/span>\r\n04      Dim intNummer<span style=\"color:blue;\"> As Integer<\/span>\r\n05      strBildname = <span style=\"color:blue;\">Mid<\/span>(strBildpfad, <span style=\"color:blue;\">InStrRev<\/span>(strBildpfad, \"\\\") + 1)\r\n06      strBildname = <span style=\"color:blue;\">Left<\/span>(strBildname, <span style=\"color:blue;\">InStrRev<\/span>(strBildname, \".\") - 1)\r\n07      If IsNull(objAccess.DLookup(\"id\", \"MSysResources\", \"name = ''\" & strBildname & \"''\")) Then\r\n08          objAccess.CurrentProject.AddSharedImage strBildname, strBildpfad\r\n09          BildImportieren = <span style=\"color:blue;\">True<\/span>\r\n10      Else\r\n11          If bolBeiVorhandenNummerieren Then\r\n12              intNummer = 1\r\n13              strBildnameNummeriert = intNummer & \"_\" & strBildname\r\n14              Do While <span style=\"color:blue;\">Not<\/span> IsNull(objAccess.DLookup(\"id\", \"MSysResources\", \"name = ''\" & strBildnameNummeriert & \"''\"))\r\n15                  intNummer = intNummer + 1\r\n16                  strBildnameNummeriert = intNummer & \"_\" & strBildname\r\n17              <span style=\"color:blue;\">Loop<\/span>\r\n18              objAccess.CurrentProject.AddSharedImage strBildnameNummeriert, strBildpfad\r\n19              BildImportieren = <span style=\"color:blue;\">True<\/span>\r\n20          Else\r\n21              <span style=\"color:blue;\">MsgBox<\/span> \"Das Bild ''\" & strBildname & \"'' wurde nicht importiert.\"\r\n22          End If\r\n23      End If\r\n24  End Function<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Importieren eines einzelnen Bildes<\/span><\/b><\/p>\n<p>Damit ist der Code der Klasse <b>amvAddPictures <\/b>vollst&auml;ndig.<\/p>\n<h2>Registrierungscode anpassen<\/h2>\n<p>Wir nehmen nun noch einige weitere &Auml;nderungen am Projekt vor, damit die COM-DLL zum Testen vern&uuml;nftig registriert werden kann. Das betrifft zuerst die Datei <b>DLLRegistration.twin<\/b>.<\/p>\n<p>Hier entfernen wir gegen&uuml;ber der Version, die wir durch das Beispielprojekt erstellt haben, die Zeilen, die f&uuml;r das Registrieren als DLL von Excel n&ouml;tig sind. Au&szlig;erdem stellen wir den Namen in der Konstanten <b>AddinClassName <\/b>in <b>amvAddPictures <\/b>um (siehe Listing 5).<\/p>\n<pre>Module DllRegistration\r\n     \r\n     Const AddinProjectName<span style=\"color:blue;\"> As String<\/span> = VBA.Compilation.CurrentProjectName\r\n     Const AddinClassName<span style=\"color:blue;\"> As String<\/span> = \"amvAddPictures\"\r\n     Const AddinQualifiedClassName<span style=\"color:blue;\"> As String<\/span> = AddinProjectName & \".\" & AddinClassName\r\n     Const RootRegistryFolder_ACCESS<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\\" _\r\n         & AddinQualifiedClassName & \"\\\"\r\n     <span style=\"color:blue;\">Public <\/span>Function DllRegisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n         <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n         wscript.RegWrite RootRegistryFolder_ACCESS & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n         wscript.RegWrite RootRegistryFolder_ACCESS & \"Description\", AddinProjectName, \"REG_SZ\"\r\n         wscript.RegWrite RootRegistryFolder_ACCESS & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     RegError:\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"DllRegisterServer -- An error occured trying to write to the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n                 Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     End Function\r\n  \r\n     <span style=\"color:blue;\">Public <\/span>Function DllUnregisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n         <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n         wscript.RegDelete RootRegistryFolder_ACCESS & \"FriendlyName\"\r\n         wscript.RegDelete RootRegistryFolder_ACCESS & \"Description\"\r\n         wscript.RegDelete RootRegistryFolder_ACCESS & \"LoadBehavior\"\r\n         wscript.RegDelete RootRegistryFolder_ACCESS\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     RegError:\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"DllUnregisterServer -- An error occured trying to delete from the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n                 Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     End Function\r\nEnd Module     <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Das Modul DLLRegistration<\/span><\/b><\/p>\n<h2>Projekteinstellungen anpassen<\/h2>\n<p>Schlie&szlig;lich nehmen wir noch einige Einstellungen an den Projekteigenschaften vor. Dabei stellen wir den Projektnamen und den Anwendungstitel auf <b>amvAddPictures<\/b> ein und f&uuml;gen einen Beschreibungstext hinzu (siehe Bild 5). Nach den &Auml;nderungen muss das Projekt gespeichert und der Compiler neu gestartet werden, was im Screenshot auch als Kommentar zu erkennen ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_005.png\" alt=\"Einstellungen f&uuml;r das Projekt\" width=\"649,559\" height=\"365,877\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Einstellungen f&uuml;r das Projekt<\/span><\/b><\/p>\n<h2>Testen des COM-Add-Ins<\/h2>\n<p>Nun k&ouml;nnen wir das COM-Add-In einmal kompilieren und registrieren. Das k&ouml;nnen wir alles von der twinBASIC-Entwicklungsumgebung aus erledigen, indem wir oben rechts auf die Schaltfl&auml;che <b>Build <\/b>klicken. Dies kompiliert das Projekt in eine DLL-Datei und registriert diese gleich im Anschluss anhand der Vorgaben im Modul <b>DllRegistration<\/b>.<\/p>\n<p>Wenn dies fehlerfrei durchl&auml;uft, k&ouml;nnen wir danach eine neue Access-Instanz &ouml;ffnen und darin ein Formular in der Entwurfsansicht &ouml;ffnen.<\/p>\n<p>Klicken wir nun im Bereich Steuerelemente auf den Befehl <b>Bild einf&uuml;gen <\/b>und dann unten auf <b>Durchsuchen<\/b>, erscheint ein Dateiauswahl-Dialog, mit dem Sie nun mehrere statt nur eine Datei &ouml;ffnen k&ouml;nnen.<\/p>\n<p>Die einzige Abweichung von der Originalfunktion ist, dass wir hiermit das ausgew&auml;hlte Bild oder die ausgew&auml;hlten Bilder nicht direkt in das Formular oder ein aktuell markiertes Steuerelement wie beispielsweise eine Schaltfl&auml;che einf&uuml;gen.<\/p>\n<p>Dazu m&uuml;ssen wir diese noch aus der nun um die hinzugef&uuml;gten Bilder erweiterten Liste der Bilder ausw&auml;hlen.<\/p>\n<h2>Setup f&uuml;r das COM-Add-In erstellen<\/h2>\n<p>In weiteren Beitr&auml;gen wie beispielsweise <b>Setup f&uuml;r Access: Umsetzung mit InnoSetup <\/b>(<b>www.access-im-unternehmen.de\/1326<\/b>) haben wir bereits das kostenlose Tool <b>Inno Setup <\/b>vorgestellt.<\/p>\n<p>F&uuml;r die Erstellung eines Setups f&uuml;r ein COM-Add-In ben&ouml;tigen wir nur ein recht kleines Skript. Dieses finden Sie in Listing 6.<\/p>\n<pre>#define MyAppName \"amvAddPictures\"\r\n#define MyAppVersion \"1.0.0.1\"\r\n#define MyAppPublisher \"Andr&eacute; Minhorst\"\r\n#define MyAppURL \"http:\/\/shop.minhorst.com\"\r\n[Setup]\r\nAppId={#MyAppName}\r\nAppName={#MyAppName}\r\nAppVersion={#MyAppVersion}\r\nAppVerName={#MyAppName} v{#MyAppVersion}\r\nAppPublisher={#MyAppPublisher}\r\nAppPublisherURL={#MyAppURL}\r\nAppSupportURL={#MyAppURL}\r\nAppUpdatesURL={#MyAppURL}\r\nOutputDir=Setup\r\nOutputBaseFilename={#MyAppName}-Setup\r\nCompression=lzma\r\nSolidCompression=yes\r\nShowLanguageDialog=no\r\nLanguageDetectionMethod=none\r\nUsePreviousGroup=<span style=\"color:blue;\">False<\/span>\r\nDisableProgramGroupPage=yes\r\nAppendDefaultGroupName=<span style=\"color:blue;\">False<\/span>\r\nWizardStyle=modern\r\nVersionInfoVersion={#MyAppVersion}\r\nVersionInfoTextVersion={#MyAppVersion}\r\nVersionInfoProductVersion={#MyAppVersion}\r\nVersionInfoProductTextVersion={#MyAppVersion}\r\nVersionInfoCompany={#MyAppPublisher}\r\nVersionInfoProductName={#MyAppName}\r\nPrivilegesRequired=lowest\r\nDefaultDirName={localappdata}\\amvAddPictures\r\n[Languages]\r\nName: \"german\"; MessagesFile: \"compiler:Languages\\German.isl\"\r\n[Files]\r\nSource: \"Build\\amvAddPictures_win32.dll\"; DestDir: \"{app}\"; Flags: regserver  <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Das Skript zum Erstellen eines Setups f&uuml;r die COM-Dll<\/span><\/b><\/p>\n<p>Das Skript enth&auml;lt einige Standardeinstellungen, die wir in einem weiteren Beitrag in einer der kommenden Ausgaben erl&auml;utern. Die wichtigsten sind die Einstellungen f&uuml;r die Konstanten im oberen Bereich, von denen wir in den folgenden Zeilen regen Gebrauch machen.<\/p>\n<p>Wichtig ist die Angabe des Parameters <b>OutputDir<\/b>, wo wir das Verzeichnis relativ zum Verzeichnis der <b>.iss<\/b>-Datei angeben, in dem die Setup-Datei erstellt werden soll.<\/p>\n<p>Weiter unten f&uuml;r den Parameter <b>DefaultDirName <\/b>geben wir das Verzeichnis an, in dem das Setup die zu installierenden Daten speichern soll. Der Platzhalter <b>{localappdata} <\/b>steht beispielsweise f&uuml;r den Ordner <b>c:\\Users\\[Benutzername]\\AppData\\Local\\<\/b>, diesem f&uuml;gen wir noch das Verzeichnis <b>amvAddPictures<\/b> hinzu.<\/p>\n<p>Schlie&szlig;lich ist der einzige Eintrag im Bereich <b>Files <\/b>wichtig. Dieser gibt an, welche Datei zum Setup hinzugef&uuml;gt werden soll, wo diese landen soll und welche zus&auml;tzlichen Optionen es gibt. Mit <b>DestDir <\/b>und dem Wert <b>{app} <\/b>geben wir an, dass die Datei in dem vom Benutzer im Setup ausgew&auml;hlten Verzeichnis gespeichert werden soll. Der Parameter <b>Flags <\/b>legt mit dem Wert <b>regserver <\/b>fest, dass die Datei mit der Anwendung <b>RegSvr32.exe <\/b>registriert werden soll.<\/p>\n<p>Haben wir alle Daten f&uuml;r das Setup in dem Skript zusammengetragen, bieten sich zwei interessante Optionen:<\/p>\n<ul>\n<li>Wir k&ouml;nnen es erstellen und dann ausprobieren oder<\/li>\n<li>wir probieren es aus, ohne es vorher zu erstellen.<\/li>\n<\/ul>\n<p>Beide Optionen werden &uuml;ber die Symbolleiste von Inno Setup bereitgestellt. Wir k&ouml;nnen dies aber auch &uuml;ber den Men&uuml;eintrag <b>Build|Compile <\/b>oder die Tastenkombination <b>Strg + F9 <\/b>erledigen. Wollen Sie den Ablauf testen, was bei umfangreicheren Setups auch noch das Debuggen erm&ouml;glicht, bet&auml;tigen Sie die Schaltfl&auml;che <b>Run <\/b>beziehungsweise die Taste <b>F9 <\/b>oder den Men&uuml;befehl <b>Run|Run<\/b>.<\/p>\n<h2>Durchf&uuml;hren des Setup<\/h2>\n<p>Wenn wir das Setup auf die eine oder andere Art gestartet haben, schl&auml;gt dieses das der Variablen <b>{localappdata} <\/b>entsprechende Verzeichnis als Zielordner vor (siehe Bild 6). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_006.png\" alt=\"Vorschlag f&uuml;r den Zielordner f&uuml;r die zu installierende Datei\" width=\"574,559\" height=\"445,8116\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Vorschlag f&uuml;r den Zielordner f&uuml;r die zu installierende Datei<\/span><\/b><\/p>\n<p>In der Regel wird man dieses &uuml;bernehmen, was sich dann im n&auml;chsten Schritt wie in Bild 7 in der Zusammenfassung der Installationseinstellungen niederschl&auml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_1433_007.png\" alt=\"Einstellungen f&uuml;r die Installation\" width=\"574,559\" height=\"445,8116\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Einstellungen f&uuml;r die Installation<\/span><\/b><\/p>\n<p>Nach einem weiteren Klick auf Installieren wird die DLL schlie&szlig;lich an die gew&uuml;nschte Stelle kopiert und registriert.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wir man praktische Funktionen, die man per VBA programmiert hat und die aber immer manuell aus dem VBA-Editor heraus gestartet werden m&uuml;ssen, in eine COM-DLL &uuml;bertr&auml;gt. Diese wird beim Start von Access aktiviert und stellt ihre Befehle &uuml;ber den dort definierten Ribbon-Bereich zur Verf&uuml;gung, in diesem Fall &uuml;ber den Eintrag <b>Bild einf&uuml;gen|Durchsuchen <\/b>in der Formular- oder Berichtsentwurfsansicht.<\/p>\n<p>Man k&ouml;nnte dieses Tool noch vereinfachen, indem man den zuletzt verwendeten Ordner beispielsweise in der Registry speichert und diesen dann beim n&auml;chsten Aufruf als Standardverzeichnis verwendet.<\/p>\n<p>Der Download enth&auml;lt neben der 32-Bit-Variante auch ein Setup des Tools f&uuml;r die 64-Bit-Variante von Office.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvAddPictures-Setup_32.exe<\/p>\n<p>amvAddPictures-Setup_64.exe<\/p>\n<p>SetupAddPictures_32.iss<\/p>\n<p>SetupAddPictures_64.iss<\/p>\n<p>amvAddPictures.twinproj<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/32478C18-6DBE-4D0F-B5CD-0DC621950DF0\/aiu_1433.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen&#8220; haben wir eine Prozedur und eine Funktion vorgestellt, mit der Sie mehrere Bilder f&uuml;r die Anzeige in Schaltfl&auml;chen et cetera gleichzeitig zu einer Access-Datenbank hinzuf&uuml;gen k&ouml;nnen. Allerdings ist es unpraktisch, wenn wir solch eine Funktion in jede Datenbank hineinkopieren m&uuml;ssen, in der wie diese sehen wollen. Also bauen wir uns ein COM-Add-In, mit dem wir nicht eine weitere Schaltfl&auml;che mit der neuen Funktion zum Ribbon hinzuf&uuml;gen &#8211; sondern gleich die vorhandene Schaltfl&auml;che mit der neuen Funktion belegen! Der Benutzer braucht sich also gar nicht umzugew&ouml;hnen und kann wie gewohnt Bilder zur Anwendung hinzuf&uuml;gen.<\/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":[662023,66032023,44000027],"tags":[],"class_list":["post-55001433","post","type-post","status-publish","format-standard","hentry","category-662023","category-66032023","category-Loesungen"],"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>Bilder per COM-Add-In hinzuf&uuml;gen - 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\/Bilder_per_COMAddIn_hinzufuegen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bilder per COM-Add-In hinzuf&uuml;gen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen&quot; haben wir eine Prozedur und eine Funktion vorgestellt, mit der Sie mehrere Bilder f&uuml;r die Anzeige in Schaltfl&auml;chen et cetera gleichzeitig zu einer Access-Datenbank hinzuf&uuml;gen k&ouml;nnen. Allerdings ist es unpraktisch, wenn wir solch eine Funktion in jede Datenbank hineinkopieren m&uuml;ssen, in der wie diese sehen wollen. Also bauen wir uns ein COM-Add-In, mit dem wir nicht eine weitere Schaltfl&auml;che mit der neuen Funktion zum Ribbon hinzuf&uuml;gen - sondern gleich die vorhandene Schaltfl&auml;che mit der neuen Funktion belegen! Der Benutzer braucht sich also gar nicht umzugew&ouml;hnen und kann wie gewohnt Bilder zur Anwendung hinzuf&uuml;gen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-17T09:26:55+00:00\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Bilder per COM-Add-In hinzuf&uuml;gen\",\"datePublished\":\"2023-06-17T09:26:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/\"},\"wordCount\":2462,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/f669d80c633642bb9678463ed87c2c44\",\"articleSection\":[\"2023\",\"3\\\/2023\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/\",\"name\":\"Bilder per COM-Add-In hinzuf&uuml;gen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/f669d80c633642bb9678463ed87c2c44\",\"datePublished\":\"2023-06-17T09:26:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/f669d80c633642bb9678463ed87c2c44\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/f669d80c633642bb9678463ed87c2c44\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_per_COMAddIn_hinzufuegen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bilder per COM-Add-In hinzuf&uuml;gen\"}]},{\"@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":"Bilder per COM-Add-In hinzuf&uuml;gen - 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\/Bilder_per_COMAddIn_hinzufuegen\/","og_locale":"de_DE","og_type":"article","og_title":"Bilder per COM-Add-In hinzuf&uuml;gen","og_description":"Im Beitrag \"Bilder f&uuml;r Buttons und Co. schnell hinzuf&uuml;gen\" haben wir eine Prozedur und eine Funktion vorgestellt, mit der Sie mehrere Bilder f&uuml;r die Anzeige in Schaltfl&auml;chen et cetera gleichzeitig zu einer Access-Datenbank hinzuf&uuml;gen k&ouml;nnen. Allerdings ist es unpraktisch, wenn wir solch eine Funktion in jede Datenbank hineinkopieren m&uuml;ssen, in der wie diese sehen wollen. Also bauen wir uns ein COM-Add-In, mit dem wir nicht eine weitere Schaltfl&auml;che mit der neuen Funktion zum Ribbon hinzuf&uuml;gen - sondern gleich die vorhandene Schaltfl&auml;che mit der neuen Funktion belegen! Der Benutzer braucht sich also gar nicht umzugew&ouml;hnen und kann wie gewohnt Bilder zur Anwendung hinzuf&uuml;gen.","og_url":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-06-17T09:26:55+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Bilder per COM-Add-In hinzuf&uuml;gen","datePublished":"2023-06-17T09:26:55+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/"},"wordCount":2462,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/f669d80c633642bb9678463ed87c2c44","articleSection":["2023","3\/2023","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/","url":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/","name":"Bilder per COM-Add-In hinzuf&uuml;gen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/f669d80c633642bb9678463ed87c2c44","datePublished":"2023-06-17T09:26:55+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/f669d80c633642bb9678463ed87c2c44","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/f669d80c633642bb9678463ed87c2c44"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Bilder_per_COMAddIn_hinzufuegen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Bilder per COM-Add-In hinzuf&uuml;gen"}]},{"@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\/55001433","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=55001433"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001433\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}