{"id":55001476,"date":"2024-04-01T00:00:00","date_gmt":"2024-02-29T18:38:14","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1476"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Individuelle_FormularIcons_ohne_Zusatzdateien","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/","title":{"rendered":"Individuelle Formular-Icons ohne Zusatzdateien"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Icons in Access-Formularen und Berichten&#8220; (www.access-im-unternehmen.de\/1235) haben wir schon einmal eine M&ouml;glichkeit aufgezeigt, wie man Formulare und Berichte in Access mit individuellen Icons ausstatten kann. So kann man beispielsweise ein Formular zum Bearbeiten eines Kunden mit dem gleichen Icon ausstatten, das man auch f&uuml;r die Schaltfl&auml;che zum &Ouml;ffnen dieses Formulars im Ribbon untergebracht hat. Der Benutzer kann so noch besser erkennen, worum es im Formular geht. In der vorherigen Fassung der L&ouml;sung hatten wir allerdings noch das Problem, dass wir die Icons, die links oben in Formularen und Berichten erscheinen sollten, noch im Dateisystem speichern mussten. Das kann aus diversen Gr&uuml;nden zu Problem f&uuml;hren und daher sind wir froh, hier den n&auml;chsten Schritt gehen zu k&ouml;nnen: Das direkte Einlesen der Icons aus der Tabelle &#8222;MSysResources&#8220; und anschlie&szlig;endes Anzeigen in Formulare und Berichten.<\/b><\/p>\n<h2>Ziel: Formular-Icons ohne externe Dateien<\/h2>\n<p>Wie bereits erw&auml;hnt, sind wir bereits in der Lage, Formulare mit einem eigenen Icon auszustatten (siehe Bild 1). Das Problem ist jedoch bisher gewesen, dass die entsprechende Icon-Datei sich auf der Festplatte befinden muss, damit wir diese laden und per API dem Formular als Icon zuweisen konnten. Damit wir nicht f&uuml;r jede Anwendung einen eigenen Ordner bereitstellen mussten, der die ben&ouml;tigten Icon-Dateien enth&auml;lt oder sogar die Icon-Dateien lose im Verzeichnis der Access-Datenbank gespeichert haben, befanden sich die <b>.ico<\/b>-Dateien bis zur Verwendung in der Tabelle <b>USysResources <\/b>und wurden erst dann zur Anwendung exportiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_001.png\" alt=\"Formular mit individuellem Icon\" width=\"424,5589\" height=\"239,7875\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular mit individuellem Icon<\/span><\/b><\/p>\n<p>Nunmehr haben wir den noch fehlenden Schritt realisiert: Wir k&ouml;nnen nun die Icon-Dateien direkt aus dem Anlagefeld der Ressourcen-Tabelle auslesen und dem jeweiligen Formular zuweisen. Wie das gelingt, lesen Sie in diesem Beitrag.<\/p>\n<h2>Code zum Anzeigen eines Formularicons<\/h2>\n<p>Der Code sieht im Wesentlichen wie in Listing 1 aus. Im oberen Teil finden wir einige Konstanten-Deklarationen, die wir im weiteren Verlauf ben&ouml;tigen.<\/p>\n<pre><span style=\"color:blue;\">Option Compare Database<\/span>\r\n<span style=\"color:blue;\">Option Explicit<\/span>\r\n<span style=\"color:blue;\">Public <\/span>Const C_IMAGE_ICON = 1\r\n<span style=\"color:blue;\">Public <\/span>Const C_LR_LOADFROMFILE = &H10\r\n<span style=\"color:blue;\">Public <\/span>Const C_WM_SETICON = &H80\r\n<span style=\"color:blue;\">Public <\/span>Const ICRESVER<span style=\"color:blue;\"> As Long<\/span> = &H30000\r\n<span style=\"color:blue;\">Public <\/span>Const LR_DEFAULTSIZE<span style=\"color:blue;\"> As Long<\/span> = &H40\r\n<span style=\"color:blue;\">Public <\/span>Const WM_SETICON<span style=\"color:blue;\"> As Long<\/span> = &H80\r\n<span style=\"color:blue;\">Public <\/span>Const ICON_SMALL<span style=\"color:blue;\"> As Long<\/span> = 0\r\n<span style=\"color:blue;\">Public <\/span>Declare PtrSafe Function SendMessage Lib \"user32\" Alias \"SendMessageA\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>Ptr, _\r\n     ByVal wMsg<span style=\"color:blue;\"> As Long<\/span>, ByVal wParam<span style=\"color:blue;\"> As Long<\/span>Ptr, lParam<span style=\"color:blue;\"> As <\/span>Any)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n<span style=\"color:blue;\">Public <\/span>Declare PtrSafe Function CreateIconFromResourceEx Lib \"user32.dll\" (presbits<span style=\"color:blue;\"> As <\/span>Any, dwResSize<span style=\"color:blue;\"> As <\/span>Any, _\r\n     ByVal fIcon<span style=\"color:blue;\"> As Long<\/span>, ByVal dwVer<span style=\"color:blue;\"> As Long<\/span>, ByVal cxDesired<span style=\"color:blue;\"> As Long<\/span>, ByVal cyDesired<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal flags<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n<span style=\"color:blue;\">Public Function <\/span>SetFormIconFromMSysResources(ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>, ByVal strIconName<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hIcon<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>bData()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>dwOffset<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>dwSize<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngIndex = 0\r\n     lngID = Nz(DLookup(\"id\", \"MSysResources\", \"name=''\" & strIconName & \"''\"), 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         bData() = BLOB2Binary0710(\"MSysResources\", \"Data\", \"Id\", lngID, <span style=\"color:blue;\">True<\/span>)\r\n         dwSize = VarPtr(bData(16& * lngIndex + 14&)) \r\n         dwOffset = VarPtr(bData(bData(16& * lngIndex + 18&))) \r\n         hIcon = CreateIconFromResourceEx(ByVal dwOffset, ByVal dwSize, 1, ICRESVER, 0&, 0&, LR_DEFAULTSIZE)\r\n         <span style=\"color:blue;\">If <\/span>hIcon<span style=\"color:blue;\"> Then<\/span>\r\n             SendMessage hWnd, WM_SETICON, ICON_SMALL, ByVal hIcon\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Icon ''\" & strIconName & \"'' fehlt in der Tabelle MSysResources\", vbExclamation + vbOKOnly, \"Icon fehlt\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Code zum Bereitstellen von Icons in Formularen und Berichten<\/span><\/b><\/p>\n<p>Darunter sehen wir die Deklaration von zwei API-Funktionen, die uns in der folgenden Prozedur unterst&uuml;tzen.<\/p>\n<p>Schlie&szlig;lich folgt die Funktion <b>SetFormIconFromMSysResources<\/b>, welche die eigentliche Arbeit &uuml;bernimmt. Die Funktion hat zwei Parameter:<\/p>\n<ul>\n<li><b>hWnd<\/b>: Das Handle des Fensters, f&uuml;r das das Icon gesetzt werden soll. Das ist normalerweise das Handle des Access-Formulars oder -Berichts.<\/li>\n<li><b>strIconName<\/b>: Der Name des Icons, dessen ID in der <b>MSysResources<\/b>-Tabelle gesucht wird.<\/li>\n<\/ul>\n<p>Die Funktion verwendet die folgenden Variablen:<\/p>\n<ul>\n<li><b>hIcon<\/b>: Speichert das Handle des eingelesenen Icons.<\/li>\n<li><b>bData<\/b>: Ein Byte-Array, das die Bin&auml;rdaten des Icons aus der <b>MSysResources<\/b>-Tabelle aufnimmt.<\/li>\n<li><b>dwOffset<\/b>: Speichert das Offset des Icons.<\/li>\n<li><b>dwSize<\/b>: Speichert die Gr&ouml;&szlig;e des Icon-Ressourcenblocks.<\/li>\n<li><b>lngIndex<\/b>: Index des Icons in der <b>.ico<\/b>-Datei. Eine <b>.ico<\/b>-Datei kann mehrere Icons enthalten.<\/li>\n<li><b>lngID<\/b>: Prim&auml;rschl&uuml;sselwert des Eintrags der Tabelle <b>MSysResources <\/b>mit dem gesuchten Icon.<\/li>\n<\/ul>\n<p>Die Funktion setzt den Index f&uuml;r das aus der <b>.ico<\/b>-Datei zu verwendende Icon mit <b>lngIndex <\/b>auf <b>0<\/b>. Der Parameter <b>strIconName <\/b>der Funktion liefert den Wert des Feldes <b>Name <\/b>der Tabelle <b>MSysResources<\/b>, dessen Anlage aus dem Feld <b>Data <\/b>als Icon verwendet werden soll.<\/p>\n<p>Die Funktion holt per <b>DLookup <\/b>den Wert des Feldes <b>id <\/b>f&uuml;r diesen Datensatz und speichert diesen in der Variablen <b>lngID<\/b>.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob der gesuchte Datensatz gefunden werden konnte, anderenfalls erscheint eine entsprechende Meldung.<\/p>\n<p>Anschlie&szlig;end folgt die Extraktion der Icon-Daten aus dem Feld <b>Data<\/b>. Das erledigen wir mit einem Aufruf der Funktion <b>BLOB2Binary0710<\/b> aus dem Modul <b>mdlImages<\/b>, der wir den Namen der Tabelle, das Anlagefeld, das Feld mit dem Prim&auml;rschl&uuml;ssel und den Prim&auml;rschl&uuml;sselwert &uuml;bergeben. Die Icon-Daten landen danach in einem <b>Byte<\/b>-Array namens <b>bData<\/b>. F&uuml;r dieses Array ermitteln wir nun die Gr&ouml;&szlig;e und das Offset im Speicher und speichern beides in den Variablen <b>dwSize <\/b>und <b>dwOffset<\/b>.<\/p>\n<p>Schlie&szlig;lich folgt der Einsatz der API-Funktionen. Die erste hei&szlig;t <b>CreateIconFromResourceEx <\/b>und liefert uns ein Handle auf das Icon. Dieses Handle setzen wir schlie&szlig;lich mit der Funktion <b>SendMessage <\/b>als Icon des Formulars oder Berichts mit dem Handle aus <b>hWnd <\/b>ein.<\/p>\n<h2>Einsatz der Funktion<\/h2>\n<p>Den Aufruf der Funktion <b>SetFormIconFromMSysResources <\/b>f&uuml;gen wir nun in die Ereignisprozedur <b>Form_Load <\/b>des Formulars oder Berichts ein, der ein Icon aus der Tabelle <b>MSysResources <\/b>anzeigen soll. Das sieht beispielsweise wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Call<\/span> SetFormIconFromMSysResources(Me.hWnd, \"alarmclock\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dazu muss nun nur noch die Tabelle <b>MSysResources <\/b>einen Datensatz enthalten, der f&uuml;r das Feld <b>Name <\/b>den Wert <b>alarmclock <\/b>aufweist und dessen Feld <b>data <\/b>eine entsprechende <b>.ico<\/b>-Datei enth&auml;lt. Das ist in unserer Datenbank der Fall (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_002.png\" alt=\"Das anzuzeigende Icon in der Tabelle MSysResources\" width=\"574,559\" height=\"169,8862\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das anzuzeigende Icon in der Tabelle MSysResources<\/span><\/b><\/p>\n<h2>Voraussetzungen f&uuml;r die .ico-Dateien<\/h2>\n<p>Nun sind allerdings leider nicht alle <b>.ico<\/b>-Dateien f&uuml;r die Anzeige als Icon eines Formulars oder Berichts geeignet. Wir ben&ouml;tigen eine bestimmte Aufl&ouml;sung, sonst wird das Icon nicht korrekt angezeigt. Dazu geh&ouml;ren beispielsweise Aufl&ouml;sungen mit 8- oder 24-Bit. 4-Bit reichen nicht aus.<\/p>\n<h2>Hinzuf&uuml;gen der .ico-Dateien<\/h2>\n<p>Leider k&ouml;nnen wir die <b>.ico<\/b>-Dateien nicht auf die gleiche einfache Weise wie <b>.png<\/b>-Dateien zur Tabelle <b>MSysResources <\/b>hinzuf&uuml;gen. Dazu brauchten wir einfach nur ein Formular in der Entwurfsansicht zu &ouml;ffnen und dann ein Bild zum Formular oder zu einer Schaltfl&auml;che hinzuzuf&uuml;gen.<\/p>\n<p>Die dabei ausgew&auml;hlten Dateien werden automatisch als <b>.png<\/b>-Dateien in der Tabelle <b>MSysResources <\/b>hinterlegt und k&ouml;nnen dann in den entsprechenden Eigenschaften der Steuerelemente ausgew&auml;hlt werden. Wenn wir hier <b>.ico<\/b>-Dateien ausw&auml;hlen, werden diese als <b>.png<\/b>-Dateien importiert. <b>.png<\/b>-Dateien k&ouml;nnen wir leider nicht als Icon von Formularen und Berichten einsetzen.<\/p>\n<h2>.ico-Dateien manuell hinzuf&uuml;gen<\/h2>\n<p>Also haben wir zwei M&ouml;glichkeiten. Die erste ist, die <b>.ico<\/b>-Dateien manuell zur Tabelle <b>MSysResources <\/b>hinzuzuf&uuml;gen. Das gelingt mit den folgenden Schritten:<\/p>\n<ul>\n<li>Wir &ouml;ffnen die Tabelle <b>MSysResources <\/b>in der Datenblattansicht.<\/li>\n<li>Wir klicken f&uuml;r einen neuen, leeren Datensatz doppelt auf das Anlage-Feld.<\/li>\n<li>Im Dialog <b>Anlegen <\/b>klicken wir auf <b>Hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen die gew&uuml;nschten <b>.ico<\/b>-Datei aus, zum Beispiel <b>apple.ico<\/b>.<\/li>\n<li>Danach tragen wir f&uuml;r das Feld <b>Extension <\/b>den Wert <b>ico<\/b>, f&uuml;r <b>Name <\/b>den Wert <b>apple <\/b>und f&uuml;r <b>Type <\/b>den Text <b>img <\/b>ein.<\/li>\n<\/ul>\n<p>Danach k&ouml;nnen wir die Funktion <b>SetFormIconFromMSysResources <\/b>f&uuml;r dieses Icon aufrufen:<\/p>\n<pre><span style=\"color:blue;\">Call<\/span> SetFormIconFromMSysResources(Me.hWnd, \"apple\")<\/pre>\n<p>Diese Vorgehensweise ist allerdings nicht besonders komfortabel, wenn wir mehrere <b>.ico<\/b>-Dateien zur Tabelle <b>MSysResources <\/b>hinzuf&uuml;gen wollen. Also schreiben wir uns schnell Code, um den Vorgang zu automatisieren.<\/p>\n<h2>Mehrere .ico-Dateien gleichzeitig in die Tabelle MSysResources einlesen<\/h2>\n<p>Was ben&ouml;tigen wir dazu als Erstes? Einen Dateiauswahl-Dialog, mit dem wir mehrere Dateien aus einem Verzeichnis ausw&auml;hlen k&ouml;nnen. Die notwendigen Elemente finden wir in der Office-Bibliothek, die wir wie in Bild 3 per Verweis referenzieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_003.png\" alt=\"Verweis auf die Office-Bibliothek\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verweis auf die Office-Bibliothek<\/span><\/b><\/p>\n<h2>.ico-Dateien ausw&auml;hlen<\/h2>\n<p>Danach k&ouml;nnen wir uns eine Funktion namens <b>SelectICOFiles<\/b> wie in Listing 2 zusammenstellen. Diese nimmt mit dem Parameter <b>strFolder <\/b>ein Verzeichnis entgegen, das als Startverzeichnis des Dateiauswahl-Dialogs verwendet wird. Zuerst werden das Objekt <b>objFiledialog <\/b>und zwei Variablen f&uuml;r die Verarbeitung der Pfade zu den <b>.ico<\/b>-Dateien deklariert. Mit der Variablen <b>objFiledialog <\/b>referenzieren wir den Dateiauswahl-Dialog, den wir mit der Methode <b>Filedialog <\/b>des <b>Application<\/b>-Objekts initialisieren. Dabei &uuml;bergeben wir den Wert <b>msoFileDialogFilePicker <\/b>als Parameter.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SelectICOFiles(<span style=\"color:blue;\">Optional<\/span> strFolder<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>objFiledialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n      <span style=\"color:blue;\">Dim <\/span>varFilename<span style=\"color:blue;\"> As Variant<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>strFilenames<span style=\"color:blue;\"> As String<\/span>\r\n      <span style=\"color:blue;\">Set<\/span> objFiledialog = Application.FileDialog(msoFileDialogFilePicker)\r\n      objFiledialog.AllowMultiSelect = <span style=\"color:blue;\">True<\/span>\r\n      objFiledialog.InitialFileName = strFolder\r\n      objFiledialog.Filters.Clear\r\n      objFiledialog.Filters.Add \"Icon-Files\", \"*.ico\"\r\n      <span style=\"color:blue;\">If <\/span>objFiledialog.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n          For Each varFilename In objFiledialog.SelectedItems\r\n              strFilenames = strFilenames & \";\" & varFilename\r\n          <span style=\"color:blue;\">Next<\/span> varFilename\r\n          <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFilenames) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilenames = <span style=\"color:blue;\">Mid<\/span>(strFilenames, 2)\r\n          <span style=\"color:blue;\">End If<\/span>\r\n      <span style=\"color:blue;\">End If<\/span>\r\n      SelectICOFiles = strFilenames\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Ausw&auml;hlen der .ico-Dateien<\/span><\/b><\/p>\n<p>F&uuml;r den Dialog legen wir mit <b>AllowMultiSelect <\/b>fest, das mehrere Dateien gleichzeitig ausgew&auml;hlt werden k&ouml;nnen. Au&szlig;erdem stellen wir den Startordner mit <b>InitialFileName <\/b>ein. Wir leeren die Filter mit der <b>Clear<\/b>-Methode der <b>Filters<\/b>-Auflistung und f&uuml;gen einen neuen Filter f&uuml;r <b>.ico<\/b>-Dateien hinzu. Dann zeigen wir den Dialog mit der <b>Show<\/b>-Methode an. Liefert diese den Wert <b>True <\/b>zur&uuml;ck, hat der Benutzer den Dialog geschlossen und wir werten die gew&auml;hlten Eintr&auml;ge in einer <b>For Each<\/b>-Schleife &uuml;ber die Elemente der Auflistung <b>SelectedItems<\/b> aus.<\/p>\n<p>Dabei stellen wir in <b>strFilenames <\/b>eine durch Semikola getrennte Liste von Elementen zusammen und geben diese als Funktionsergebnis zur&uuml;ck.<\/p>\n<p>Damit k&ouml;nnen wir nun <b>.ico<\/b>-Dateien wie in Bild 4 ausw&auml;hlen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_004.png\" alt=\"Auswahldialog f&uuml;r .ico-Dateien\" width=\"649,559\" height=\"402,2719\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Auswahldialog f&uuml;r .ico-Dateien<\/span><\/b><\/p>\n<h2>.ico-Dateien einlesen<\/h2>\n<p>Danach verwenden wir eine Prozedur namens <b>ICOToMSysResources<\/b>, um die mit dem Dateiauswahl-Dialog selektierten Dateien in die Tabelle <b>MSysResources <\/b>einzulesen (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ICOToMSysResources(<span style=\"color:blue;\">Optional<\/span> bolOverwrite<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstData<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strFileList<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFiles()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFile<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strFileList = SelectICOFiles(CurrentProject.Path)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFileList) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFiles = <span style=\"color:blue;\">Split<\/span>(strFileList, \";\")\r\n         <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM MSysResources\", dbOpenDynaset)\r\n         For i = <span style=\"color:blue;\">LBound<\/span>(strFiles) To <span style=\"color:blue;\">UBound<\/span>(strFiles)\r\n             strFile = strFiles(i)\r\n             strName = <span style=\"color:blue;\">Mid<\/span>(strFile, <span style=\"color:blue;\">InStrRev<\/span>(strFile, \"\\\") + 1)\r\n             strName = <span style=\"color:blue;\">Replace<\/span>(strName, \".ico\", \"\")\r\n             rst.FindFirst \"Name = ''\" & strName & \"''\"\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (rst.NoMatch = <span style=\"color:blue;\">False<\/span> And bolOverwrite = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>rst.NoMatch = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                     rst.Add<span style=\"color:blue;\">New<\/span>\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     rst.Edit\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 rst!Name = strName\r\n                 rst!Extension = \"ico\"\r\n                 rst!Type = \"img\"\r\n                 <span style=\"color:blue;\">Set<\/span> rstData = rst(\"Data\").Value\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 rstData.Delete\r\n                 On Error Goto 0\r\n                 rstData.Add<span style=\"color:blue;\">New<\/span>\r\n                 rstData(\"FileData\").LoadFromFile strFile\r\n                 rstData.Update\r\n                 rst.Update\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Einlesen von .ico-Dateien in die Tabelle MSysResources<\/span><\/b><\/p>\n<p>Die Prozedur hat einen Parameter namens <b>bolOverwrite<\/b>. Mit diesem legen wir fest, ob vorhandene Elemente, die den gleichen Namen im Feld Name aufweisen, &uuml;berschrieben werden sollen.<\/p>\n<p>Neben der Variablen <b>db <\/b>zum Referenzieren des aktuellen <b>Database<\/b>-Objekts verwenden wir zwei <b>Recordset<\/b>-Variablen. Die Erste namens <b>rst <\/b>referenziert ganz normal die Tabelle <b>MSysResources<\/b>.<\/p>\n<p>Die zweite hei&szlig;t <b>rstData <\/b>und zollt der Tatsache Tribut, dass Anlagefelder intern eine eigene Tabelle zum Speichern der Anlagen aufweisen und wir diese interne Tabelle als Recordset referenzieren wollen.<\/p>\n<p>Die Prozedur ermittelt zun&auml;chst mit der Funktion <b>SelectICOFiles <\/b>die zu importierenden <b>.ico<\/b>-Dateien und speichert die Liste in der Variablen <b>strFileList<\/b>. Hat diese eine L&auml;nge gr&ouml;&szlig;er <b>0<\/b>, spalten wir die einzelnen, durch Semikola getrennten Eintr&auml;ge, mit der <b>Split<\/b>-Funktion in ein Array auf, das wir mit der Variablen <b>strFiles <\/b>referenzieren.<\/p>\n<p>Dann erstellen wir das erste Recordset mit Bezug auf die Tabelle <b>MSysResources<\/b> und durchlaufen in einer <b>For&#8230;Next<\/b>-Schleife alle Elemente des Arrays <b>strFiles<\/b>. Innerhalb der Schleife schreiben wir die aktuell einzulesende <b>.ico<\/b>-Datei in die Variable <b>strFile<\/b>.<\/p>\n<p>Daraus ermitteln wir den reinen Dateinamen, indem wir den Teil hinter dem letzten Backslash ermitteln und in die Variable <b>strName <\/b>schreiben.<\/p>\n<p>Wir nehmen auch noch die Dateiendung samt Punkt weg (<b>.ico<\/b>) und erhalten so einen Ausdruck, den wir in das Feld <b>Name <\/b>eintragen k&ouml;nnen.<\/p>\n<p>Danach versuchen wir, mit <b>rst.FindFirst <\/b>einen Datensatz zu finden, der den Wert von <b>strName <\/b>im Feld <b>Name <\/b>enth&auml;lt. Haben wir keinen solchen gefunden oder soll dieser ohnehin &uuml;berschrieben werden (wenn der Parameter <b>bolOverwrite <\/b>den Wert <b>True <\/b>aufweist), pr&uuml;fen wir nochmals, ob bereits ein entsprechender Datensatz vorhanden ist.<\/p>\n<p>Falls nicht, legen wir mit der <b>AddNew<\/b>-Methode einen neuen Datensatz an, sonst versetzen wir den mit <b>FindFirst <\/b>gefundenen mit der <b>Edit<\/b>-Methode in den Bearbeiten-Zustand. Wir tragen die Werte f&uuml;r die Felder <b>Name<\/b>, <b>Extension <\/b>und <b>Type <\/b>ein.<\/p>\n<p>Dann referenzieren wir die im Feld <b>Data <\/b>enthaltene Tabelle &uuml;ber die <b>Value<\/b>-Eigenschaft mit dem <b>Recordset<\/b>-Objekt <b>rstData<\/b>.<\/p>\n<p>Wir l&ouml;schen den eventuell bereits vorhandenen Eintrag und f&uuml;gen einen neuen hinzu.<\/p>\n<p>F&uuml;r diesen lesen wir mit der Methode <b>LoadFromFile <\/b>die Datei aus <b>strFile <\/b>in das Feld <b>FileData <\/b>ein und aktualisieren dann die beiden Recordsets. Die gleichen Schritte f&uuml;hren wir f&uuml;r alle hinzuzuf&uuml;genden Dateien durch.<\/p>\n<h2>Verwalten und Testen der Icons<\/h2>\n<p>Damit wir die Icons, die der Anwendung f&uuml;r den Einsatz in Formularen zur Verf&uuml;gung stehen, ansehen und testen k&ouml;nnen und au&szlig;erdem eine Schaltfl&auml;che zum Hinzuf&uuml;gen von Icons unterbringen k&ouml;nnen, erstellen wir ein Formular.<\/p>\n<p>Dieses soll wie in Bild 5 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_005.png\" alt=\"Formular zum Verwalten und Testen der Icons\" width=\"649,559\" height=\"550,3465\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Formular zum Verwalten und Testen der Icons<\/span><\/b><\/p>\n<p>Mit der Schaltfl&auml;che <b>.ico<\/b>-Dateien hinzuf&uuml;gen rufen wir die Prozedur <b>ICOToMSysResources <\/b>auf und aktualisieren danach die Anzeige der <b>ico<\/b>-Dateien der Tabelle <b>MSysResources<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAddIcons_Click()\r\n     ICOToMSysResources <span style=\"color:blue;\">True<\/span>\r\n     Me!sfmIcons.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Unterformular enth&auml;lt die Abfrage aus Bild 6 als Datensatzquelle und zeigt alle Felder in der Datenblattansicht an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_006.png\" alt=\"Datensatzquelle des Unterformulars\" width=\"549,559\" height=\"349,0181\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datensatzquelle des Unterformulars<\/span><\/b><\/p>\n<p>Dabei filtert sie nach der Dateinamenerweiterung und sortiert nach dem Namen des Icons.<\/p>\n<p>Das Formular selbst ist aus Haupt- und Unterformular aufgebaut (siehe Bild 7). F&uuml;r das Unterformular-Steuerelement haben wir die beiden Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>auf den Wert <b>True <\/b>eingestellt, damit dieses vergr&ouml;&szlig;ert wird, wenn der Benutzer die Gr&ouml;&szlig;e des Hauptformulars anpasst.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_007.png\" alt=\"Entwurf des Formulars\" width=\"499,5589\" height=\"342,53\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf des Formulars<\/span><\/b><\/p>\n<p>F&uuml;r das Textfeld <b>txtSearch <\/b>haben wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Bei &Auml;nderung <\/b>hinterlegt. Diese soll bei Eingabe eines jeden Zeichens das Unterformular filtern (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSearch_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>strSearch<span style=\"color:blue;\"> As String<\/span>\r\n     strSearch = Me!txtSearch.Text\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strSearch) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(strSearch, 1) = \" \"<span style=\"color:blue;\"> Then<\/span>\r\n             Me!sfmIcons.Form.Filter = \"Name LIKE ''\" & <span style=\"color:blue;\">Trim<\/span>(strSearch) & \"*''\"\r\n         <span style=\"color:blue;\">Else<\/span>If <span style=\"color:blue;\">Right<\/span>(strSearch, 1) = \" \" Then\r\n             Me!sfmIcons.Form.Filter = \"Name LIKE ''*\" & <span style=\"color:blue;\">Trim<\/span>(strSearch) & \"''\"\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Me!sfmIcons.Form.Filter = \"Name LIKE ''*\" & Me!txtSearch.Text & \"*''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!sfmIcons.Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmIcons.Form.FilterOn = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Filtern der .ico-Dateien<\/span><\/b><\/p>\n<p>Dazu schreiben wir zuerst den aktuell angezeigten Inhalt des Textfeldes, den wir &uuml;ber die Eigenschaft <b>Text <\/b>ermitteln, in die Variable <b>strSearch<\/b>.<\/p>\n<p>Wenn <b>strSearch <\/b>leer ist, deaktivieren wir auch den Filter f&uuml;r das Unterformular.<\/p>\n<p>Anderenfalls pr&uuml;fen wir, ob der angegebene Suchausdruck ein f&uuml;hrendes oder folgendes Leerzeichen aufweist. Dies wollen wir so interpretieren, dass der eingegebene Text am Anfang oder am Ende des Namens der <b>.ico<\/b>-Datei steht. F&uuml;r <b>(Leerzeichen)Car <\/b>wird nach allen Eintr&auml;gen gesucht, die mit <b>Car <\/b>beginnen. F&uuml;r <b>Car(Leerzeichen) <\/b>wird nach allen Eintr&auml;gen gesucht, die auf <b>Car <\/b>enden.<\/p>\n<p>F&uuml;r die Eingabe <b>Car <\/b>ohne f&uuml;hrende oder folgende Leerzeichen sollen alle Eintr&auml;ge geliefert werden, welche die Zeichenkette <b>Car <\/b>an beliebiger Stelle enthalten.<\/p>\n<p>Die Prozedur stellt dann einen Filterausdruck wie <b>Name LIKE &#8220;Car&#8220; <\/b>zusammen und aktiviert den Filter durch Einstellen der Eigenschaft <b>FilterOn <\/b>auf den Wert <b>True<\/b>.<\/p>\n<h2>Direkte Anzeige des gew&auml;hlten Icons<\/h2>\n<p>Damit wir die Icons direkt in Aktion sehen k&ouml;nnen, f&uuml;gen wir f&uuml;r das Ereignis <b>Beim Anzeigen <\/b>des Unterformulars die folgende Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!Name)<span style=\"color:blue;\"> Then<\/span>\r\n         SetFormIconFromMSysResources Me.Parent.hWnd, Me!Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese stellt das Icon f&uuml;r das &uuml;bergeordnete Formular auf das aktuell selektierte Icon ein.<\/p>\n<h2>Integration in eigene Anwendungen<\/h2>\n<p>Wenn Sie nur die reine Funktion zum Anzeigen von <b>.ico<\/b>-Dateien aus der Tabelle <b>MSysResources <\/b>nutzen wollen, reichen die folgenden Schritte aus:<\/p>\n<ul>\n<li>Module <b>mdlFiledialog<\/b>, <b>mdlFormIcons <\/b>und <b>mdlImages <\/b>zum VBA-Projekt hinzuf&uuml;gen<\/li>\n<li><b>.ico<\/b>-Dateien mit der Prozedur <b>ICOToMSysResources <\/b>in die Tabelle <b>MSysResources <\/b>importieren<\/li>\n<li>F&uuml;r Formulare oder Berichte, die ein eigenes Icon anzeigen sollen, die folgende Prozedur f&uuml;r das Ereignis <b>Beim &Ouml;ffnen <\/b>hinterlegen:<\/li>\n<\/ul>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Call<\/span> SetFormIconFromMSysResources(Me.hWnd, \"add\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Verwenden einer anderen Tabelle als MSysResources<\/h2>\n<p>Gegebenenfalls m&ouml;chtest Du die Tabelle <b>MSysResources <\/b>f&uuml;r Bilddateien vorhalten, die in Bildern oder Schaltfl&auml;chen angezeigt werden. Wenn diese Tabelle mit Icons &uuml;berf&uuml;llt ist, werden diese auch alle angezeigt, wenn man im Formularentwurf auf den Ribbon-Eintrag <b>Bild einf&uuml;gen <\/b>klickt.<\/p>\n<p>Dann kannst Du diese Tabelle einfach kopieren, beispielsweise unter dem Namen <b>MSysIcons<\/b>. Wenn Du nun noch m&ouml;chtest, dass diese wie auch die Tabelle <b>MSysIcons <\/b>ausgeblendet wird, kannst Du wie in Bild 8 &uuml;ber die Tabelleneigenschaften das Attribut <b>Ausgeblendet <\/b>aktivieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1476_008.png\" alt=\"Ausblenden einer Tabelle, hier MSysIcons\" width=\"549,559\" height=\"323,7785\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Ausblenden einer Tabelle, hier MSysIcons<\/span><\/b><\/p>\n<p>Du musst dann lediglich in den Prozeduren, in denen bisher die Tabelle <b>MSysResources <\/b>referenziert wird, die Tabelle <b>MSysIcons <\/b>eintragen. Gleiches gilt f&uuml;r das Unterformular <b>sfmIcons<\/b>.<\/p>\n<p>F&uuml;r die Beispieldatenbank haben wir das bereits flexibler angelegt. Hier gibt es eine Konstante namens <b>C_IconTable <\/b>im Modul <b>mdlFormIcons<\/b>, die wir auf die gew&uuml;nschte Tabelle einstellen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const C_IconTable<span style=\"color:blue;\"> As String<\/span> = \"MSysIcons\"<\/pre>\n<p>Die entsprechenden Codestellen sind bereits angepasst und auch die Datensatzquelle des Unterformulars wird entsprechend zusammengestellt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel hat gezeigt, wie wir Formularen und Berichten ein individuelles Icon zuweisen k&ouml;nnen. Im Gegensatz zu fr&uuml;heren L&ouml;sungen ist dazu nun noch nicht einmal mehr das Vorhandensein der <b>.ico<\/b>-Datei im Dateisystem erforderlich. Die Datei wird direkt aus der f&uuml;r die Icons vorgesehene Tabelle eingelesen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>IndividuelleFormularIcons.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/95FC8A55-135C-46E8-939C-2A24BA349AD0\/aiu_1476.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Icons in Access-Formularen und Berichten&#8220; (www.access-im-unternehmen.de\/1235) haben wir schon einmal eine M&ouml;glichkeit aufgezeigt, wir man Formulare und Berichte in Access mit individuellen Icons ausstatten kann. So kann man beispielsweise ein Formular zum Bearbeiten eines Kunden mit dem gleichen Icon ausstatten, das man auch f&uuml;r die Schaltfl&auml;che zum &Ouml;ffnen dieses Formulars im Ribbon untergebracht hat. Der Benutzer kann so noch besser erkennen, worum es im Formular geht. In der vorherigen Fassung der L&ouml;sung hatten wir allerdings noch das Problem, dass wir die Icons, die links oben in Formularen und Berichten erscheinen sollten, noch im Dateisystem speichern mussten. Das kann aus diversen Gr&uuml;nden zu Problem f&uuml;hren und daher sind wir froh, hier den n&auml;chsten Schritt gehen zu k&ouml;nnen: Das direkt Einlesen der Icons aus der Tabelle &#8222;MSysResources&#8220; und anschlie&szlig;endes Anzeigen in Formulare und Berichten.<\/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":[66022024,662024,44000023],"tags":[],"class_list":["post-55001476","post","type-post","status-publish","format-standard","hentry","category-66022024","category-662024","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Individuelle Formular-Icons ohne Zusatzdateien - 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\/Individuelle_FormularIcons_ohne_Zusatzdateien\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Individuelle Formular-Icons ohne Zusatzdateien\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Icons in Access-Formularen und Berichten&quot; (www.access-im-unternehmen.de\/1235) haben wir schon einmal eine M&ouml;glichkeit aufgezeigt, wir man Formulare und Berichte in Access mit individuellen Icons ausstatten kann. So kann man beispielsweise ein Formular zum Bearbeiten eines Kunden mit dem gleichen Icon ausstatten, das man auch f&uuml;r die Schaltfl&auml;che zum &Ouml;ffnen dieses Formulars im Ribbon untergebracht hat. Der Benutzer kann so noch besser erkennen, worum es im Formular geht. In der vorherigen Fassung der L&ouml;sung hatten wir allerdings noch das Problem, dass wir die Icons, die links oben in Formularen und Berichten erscheinen sollten, noch im Dateisystem speichern mussten. Das kann aus diversen Gr&uuml;nden zu Problem f&uuml;hren und daher sind wir froh, hier den n&auml;chsten Schritt gehen zu k&ouml;nnen: Das direkt Einlesen der Icons aus der Tabelle &quot;MSysResources&quot; und anschlie&szlig;endes Anzeigen in Formulare und Berichten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-29T18:38:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Individuelle Formular-Icons ohne Zusatzdateien\",\"datePublished\":\"2024-02-29T18:38:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/\"},\"wordCount\":2530,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/356a21755bd643da84e46fea02811d52\",\"articleSection\":[\"2\\\/2024\",\"2024\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/\",\"name\":\"Individuelle Formular-Icons ohne Zusatzdateien - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/356a21755bd643da84e46fea02811d52\",\"datePublished\":\"2024-02-29T18:38:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/356a21755bd643da84e46fea02811d52\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/356a21755bd643da84e46fea02811d52\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Individuelle_FormularIcons_ohne_Zusatzdateien\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Individuelle Formular-Icons ohne Zusatzdateien\"}]},{\"@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":"Individuelle Formular-Icons ohne Zusatzdateien - 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\/Individuelle_FormularIcons_ohne_Zusatzdateien\/","og_locale":"de_DE","og_type":"article","og_title":"Individuelle Formular-Icons ohne Zusatzdateien","og_description":"Im Beitrag \"Icons in Access-Formularen und Berichten\" (www.access-im-unternehmen.de\/1235) haben wir schon einmal eine M&ouml;glichkeit aufgezeigt, wir man Formulare und Berichte in Access mit individuellen Icons ausstatten kann. So kann man beispielsweise ein Formular zum Bearbeiten eines Kunden mit dem gleichen Icon ausstatten, das man auch f&uuml;r die Schaltfl&auml;che zum &Ouml;ffnen dieses Formulars im Ribbon untergebracht hat. Der Benutzer kann so noch besser erkennen, worum es im Formular geht. In der vorherigen Fassung der L&ouml;sung hatten wir allerdings noch das Problem, dass wir die Icons, die links oben in Formularen und Berichten erscheinen sollten, noch im Dateisystem speichern mussten. Das kann aus diversen Gr&uuml;nden zu Problem f&uuml;hren und daher sind wir froh, hier den n&auml;chsten Schritt gehen zu k&ouml;nnen: Das direkt Einlesen der Icons aus der Tabelle \"MSysResources\" und anschlie&szlig;endes Anzeigen in Formulare und Berichten.","og_url":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-29T18:38:14+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Individuelle Formular-Icons ohne Zusatzdateien","datePublished":"2024-02-29T18:38:14+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/"},"wordCount":2530,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52","articleSection":["2\/2024","2024","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/","url":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/","name":"Individuelle Formular-Icons ohne Zusatzdateien - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52","datePublished":"2024-02-29T18:38:14+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/356a21755bd643da84e46fea02811d52"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Individuelle_FormularIcons_ohne_Zusatzdateien\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Individuelle Formular-Icons ohne Zusatzdateien"}]},{"@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\/55001476","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=55001476"}],"version-history":[{"count":1,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001476\/revisions"}],"predecessor-version":[{"id":88075185,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001476\/revisions\/88075185"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}