{"id":55001013,"date":"2015-12-01T00:00:00","date_gmt":"2020-05-22T19:09:01","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1013"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Inhalte_von_Anlagenfeldern_verwalten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/","title":{"rendered":"Inhalte von Anlagenfeldern verwalten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Anlagefelder sind eine prima M&ouml;glichkeit, um Dateien in Access-Tabellen zu speichern. Im Gegen-satz zu OLE-Feldern stehen dazu sogar geeignete Elemente in der Benutzeroberfl&auml;che zur Ver-f&uuml;gung. Diese sind allerdings nicht besonders ausgereift &#8211; so kann man nicht direkt im For-mu-lar die in einem Anlagefeld gespeicherten Elemente anzeigen oder neue hinzuf&uuml;gen. Dieser Beitrag zeigt, wie Sie ein Formular um diese M&ouml;glichkeit erweitern. Dabei f&uuml;gen wir auch gleich die im Beitrag Drag and Drop im Anlagefeld vorgestellte Technik hinzu.<\/b><\/p>\n<h2>Beispieltabelle<\/h2>\n<p>Als Beispiel nutzen wir eine Tabelle namens <b>tblProjekte<\/b>, die neben dem Prim&auml;rschl&uuml;sselfeld und der Projektbezeichnung nur ein Anlagefeld namens <b>Dateien <\/b>zum Speichern projektrelevanter Dateien enth&auml;lt. Dies ist nat&uuml;rlich stark vereinfacht, aber es soll ja auch nur ein Beispiel sein. Bild 1 zeigt die Entwurfsansicht der Tabelle <b>tblProjekte<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_001.png\" alt=\"Tabelle mit Anlagefeld\" width=\"650\" height=\"391,7541\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Tabelle mit Anlagefeld<\/span><\/b><\/p>\n<h2>Formular zum Verwalten der Anlagen<\/h2>\n<p>Das Formular zum Verwalten der Anlagen im Anlagefeld <b>Dateien<\/b> der Tabelle <b>tblProjekte <\/b>verwendet nat&uuml;rlich die Tabelle <b>tblProjekte <\/b>als <b>Datenherkunft<\/b> (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_002.png\" alt=\"Formular zum Verwalten von Anlagefeld-Inhalten\" width=\"650\" height=\"237,6245\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular zum Verwalten von Anlagefeld-Inhalten<\/span><\/b><\/p>\n<p>Dabei soll sie den Inhalten der beiden Felder <b>Projekt-ID <\/b>und <b>Projektbezeichung <\/b>in entsprechenden Textfeldern anzeigen. Die im Anlagefeld gespeicherten Anlagen sollen in einem <b>ListView<\/b>-Steuerelement erscheinen. Drei Schaltfl&auml;chen stellen die Funktionen zum L&ouml;schen, &ouml;ffnen und Speichern der aktuell markierten Anlage im <b>ListView<\/b>-Steuerelement bereit. Als Gimmick soll ein Anlage-Steuerelement im rechten Bereich auch noch die aktuell im Listenfeld markierte Anlage anzeigen. Im Falle einiger Dateien erscheint dann die Vorschau, wie in der Abbildung etwa f&uuml;r eine Bilddatei. Dateien k&ouml;nnen per Drag and Drop zum <b>ListView<\/b>-Steuerelement hinzugef&uuml;gt werden. Eine neu hinzugef&uuml;gte Datei wird gleich markiert und im Anlage-Steuerelement angezeigt.<\/p>\n<p>Zu den Eintr&auml;gen des <b>ListView<\/b>-Steuerelements haben wir noch jeweils drei Kontextmen&uuml;-Befehle hinzugef&uuml;gt, und zwar <b>L&ouml;schen<\/b>, <b>&ouml;ffnen <\/b>und <b>Speichern unter <\/b>(s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_004.png\" alt=\"Kontextmen&uuml; mit den Anlagen-spezifischen Befehlen\" width=\"425\" height=\"239,7191\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Kontextmen&uuml; mit den Anlagen-spezifischen Befehlen<\/span><\/b><\/p>\n<h2>Erstellen des Formulars<\/h2>\n<p>Das Formular sieht im Entwurf wie in Bild 4 aus. Hier k&ouml;nnen Sie erkennen, dass sich das Anlage-Steuerelement nicht direkt im Hauptformular befindet, sondern in ein Unterformular eingebettet ist. Dies haben wir so gemacht, weil wir ja das Anlagen-Feld der Datenherkunft nicht so an ein Anlagen-Steuerelement binden k&ouml;nnen, dass jeweils der Inhalt einer speziellen Anlage angezeigt wird. Wie dies technisch gel&ouml;st ist, schauen wir uns jedoch weiter unten an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_003.png\" alt=\"Das Formular frmAnlagefeldVerwalten in der Entwurfsansicht\" width=\"650\" height=\"278,1893\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Formular frmAnlagefeldVerwalten in der Entwurfsansicht<\/span><\/b><\/p>\n<h2>Laden des Formulars<\/h2>\n<p>Beim Laden des Formulars sind zun&auml;chst einige Schritte zur Konfiguration des <b>ListView<\/b>-Steuerelements n&ouml;tig. Dies erledigen wir in der Ereignisprozedur <b>Beim Laden <\/b>(s. Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>objColumnheader<span style=\"color:blue;\"> As <\/span>MSComctlLib.ColumnHeader\r\n     <span style=\"color:blue;\">With<\/span> Me!ctlListview\r\n         .ColumnHeaders.Clear\r\n         <span style=\"color:blue;\">Set<\/span> objColumnheader = .ColumnHeaders.Add(, , \"Dateien hierher ziehen:\")\r\n         objColumnheader.Width = Me!ctlListview.Width - 350\r\n         .View = lvwReport\r\n         .Font.Name = \"Calibri\"\r\n         .Font.Size = 11\r\n         .Appearance = ccFlat\r\n         .OLEDropMode = ccOLEDropManual\r\n         .ListItems.Clear\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Vorbereitungen, die beim Laden des Formulars durchgef&uuml;hrt werden<\/span><\/b><\/p>\n<p>Die Prozedur leert eventuell vorhandene Spaltenk&ouml;pfe im <b>ListView<\/b>-Steuerelement und f&uuml;gt dann einen neuen Spaltenkopf mit dem Text <b>Dateien hierher ziehen <\/b>hinzu. Die Breite dieses Elements stellt sie auf die Breite des Steuerelements minus 350 ein. Dies sorgt daf&uuml;r, dass die einzige Spalte auch beim Einblenden der vertikalen Bildlaufleiste noch vollst&auml;ndig sichtbar ist und keine horizontale Bildlaufleiste eingeblendet werden muss. Dann stellt sie die Ansicht auf <b>lvwReport <\/b>ein und legt die Schriftart und Schriftgr&ouml;&szlig;e so fest, dass diese zur Schrift der &uuml;brigen Steuerelemente passt. Der Wert <b>ccFlat <\/b>f&uuml;r die Eigenschaft <b>Appearance <\/b>sorgt daf&uuml;r, dass das Steuerelement nicht vertieft angezeigt wird. <b>OLEDropMode = ccOLEDropManual <\/b>sorgt daf&uuml;r, dass einige Ereignisse beim Drag and Drop auf das <b>ListView<\/b>-Steuerelement ausgel&ouml;st und implementiert werden k&ouml;nnen. Schlie&szlig;lich leert die Prozedur das <b>ListView<\/b>-Steuerelement, falls noch Eintr&auml;ge von vorherigen Anwendungen vorhanden sind.<\/p>\n<h2>Unterformular zur Ansicht der aktuell markierten Anlage<\/h2>\n<p>Das Unterformular <b>sfmAnlagefeld <\/b>enth&auml;lt als einziges Steuerelement das Anlage-Steuerelement <b>ctlAttachment<\/b>. Das Formular selbst ist &uuml;ber die Eigenschaft <b>Datenherkunft <\/b>an eine Abfrage gebunden, welche die beiden Felder <b>Dateien.FileData <\/b>und <b>Dateien.FileName <\/b>liefert (s. Bild 5). Die &#8222;doppelten&#8220; Feldnamen mit dem trennenden Punkt erkl&auml;ren sich durch die Besonderheit des Anlagefeldes: Dieses hat in der Tabelle <b>tblProjekte <\/b>den Namen <b>Dateien<\/b>. Ein Anlagefeld enth&auml;lt aber intern immer eine Tabelle, da es ja auch mehrere Anlagen samt Metadaten aufnehmen kann. Und zwei der Felder dieser Tabelle hei&szlig;en <b>FileData <\/b>und <b>FileName<\/b>. Um direkt auf diese Felder zuzugreifen, verwendet man dann die Syntax <b><Anlagefeldname>.<Feld der Anlagetabelle><\/b>, also zum Beispiel <b>Dateien.FileData<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_005.png\" alt=\"Das Unterformular sfmAnlagefeld in der Entwurfsansicht\" width=\"650\" height=\"297,9893\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Unterformular sfmAnlagefeld in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Das Feld <b>Dateien.FileData <\/b>weisen wir direkt dem Anlage-Steuerelement <b>ctlAttachment <\/b>als <b>Steuerelementinhalt <\/b>zu, damit dieses den Inhalt der Datei oder ein entsprechendes Symbol anzeigt. Wof&uuml;r aber ben&ouml;tigen wir das Feld <b>Dateien.FileName<\/b> Dieses verwenden wir, um den aktuellen Datensatz des Unterformulars mit dem im <b>ListView<\/b>-Steuerelement des Hauptformulars angezeigten Anlage-Datensatz zu synchronisieren.<\/p>\n<p>Dazu verwenden wir die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements, die sonst f&uuml;r die Verkn&uuml;pfung von Daten in einer 1:n-Beziehung in Haupt- und Unterformular dienen. In diesem Fall stellen wir die Eigenschaft <b>Verkn&uuml;pfen von <\/b>auf das Feld <b>Dateien.FileName <\/b>der Datenherkunft des Unterformulars und die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>auf das Textfeld <b>txtDateiname <\/b>ein. Dieses finden Sie samt den Eigenschaften des Unterformular-Steuerelements in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_006.png\" alt=\"Einstellungen f&uuml;r das Unterformular-Steuerelement\" width=\"550\" height=\"341,1058\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Einstellungen f&uuml;r das Unterformular-Steuerelement<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir nur noch kl&auml;ren, wie das Textfeld <b>txtDateiname <\/b>an den Namen des aktuell im <b>ListView<\/b>-Steuerelement ausgew&auml;hlten Eintrags kommt.<\/p>\n<h2>Beim Anzeigen eines Datensatzes<\/h2>\n<p>Jeder Datensatzwechsel, und damit auch das erste Anzeigen eines Datensatzes im Formular <b>frmAnlagefeldVerwalten<\/b>, l&ouml;st das Ereignis <b>Beim Anzeigen <\/b>und somit die Prozedur aus Listing 2 aus. Diese pr&uuml;ft zun&auml;chst, ob das Formular aktuell &uuml;berhaupt einen Datensatz anzeigt. Dies ist der Fall, wenn <b>Me!ProjektID <\/b>den Wert <b>Null <\/b>aufweist und geschieht etwa dann, wenn der Benutzer zu einem neuen, leeren Datensatz wechselt. In diesem Fall soll dann einfach das <b>ListView<\/b>-Steuerelement geleert werden &#8211; siehe <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\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>rstDateien<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!ProjektID)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Dateien.Filename FROM tblProjekte WHERE ProjektID = \" & Me!ProjektID _\r\n             & \" ORDER BY Dateien.Filename\", dbOpenDynaset)\r\n         Me!ctlListview.ListItems.Clear\r\n         Me!txtDateiname = rst(\"Dateien.Filename\")\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(rst.Fields(\"Dateien.Filename\"))<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!ctlListview.ListItems.Add , , rst.Fields(\"Dateien.FileName\")\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             rst.Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtDateiname = \"\"\r\n         Me!ctlListview.ListItems.Clear\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 2: Diese Ereignisprozedur wird beim Anzeigen eines jeden Datensatzes ausgel&ouml;st.<\/span><\/b><\/p>\n<p>Liegt jedoch ein Datensatz vor, erstellt die Prozedur ein neues Recordset, welches das Feld <b>Dateien.FileName <\/b>der Tabelle <b>tblProjekte <\/b>f&uuml;r alle Datens&auml;tze enth&auml;lt, deren Feld <b>ProjektID <\/b>mit dem aktuellen Prim&auml;rschl&uuml;sselwert des Datensatzes im Hauptformular &uuml;bereinstimmt. Die Prozedur leert dann die Eintr&auml;ge des Listenfeldes.<\/p>\n<p>Anschlie&szlig;end folgt eine Anweisung, die f&uuml;r die Synchronisierung mit dem Unterformular zur Anzeige der aktuell markierten Anlage verantwortlich ist: Sie stellt den Wert des Feldes <b>txtDateiname <\/b>auf den Dateinamen aus <b>rst(&#8222;Dateien.FileName&#8220;) <\/b>ein. Das Anlage-Steuerelement im Unterformular zeigt nun Inhalt des Anlagefeldes des ersten Datensatzes der Tabelle <b>tblProjekte <\/b>f&uuml;r das aktuellen Projekt an.<\/p>\n<p>Nun durchl&auml;uft die Prozedur alle Datens&auml;tze der Abfrage und f&uuml;gt dem <b>ListView<\/b>-Steuerelement jeweils einen neuen Eintrag hinzu, wobei dieser als Text jeweils den Inhalt des Feldes <b>Dateien.FileName<\/b> erh&auml;lt.<\/p>\n<h2>Hinzuf&uuml;gen neuer Anlagen per Drag and Drop<\/h2>\n<p>Neue Dateien f&uuml;gen Sie zum aktuellen Projekt hinzu, indem Sie diese aus dem Windows Explorer auf das Steuerelement ziehen. Wenn Sie ein beliebiges Objekt &uuml;ber dieses Steuerelement ziehen, l&ouml;st dies das Ereignis <b>OLEDragOver <\/b>aus. Dieses liefert mit <b>Data <\/b>einen Verweis auf das gezogene Objekt. Die <b>If&#8230;Then<\/b>-Bedingung aus Listing 3 pr&uuml;ft, ob es sich bei dem Objekt um eine Datei handelt (<b>ccDFFiles<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListview_OLEDragOver(Data<span style=\"color:blue;\"> As Object<\/span>, Effect<span style=\"color:blue;\"> As Long<\/span>, Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, x<span style=\"color:blue;\"> As Single<\/span>, _\r\n         y<span style=\"color:blue;\"> As Single<\/span>, State<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Data.GetFormat(ccCFFiles)<span style=\"color:blue;\"> Then<\/span>\r\n         Effect = ccOLEDropEffectNone\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ereignis beim &uuml;berfahren des Drop-Ziels<\/span><\/b><\/p>\n<p>Falls nicht, wird der Mauszeiger in ein Icon verwandelt, das andeutet, dass das aktuell gezogene Objekt nicht auf das <b>ListView<\/b>-Steuerelement fallen gelassen werden kann (<b>Effect = ccOLEDropEffectNone<\/b>), s. Bild 7.<\/p>\n<p class=\"image\"><img loading=\"lazy\" decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1013_007.png\" alt=\"Versuch, ein anderes Objekt als eine Datei auf das ListView-Steuerelement zu ziehen\" width=\"425\" height=\"255\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Versuch, ein anderes Objekt als eine Datei auf das ListView-Steuerelement zu ziehen<\/span><\/b><\/p>\n<p>Falls doch, kann der Benutzer das Objekt auf das <b>List-View<\/b>-Steuerelement fallen lassen. Dies l&ouml;st dann das Ereignis <b>OLEDragDrop<\/b> aus (s. Listing 4). Auch hier erfolgt zun&auml;chst die Pr&uuml;fung, ob es sich bei dem gezogenen Objekt um eine Datei handelt. Ist dies der Fall, startet die Prozedur eine <b>For Each<\/b>-Schleife &uuml;ber alle Elemente der <b>Files<\/b>-Auflistung des <b>Data<\/b>-Parameters. Dieser liefert alle Dateinamen der in <b>Data <\/b>enthaltenen Dateien &#8211; Sie k&ouml;nnen n&auml;mlich nicht nur eine einzige, sondern auch mehrere Dateien gleichzeitig in das Anlagefeld ziehen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListview_OLEDragDrop(Data<span style=\"color:blue;\"> As Object<\/span>, Effect<span style=\"color:blue;\"> As Long<\/span>, Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, x<span style=\"color:blue;\"> As Single<\/span>, _\r\n         y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>varDateipfad<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">If <\/span>Data.GetFormat(ccCFFiles)<span style=\"color:blue;\"> Then<\/span>\r\n         For Each varDateipfad In Data.Files\r\n             strDateiname = <span style=\"color:blue;\">Mid<\/span>(varDateipfad, <span style=\"color:blue;\">InStrRev<\/span>(varDateipfad, \"\\\") + 1)\r\n             <span style=\"color:blue;\">Set<\/span> objListItem = Me!ctlListview.ListItems.Add(, , strDateiname)\r\n             objListItem.Selected = <span style=\"color:blue;\">True<\/span>\r\n             Me!ctlListview.SetFocus\r\n             ctlListview_Click\r\n             DateiSpeichern CStr(varDateipfad)\r\n         <span style=\"color:blue;\">Next<\/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: Ereignis, das beim Fallenlassen einer Datei &uuml;ber dem ListView-Steuerelement ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Innerhalb der <b>For Each<\/b>-Schleife ermittelt die Prozedur nun den Dateinamen aus dem Dateipfad, indem Sie das erste Backslash-Zeichen von hinten aus gesehen ermittelt und nur den Teil rechts davon in der Variablen <b>strDateiname <\/b>speichert. Dann f&uuml;gt sie dem <b>ListView<\/b>-Steuerelement mit der <b>Add<\/b>-Methode der <b>ListItems<\/b>-Auflistung f&uuml;r jede Datei ein neues Element hinzu.<\/p>\n<p>Das neu hinzugef&uuml;gte Element wird selektiert und eine weitere Prozedur aufgerufen, die &uuml;blicherweise durch das Anklicken eines der Eintr&auml;ge des <b>ListView<\/b>-Steuerelements ausgel&ouml;st wird. Dies sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListview_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me!ctlListview.SelectedItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtDateiname = Me!ctlListview.SelectedItem.Text\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur stellt lediglich den Inhalt des Textfeldes <b>txtDateiname <\/b>auf den Text des aktuell gew&auml;hlten <b>ListView<\/b>-Eintrags ein und sorgt somit f&uuml;r die Anzeige der enthaltenen Datei im Anlagen-Steuerelement im Unterformular.<\/p>\n<p>Schlie&szlig;lich ruft die Prozedur die Routine <b>DateiSpeichern <\/b>auf, welche sich um das Speichern der Datei im Anlagefeld k&uuml;mmert. Bislang befindet sich ja nur der Dateiname im <b>ListView<\/b>-Steuerelement &#8211; die Datei wurde noch nicht in der Tabelle gespeichert.<\/p>\n<h2>Speichern der Datei im Anlagefeld<\/h2>\n<p>Die Routine <b>DateiSpeichern <\/b>finden Sie in Listing 5. Sie pr&uuml;ft wiederum, ob das Formular aktuell &uuml;berhaupt einen Datensatz anzeigt und nicht etwa einen neuen, leeren Datensatz. Ist Letzteres der Fall, geschehen drei Dinge: Der Fokus wird auf das Feld <b>Projektbezeichnung <\/b>verschoben, die Eigenschaft <b>Dirty <\/b>des Formulars erh&auml;lt den Wert <b>True<\/b>, was gleichbedeutend mit dem Anlegen eines neuen Datensatzes durch Eintragen eines Wertes f&uuml;r ein beliebiges Feld ist, und der neu angelegte Datensatz wird mit der Methode <b>RunCommand <\/b>und dem Parameter <b>acCmdSaveRecord <\/b>gespeichert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DateiSpeichern(strDateipfad<span style=\"color:blue;\"> As String<\/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>fld<span style=\"color:blue;\"> As <\/span>DAO.Field2\r\n     <span style=\"color:blue;\">Dim <\/span>rstDateien<span style=\"color:blue;\"> As <\/span>DAO.Recordset2\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!ProjektID)<span style=\"color:blue;\"> Then<\/span>\r\n         Me!Projektbezeichnung.SetFocus\r\n         Me.Dirty = <span style=\"color:blue;\">True<\/span>\r\n         RunCommand acCmdSaveRecord\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblProjekte WHERE ProjektID = \" _\r\n         & Me!ProjektID, dbOpenDynaset)\r\n     rst.Edit\r\n     <span style=\"color:blue;\">Set<\/span> rstDateien = rst.Fields(\"Dateien\").Value\r\n     rstDateien.Add<span style=\"color:blue;\">New<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> fld = rstDateien.Fields(\"FileData\")\r\n     fld.LoadFromFile strDateipfad\r\n     rstDateien.Update\r\n     rst.Update\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Prozedur zum Speichern einer Datei im Anlagefeld<\/span><\/b><\/p>\n<p>Damit liegt nun ein gespeicherter Datensatz vor, dessen Anlagefeld mit der mit dem Parameter <b>strDateipfad <\/b>&uuml;bergebenen Datei gef&uuml;llt werden kann.<\/p>\n<p>Dazu erstellt die Prozedur ein Recordset auf Basis der Tabelle <b>tblProjekte <\/b>mit dem Datensatz, der aktuell im Hauptformular angezeigt wird. Diesen versetzt die Prozedur mit der <b>Edit<\/b>-Methode in den Bearbeitungszustand und f&uuml;llt dann ein weiteres Recordset namens <b>rstDateien <\/b>mit der internen Tabelle zum Speichern der Anlage. Diesem f&uuml;gt sie einen neuen Datensatz hinzu und l&auml;dt die Datei aus <b>strDateipfad <\/b>in das Anlagefeld dieses Datensatzes. Nach dem Aktualisieren der beiden Recordsets per <b>Update<\/b>-Methode ist die Datei im Anlagefeld gespeichert.<\/p>\n<h2>Anlage per Schaltfl&auml;che l&ouml;schen<\/h2>\n<p>Kommen wir nun zu den Funktionen zum Verwalten der Anlagen, die das <b>ListView<\/b>-Steuerelement anzeigt. Dazu finden Sie unter dem <b>ListView<\/b>-Steuerelement drei Schaltfl&auml;chen zum L&ouml;schen, &ouml;ffnen oder Speichern des aktuellen Eintrags. Die Schaltfl&auml;che zum L&ouml;schen hei&szlig;t <b>cmdLoeschen<\/b> und l&ouml;st die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     Loeschen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die darin aufgerufene Prozedur hei&szlig;t <b>Loeschen<\/b> und ist in Listing 6 zu finden. Die Prozedur speichert zun&auml;chst den Dateinamen aus der <b>Text<\/b>-Eigenschaft des ausgew&auml;hlten Eintrags in der Variablen <b>strDateiname <\/b>zwischen. Dann &ouml;ffnet sie ein Recordset auf Basis der Tabelle <b>tblProjekte<\/b>, wobei dieses nach dem Datensatz gefiltert wird, dessen Feld <b>ProjektID <\/b>mit dem entsprechenden Wert des Feldes <b>ProjektID <\/b>des aktuell im Formular angezeigten Datensatzes &uuml;bereinstimmt. Dieser Datensatz wird mit der <b>Edit<\/b>-Methode zur Bearbeitung freigegeben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Loeschen()\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>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstDateien<span style=\"color:blue;\"> As <\/span>DAO.Recordset2\r\n     strDateiname = Me!ctlListview.SelectedItem.Text\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblProjekte WHERE ProjektID = \" & Me!ProjektID, dbOpenDynaset)\r\n     rst.Edit\r\n     <span style=\"color:blue;\">Set<\/span> rstDateien = rst.Fields(\"Dateien\").Value\r\n     rstDateien.FindFirst \"Filename = ''\" & strDateiname & \"''\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rstDateien.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n         rstDateien.Delete\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     rst.Update\r\n     Me!ctlListview.ListItems.Remove Me!ctlListview.SelectedItem.Index\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Prozedur zum L&ouml;schen der aktuell markierten Anlage<\/span><\/b><\/p>\n<p>Ein zweites Recordset namens <b>rstDateien <\/b>f&uuml;llt die Prozedur mit dem Inhalt des Anlagenfeldes <b>Dateien<\/b>.<\/p>\n<p>Hier sucht sie mit der <b>FindFirst<\/b>-Methode nach dem Eintrag, dessen Feld <b>Filename <\/b>mit dem Wert aus <b>strDateiname <\/b>&uuml;bereinstimmt. Sollte dies einen Datensatz zutage bringen, l&ouml;scht die Prozedur diesen mit der <b>Delete<\/b>-Methode des Recordsets <b>rstDateien<\/b>.<\/p>\n<p>Schlie&szlig;lich aktualisiert die Prozedur den Datensatz aus dem Recordset <b>rst <\/b>mit der <b>Update<\/b>-Methode und entfernt das entsprechende Element aus dem <b>ListView<\/b>-Steuerelement. Hier zu nutzt es die <b>Remove<\/b>-Methode der <b>ListItems<\/b>-Auflistung, der sie den Wert der <b>Index<\/b>-Eigenschaft des selektierten Eintrags &uuml;bergibt.<\/p>\n<h2>Anlage per Schaltfl&auml;che &ouml;ffnen<\/h2>\n<p>Die zweite Schaltfl&auml;che soll die im Anlagefeld gespeicherte Datei in der jeweiligen Datei &ouml;ffnen. Die Schaltfl&auml;che hei&szlig;t <b>cmdOeffnen <\/b>und ruft die Prozedur <b>Oeffnen <\/b>aus Listing 7 auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Oeffnen()\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>rstDateien<span style=\"color:blue;\"> As <\/span>DAO.Recordset2\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field2\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateipfad<span style=\"color:blue;\"> As String<\/span>\r\n     strDateiname = Me!ctlListview.SelectedItem.Text\r\n     strDateipfad = CurrentProject.Path & \"\\\" & strDateiname\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Dateien FROM tblProjekte WHERE ProjektID = \" & Me!ProjektID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstDateien = rst.Fields(\"Dateien\").Value\r\n     rstDateien.FindFirst \"FileName = ''\" & strDateiname & \"''\"\r\n     <span style=\"color:blue;\">Set<\/span> fld = rstDateien.Fields(\"FileData\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strDateipfad)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Datei bereits in ''\" & CurrentProject.Path & \"'' vorhanden. &uuml;berschreiben\", vbYesNo) = vbNo<span style=\"color:blue;\"> Then<\/span>\r\n             strDateipfad = GetSaveFile(CurrentProject.Path, strDateiname, , \"Speichern unter\")\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Kill strDateipfad\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strDateipfad) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         fld.SaveToFile strDateipfad\r\n         ShellExecute 0, \"open\", strDateipfad, \"\", \"\", 1\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 7: Prozedur zum &ouml;ffnen einer Datei aus einem Anlagefeld<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOeffnen_Click()\r\n     Oeffnen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur liest wiederum den Dateinamen in die Variable <b>strDateiname <\/b>ein. Anschlie&szlig;end stellt sie einen Dateipfad f&uuml;r das tempor&auml;re Speichern der Datei f&uuml;r die Anzeige zusammen, der aus dem aktuellen Datenbankpfad und dem Dateinamen besteht, und schreibt diesen in <b>strDateipfad<\/b>.<\/p>\n<p>Nun folgt das &ouml;ffnen der Datei, und zwar zun&auml;chst &uuml;ber das Recordset <b>rst <\/b>der Tabelle <b>tblProjekte <\/b>mit dem Datensatz, der aktuell im Formular angezeigt wird. Ein weiteres Recordset namens <b>rstDateien <\/b>nimmt die Datens&auml;tze der verborgenen Datei mit den Anlage-Informationen auf.<\/p>\n<p>Die <b>FindFirst<\/b>-Methode sucht die Anlage heraus, deren Feld <b>FileName <\/b>den Dateinamen des ausgew&auml;hlten Eintrags des <b>ListView<\/b>-Steuerelements enth&auml;lt. Dessen Feld <b>FileData <\/b>referenziert die Prozedur dann mit der Variablen <b>fld<\/b>.<\/p>\n<p>Nun m&uuml;ssen wir noch pr&uuml;fen, ob die tempor&auml;r anzulegende Datei nicht gegebenenfalls noch im Datenbankverzeichnis liegt &#8211; zum Beispiel, weil diese zuvor bereits einmal ge&ouml;ffnet wurde. Dazu pr&uuml;fen wir die L&auml;nge des durch die <b>Dir<\/b>-Funktion zur&uuml;ckgelieferten Wertes f&uuml;r den Dateipfad. Ist diese gr&ouml;&szlig;er als <b>0<\/b>, liegt die Datei bereits vor.<\/p>\n<p>Die Prozedur fragt den Benutzer dann, ob die vorliegende Datei &uuml;berschrieben werden soll. Falls ja, l&ouml;scht sie die Datei mit der <b>Kill<\/b>-Anweisung. Anderenfalls ermittelt sie mit der <b>GetSaveFile<\/b>-Funktion, die Sie im Modul <b>mdlTools <\/b>finden, den neuen Dateinamen der zu speichernden Datei.<\/p>\n<p>Danach speichert sie die Datei mit der <b>SaveFile<\/b>-Methode des <b>Field2<\/b>-Objekts <b>fld <\/b>am angegebenen Speicherort und &ouml;ffnet die Datei mit der <b>ShellExecute<\/b>-Funktion. Diese API-Funktion wird ebenfalls im Modul <b>mdlTools <\/b>deklariert.<\/p>\n<h2>Anlage per Schaltfl&auml;che speichern<\/h2>\n<p>Fehlt noch die Funktion, mit der der Benutzer die Anlage an einem von diesem gew&auml;hlten Speicherort ablegen kann. Die entsprechende Schaltfl&auml;che hei&szlig;t <b>cmdSpeichernUnter <\/b>und l&ouml;st die Prozedur <b>SpeichernUnter <\/b>aus Listing 8 aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SpeichernUnter()\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>rstDateien<span style=\"color:blue;\"> As <\/span>DAO.Recordset2\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field2\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateipfad<span style=\"color:blue;\"> As String<\/span>\r\n     strDateiname = Me!ctlListview.SelectedItem.Text\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Dateien FROM tblProjekte WHERE ProjektID = \" & Me!ProjektID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstDateien = rst.Fields(\"Dateien\").Value\r\n     rstDateien.FindFirst \"FileName = ''\" & strDateiname & \"''\"\r\n     <span style=\"color:blue;\">Set<\/span> fld = rstDateien.Fields(\"FileData\")\r\n     strDateipfad = GetSaveFile(CurrentProject.Path, strDateiname, , \"Speichern unter\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strDateipfad) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         fld.SaveToFile strDateipfad\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 8: Prozedur zum Speichern einer Datei aus einem Anlagefeld in einem vom Benutzer gew&auml;hlten Verzeichnis<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSpeichernUnter_Click()\r\n     SpeichernUnter\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ermittelt wieder den Dateinamen des aktuell selektierten Eintrags des <b>ListView<\/b>-Steuerelements. Wie zuvor f&uuml;llt sie ein <b>Field2<\/b>-Element namens <b>fld <\/b>mit einem Verweis auf das Feld mit der zu speichernden Anlage.<\/p>\n<p>Diesmal &ouml;ffnet sie allerdings direkt einen <b>Datei speichern<\/b>-Dialog und speichert das Ergebnis in der Variablen <b>strDateipfad<\/b>. Die <b>SaveToFile<\/b>-Methode speichert die Anlage schlie&szlig;lich in der angegebenen Datei.<\/p>\n<h2>L&ouml;schen, Speichern und &ouml;ffnen per Kontextmen&uuml;<\/h2>\n<p>Die drei hier vorgestellten Aktionen zum Verwalten der Anlagen sollen auch noch per Kontextmen&uuml; verf&uuml;gbar gemacht werden. Dazu m&uuml;ssen wir zun&auml;chst ein entsprechendes Kontextmen&uuml; zusammenstellen und anzeigen.<\/p>\n<p>F&uuml;r die Programmierung des Kontextmen&uuml;s ben&ouml;tigen Sie einen Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library<\/b>, den Sie gegebenenfalls noch &uuml;ber den <b>Verweise<\/b>-Dialog (VBA-Editor, <b>Men&uuml;eintrag Extras|Verweise<\/b>) hinzuf&uuml;gen m&uuml;ssen.<\/p>\n<p>Das Zusammenstellen und Anzeigen des Kontextmen&uuml;s erledigen wir dynamisch, wenn der Benutzer mit der rechten Maustaste auf das <b>ListView<\/b>-Steuerelement klickt. Dies l&ouml;st das Ereignis <b>MouseUp <\/b>des Steuerelements <b>ctlListView <\/b>aus, das wie in Listing 9 aussieht. Hier pr&uuml;ft die Prozedur den Wert des Parameters <b>Button<\/b>. Lautet dieser <b>2<\/b>, handelt es sich um einen Rechtsklick und das Kontextmen&uuml; soll erscheinen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListview_MouseUp(ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         ByVal x<span style=\"color:blue;\"> As Long<\/span>, ByVal y<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">If <\/span>Button = 2<span style=\"color:blue;\"> Then<\/span>\r\n         Me.ShortcutMenu = <span style=\"color:blue;\">False<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         CommandBars(\"cbrAnlagefeld\").Delete\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Add(\"cbrAnlagefeld\", msoBarPopup, , <span style=\"color:blue;\">True<\/span>)\r\n         <span style=\"color:blue;\">Set<\/span> cbbLoeschen = cbr.Controls.Add(1, , , , <span style=\"color:blue;\">True<\/span>)\r\n         cbbLoeschen.Caption = \"L&ouml;schen\"\r\n         <span style=\"color:blue;\">Set<\/span> cbbOeffnen = cbr.Controls.Add(1, , , , <span style=\"color:blue;\">True<\/span>)\r\n         cbbOeffnen.Caption = \"&ouml;ffnen\"\r\n         <span style=\"color:blue;\">Set<\/span> cbbSpeichernUnter = cbr.Controls.Add(1, , , , <span style=\"color:blue;\">True<\/span>)\r\n         cbbSpeichernUnter.Caption = \"Speichern unter\"\r\n         cbr.ShowPopup\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 9: Diese Prozedur zeigt beim Rechtsklick auf das ListView das Kontextmen&uuml; an.<\/span><\/b><\/p>\n<p>In diesem Fall deaktiviert die Prozedur mit <b>Me.ShortcutMenu = False <\/b>das eingebaute Kontextmen&uuml;, da dieses sonst im Anschluss an die Anzeige des benutzerdefinierten Kontextmen&uuml;s erscheinen w&uuml;rde. Nun l&ouml;scht die Prozedur ein eventuell vorhandenes Kontextmen&uuml; namens <b>cbrAnlagefeld<\/b>. Da dies beim Fehlen dieses Kontextmen&uuml;s zu einem Fehler f&uuml;hren w&uuml;rde, deaktivieren wir f&uuml;r die Ausf&uuml;hrung der <b>Delete<\/b>-Methode die Fehlerbehandlung.<\/p>\n<p>Die Prozedur f&uuml;gt dann ein neues <b>CommandBar<\/b>-Element zur <b>CommandBars<\/b>-Auflistung hinzu. Danach folgen die drei Kontextmen&uuml;-Eintr&auml;ge. Damit diese auf Ereignisse reagieren, legen Sie daf&uuml;r folgende mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausgestattete Variablen im Kopf des Klassenmoduls des Formulars an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents cbbLoeschen<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents cbbOeffnen<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents cbbSpeichernUnter<span style=\"color:blue;\"> As <\/span>CommandBarButton<\/pre>\n<p>Die Prozedur f&uuml;llt diese dann mit den Verweisen auf die mit der <b>Add<\/b>-Methode zur <b>Controls<\/b>-Auflistung des Objekts <b>cbr <\/b>hinzugef&uuml;gten <b>CommandBarButton<\/b>-Elemente. Au&szlig;erdem stellt es deren Eigenschaft <b>Caption <\/b>auf die entsprechende Beschriftung ein. Schlie&szlig;lich zeigt die <b>ShowPopup<\/b>-Methode das Kontextmen&uuml; an.<\/p>\n<p>F&uuml;r die drei Kontextmen&uuml;-Eintr&auml;ge, die ja nun mit den Variablen <b>cbbLoeschen<\/b>, <b>cbbOeffnen <\/b>und <b>cbbSpeichernUnter <\/b>referenziert werden, legen Sie nun noch entsprechende Ereignisprozeduren an.<\/p>\n<p>Dazu w&auml;hlen Sie im linken Kombinationsfeld des Klassenmoduls des Formulars den Namen der Variablen aus. Dies legt automatisch je eine Ereignisprozedur an, die Sie schlicht mit den Aufrufen der oben bereits beschriebenen Prozeduren <b>Loeschen<\/b>, <b>Oeffnen <\/b>und <b>SpeichernUnter <\/b>f&uuml;llen, wie hier an einem Beispiel zu sehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbbLoeschen_Click(ByVal Ctrl<span style=\"color:blue;\"> As <\/span>_\r\n         Office.CommandBarButton, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     Loeschen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie Sie einem Formular, das die Daten einer Tabelle mit einem Anlagefeld anzeigt, ein <b>ListView<\/b>-Steuerelement zur Anzeige der im Anlagefeld enthaltenen Dateien hinzuf&uuml;gen k&ouml;nnen. Au&szlig;erdem erfahren Sie, wie Sie auf die einzelnen Dateien des Anlagefeldes zugreifen und per Drag and Drop weitere Dateien hinzuf&uuml;gen. Die Verwaltung gelingt sowohl &uuml;ber Schaltfl&auml;chen unterhalb des <b>ListView<\/b>-Steuerelements als auch &uuml;ber das Kontextmen&uuml; der einzelnen Eintr&auml;ge.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DragAndDrop.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{DFB612F2-3DC6-4CE5-A7B3-2E4FD2CED1DA}\/aiu_1013.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anlage-Felder sind eine prima M&ouml;glichkeit, um Dateien in Access-Tabellen zu speichern. Im Gegen-satz zu OLE-Feldern stehen dazu sogar geeignete Elemente in der Benutzeroberfl&auml;che zur Ver-f&uuml;gung. Diese sind allerdings nicht besonders ausgereift &#8211; so kann man nicht direkt im For-mu-lar die in einem Anlage-Feld gespeicherten Elemente anzeigen oder neue hinzuf&uuml;gen. Dieser Beitrag zeigt, wie Sie ein Formular um diese M&ouml;glichkeit erweitern. Dabei f&uuml;gen wir auch gleich die im Beitrag Drag and Drop im Anlage-Feld vorgestellte Technik hinzu.<\/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":[662015,66062015,44000023],"tags":[],"class_list":["post-55001013","post","type-post","status-publish","format-standard","hentry","category-662015","category-66062015","category-Mit_Formularen_arbeiten"],"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>Inhalte von Anlagenfeldern verwalten - 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\/Inhalte_von_Anlagenfeldern_verwalten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Inhalte von Anlagenfeldern verwalten\" \/>\n<meta property=\"og:description\" content=\"Anlage-Felder sind eine prima M&ouml;glichkeit, um Dateien in Access-Tabellen zu speichern. Im Gegen-satz zu OLE-Feldern stehen dazu sogar geeignete Elemente in der Benutzeroberfl&auml;che zur Ver-f&uuml;gung. Diese sind allerdings nicht besonders ausgereift - so kann man nicht direkt im For-mu-lar die in einem Anlage-Feld gespeicherten Elemente anzeigen oder neue hinzuf&uuml;gen. Dieser Beitrag zeigt, wie Sie ein Formular um diese M&ouml;glichkeit erweitern. Dabei f&uuml;gen wir auch gleich die im Beitrag Drag and Drop im Anlage-Feld vorgestellte Technik hinzu.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:09:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Inhalte von Anlagenfeldern verwalten\",\"datePublished\":\"2020-05-22T19:09:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/\"},\"wordCount\":2953,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/9c73745cf3124a5bb856ad2d4711f3f1\",\"articleSection\":[\"2015\",\"6\\\/2015\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/\",\"name\":\"Inhalte von Anlagenfeldern verwalten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/9c73745cf3124a5bb856ad2d4711f3f1\",\"datePublished\":\"2020-05-22T19:09:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/9c73745cf3124a5bb856ad2d4711f3f1\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/9c73745cf3124a5bb856ad2d4711f3f1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Inhalte_von_Anlagenfeldern_verwalten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Inhalte von Anlagenfeldern verwalten\"}]},{\"@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":"Inhalte von Anlagenfeldern verwalten - 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\/Inhalte_von_Anlagenfeldern_verwalten\/","og_locale":"de_DE","og_type":"article","og_title":"Inhalte von Anlagenfeldern verwalten","og_description":"Anlage-Felder sind eine prima M&ouml;glichkeit, um Dateien in Access-Tabellen zu speichern. Im Gegen-satz zu OLE-Feldern stehen dazu sogar geeignete Elemente in der Benutzeroberfl&auml;che zur Ver-f&uuml;gung. Diese sind allerdings nicht besonders ausgereift - so kann man nicht direkt im For-mu-lar die in einem Anlage-Feld gespeicherten Elemente anzeigen oder neue hinzuf&uuml;gen. Dieser Beitrag zeigt, wie Sie ein Formular um diese M&ouml;glichkeit erweitern. Dabei f&uuml;gen wir auch gleich die im Beitrag Drag and Drop im Anlage-Feld vorgestellte Technik hinzu.","og_url":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:09:01+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Inhalte von Anlagenfeldern verwalten","datePublished":"2020-05-22T19:09:01+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/"},"wordCount":2953,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1","articleSection":["2015","6\/2015","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/","url":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/","name":"Inhalte von Anlagenfeldern verwalten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1","datePublished":"2020-05-22T19:09:01+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/9c73745cf3124a5bb856ad2d4711f3f1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Inhalte_von_Anlagenfeldern_verwalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Inhalte von Anlagenfeldern verwalten"}]},{"@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\/55001013","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=55001013"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001013\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}