{"id":55000686,"date":"2009-10-01T00:00:00","date_gmt":"2020-05-22T22:17:55","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=686"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ereignisprozeduren_implantieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/","title":{"rendered":"Ereignisprozeduren implantieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Ereignisse kann man nicht nur innerhalb des jeweiligen Klassenmoduls eines Objekts wie in Formularen oder Berichten abfangen. Sie k&ouml;nnen auch Code in Klassenmodulen, Formular- und Berichtsmodulen unterbringen, der die Ereignisse anderer Klassenmodule abf&auml;ngt und sich dort einklinkt. Dieser Beitrag zeigt, wie n&uuml;tzlich dies sein kann und wie es &uuml;berhaupt funktioniert.<\/b><\/p>\n<p>Im Beitrag <b>Ereignisprozeduren<\/b> (Shortlink 684) haben wir einige Grundlagen zur Programmierung der Ereignisprozeduren von Formularen und Berichten sowie darin enthaltener Steuerelementen beschrieben. Was wir dort nur angerissen haben, ist die Tatsache, dass Sie sich auch von au&szlig;erhalb des betroffenen Objekts und zur Laufzeit in die Ereigniskette einschleichen k&ouml;nnen.<\/p>\n<p>Was um Himmels willen soll man denn damit anfangen Bevor wir Beispiele liefern, zun&auml;chst einmal die grunds&auml;tzliche Vorgehensweise. Normalerweise schreiben Sie Ereignisprozeduren in das Klassenmodul des jeweiligen Formulars oder Berichts und stellen die Ereigniseigenschaften auf den Wert <b>[Ereignisprozedur] <\/b>oder <b>[Event Procedure] <\/b>ein, damit das Formular oder der Bericht wei&szlig;, dass f&uuml;r ein Ereignis eine entsprechende Prozedur vorhanden ist.<\/p>\n<p>Solche Ereignisse kann man aber auch au&szlig;erhalb des eigentlichen Klassenmoduls nutzen, indem man eine Objektvariable mit einer Referenz auf das Formular oder den Bericht deklariert und instanziert &#8211; und das unter Zuhilfenahme eines speziellen Schl&uuml;sselworts namens <b>WithEvents<\/b>.<\/p>\n<p>Der Beispielaufbau besteht aus zwei ungebundenen Formularen namens <b>frmEreignisAbfangen<\/b> und <b>frmFormularMitEreignis<\/b>. Ersteres enth&auml;lt lediglich eine Schaltfl&auml;che namens <b>cmdSetReference <\/b>und sieht wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Dieses Formular wird gleich die Ereignisse eines anderen Formulars abfangen.<\/span><\/b><\/p>\n<p>Das Formular <b>frmFormularMitEreignis <\/b>ist ein komplett leeres Formular, das lediglich Ereignisprozeduren f&uuml;r die Ereignisse <b>Beim &Ouml;ffnen <\/b>und <b>Beim Schlie&szlig;en <\/b>enth&auml;lt:<\/p>\n<pre>Private Sub Form_Close()\r\n    MsgBox \"Formular wird geschlossen.\"\r\n    End Sub\r\nPrivate Sub Form_Open(Cancel As Integer)\r\n    MsgBox \"Formular wird ge&ouml;ffnet.\"\r\n    End Sub<\/pre>\n<p>Der Schaltfl&auml;che <b>cmdSetReference <\/b>weisen Sie nun die folgende Ereignisprozedur zu &#8211; nicht ohne eine Objektvariable namens <b>objForm <\/b>mit dem Schl&uuml;sselwort <b>WithEvents <\/b>im Kopf des Klassenmoduls des Formulars zu referenzieren:<\/p>\n<pre>Dim WithEvents objForm As Form\r\nPrivate Sub cmdSetReference_Click()\r\n    DoCmd.OpenForm \"frmFormularMitEreignis\"\r\n    Set objForm = Forms!frmFormularMitEreignis\r\n    End Sub<\/pre>\n<p>Bei einem Mausklick auf die Schaltfl&auml;che geschieht nichts Unerwartetes: Die Routine &ouml;ffnet das Formular <b>frmFormularMitEreignis<\/b>, welches wiederum mit der oben definierten Meldung anzeigt, dass es ge&ouml;ffnet wurde. Gleiches geschieht, wenn Sie es wieder schlie&szlig;en.<\/p>\n<p><b>Ereignis einschleusen<\/b><\/p>\n<p>Dank der Deklaration von <b>objForm <\/b>mit dem Schl&uuml;sselwort <b>WithEvents <\/b>k&ouml;nnen wir im Klassenmodul des Formulars <b>frmEreignisAbfangen <\/b>Ereignisprozeduren f&uuml;r das mit <b>objForm <\/b>referenzierte Formular festlegen.<\/p>\n<p>Das geht am einfachsten, indem Sie aus dem linken Kombinationsfeld des Codefensters mit dem Modul <b>Form_frmEreignisAbfangen <\/b>den Eintrag <b>objForm <\/b>und aus dem rechten Fenster zum Beispiel den Eintrag <b>Open <\/b>ausw&auml;hlen. Probieren wir dies am Beispiel des <b>Close<\/b>-Ereignisses des Objekts <b>objForm <\/b>aus:<\/p>\n<pre>Private Sub objForm_Close()\r\n    MsgBox \"Implantiert: Formular wurde\r\n    geschlossen.\"\r\n    End Sub<\/pre>\n<p>Wenn Sie die Schaltfl&auml;che nun bet&auml;tigen und das Formular <b>frmFormularMitEreignis <\/b>anschlie&szlig;end wieder schlie&szlig;en, erscheinen zwei Meldungsfenster &#8211; das erste mit dem Text <b>Implantiert: Formular wurde geschlossen <\/b>und schlie&szlig;lich die Meldung aus dem Formular <b>frmFormularMitEreignis <\/b>selbst.<\/p>\n<p>Das Fazit lautet: Sie k&ouml;nnen Ereignisse f&uuml;r ein Formular auch von au&szlig;en festlegen, wenn Sie nur eine Objektvariable mit <b>WithEvents <\/b>deklarieren und damit auf das Zielformular verweisen. Hierbei gibt es noch einige weitere M&ouml;glichkeiten und auch Punkte, die Sie beachten m&uuml;ssen &#8211; f&uuml;rs Erste soll dies jedoch ausreichen, sodass wir uns nun wichtigeren Dingen zuwenden: Wof&uuml;r brauchen wir das Ganze &uuml;berhaupt<\/p>\n<p><b>Beispiele f&uuml;r die vorgestellte Technik<\/b><\/p>\n<p>In den folgenden Abschnitten zeigen wir Ihnen an zwei Beispielen, wie Sie durch das Implantieren einer Ereignisprozedur von einem Formular in ein anderes Vorteile erzielen und den Entwurf Ihrer Anwendung verbessern k&ouml;nnen.<\/p>\n<p><b>Beispiel Detailformular<\/b><\/p>\n<p>Das erste Beispiel, bei dem das Implantieren einer Ereignisprozedur eine Verbesserung hervorruft, ist die typische Vorgehensweise beim &Ouml;ffnen eines Detailformulars von einer &Uuml;bersichtsliste aus zum Anlegen eines neuen Datensatzes (Objekte in der Beispieldatenbank: <b>frmArtikeluebersicht_I<\/b>, <b>sfmArtikeluebersicht_I<\/b>, <b>frmArtikeldetails_I<\/b>). Bild 2 zeigt das &Uuml;bersichtsformular mit einer <b>Anzeigen<\/b>-Schaltfl&auml;che, die den Detaildialog aus Bild 3 &ouml;ffnen soll. Normalerweise ist daf&uuml;r etwa folgender Code verantwortlich, den Sie f&uuml;r die Ereigniseigenschaft <b>Beim Klicken <\/b>hinterlegen:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Mit der Anzeigen-Schaltfl&auml;che dieses Formulars &ouml;ffnen Sie &#8230;<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: &#8230; dieses Detailformular.<\/span><\/b><\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    DoCmd.OpenForm \"frmArtikeldetails_I\", _\r\n    DataMode:=acFormAdd, WindowMode:=acDialog\r\n    Me!sfmArtikeluebersicht.Form.Requery\r\n    End Sub<\/pre>\n<p>Diese Routine &ouml;ffnet das Detailformular als modalen Dialog, das hei&szlig;t, dass der aufrufende Code erst weiterl&auml;uft, wenn das Formular wieder geschlossen ist. Genau dann f&uuml;hrt die Routine noch eine Anweisung aus, die den Inhalt des Unterformulars mit der &Uuml;bersicht der Datens&auml;tze aktualisiert, damit dieses den &uuml;ber das Detailformular hinzugef&uuml;gten Datensatz direkt anzeigt.<\/p>\n<p><b>Nachteil Detailformular, Version I<\/b><\/p>\n<p>Der Nachteil hierbei ist in manchen F&auml;llen, dass der Benutzer nicht auf die Daten im aufrufenden Formular zugreifen kann, solange das Detailformular ge&ouml;ffnet ist (manchmal ist dies auch gewollt &#8211; in diesen F&auml;llen reicht die obige Technik nat&uuml;rlich aus).<\/p>\n<p><b>Verbesserung Detailformular<\/b><\/p>\n<p>Wenn Sie auf das &Uuml;bersichtsformular zugreifen m&ouml;chten, w&auml;hrend das Detailformular ge&ouml;ffnet ist, rufen Sie dieses mit folgender Anweisung auf &#8211; also wie oben, nur ohne den Parameter <b>WindowMode <\/b>auf <b>acDialog <\/b>einzustellen:<\/p>\n<pre>DoCmd.OpenForm \"frmArtikeldetails_I\",\r\nDataMode:=acFormAdd<\/pre>\n<p>Das Detailformular verschwindet nun allerdings hinter dem &Uuml;bersichtsformular, was Sie durch Einstellen der Eigenschaft <b>Popup <\/b>des Detailformulars auf den Wert <b>Ja <\/b>&auml;ndern. Sie k&ouml;nnen dann auf das &Uuml;bersichtsformular zugreifen, w&auml;hrend das Detailformular ge&ouml;ffnet ist (siehe Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Arbeiten im &Uuml;bersichtsformular, w&auml;hrend das Detailformular ge&ouml;ffnet ist<\/span><\/b><\/p>\n<p>Wenn Sie allerdings wollen, dass der neue Datensatz gleich nach dem Schlie&szlig;en des Detailformulars im &Uuml;bersichtsformular angezeigt wird, k&ouml;nnen Sie mit einem <b>Requery <\/b>in der aufrufenden Routine direkt hinter dem <b>DoCmd.OpenForm <\/b>nichts erreichen: Da das Detailformular nicht als modaler Dialog ge&ouml;ffnet wird, h&auml;lt Access auch die Ausf&uuml;hrung des Codes nicht an und ruft die <b>Requery<\/b>-Anweisung unmittelbar nach dem &Ouml;ffnen des Detailformulars auf, was hier nicht hilfreich ist.<\/p>\n<p>Wie aber bekommen wir nun mit, wann der Benutzer das Detailformular schlie&szlig;t und wir das Hauptformular aktualisieren m&uuml;ssen Hier setzen wir mit einem Ereignisprozedur-Implantat an. Deklarieren Sie im Kopf des Klassenmoduls des Formulars <b>frmArtikelUebersicht_I <\/b>eine Objektvariable, die eine Referenz auf das ge&ouml;ffnete Formular enth&auml;lt:<\/p>\n<pre>Dim WithEvents objFrmArtikelDetails_I As Form<\/pre>\n<p>Diese Variable f&uuml;llen Sie in der Ereignisprozedur, die das Detailformular &ouml;ffnet:<\/p>\n<pre>Set objFrmArtikelDetails_I =\r\nForms!frmArtikeldetails_I<\/pre>\n<p>Nun brauchen Sie nur noch ein Ereignis f&uuml;r das Detailformular im Klassenmodul des &Uuml;bersichtsformulars anzulegen, das beim Schlie&szlig;en des Detailformulars ausgel&ouml;st wird und das Unterformular mit der Daten&uuml;bersicht aktualisiert:<\/p>\n<pre>Private Sub objFrmArtikelDetails_I_Close()\r\n    Me!sfmArtikeluebersicht.Requery\r\n    End Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Wenn Sie dies nun ausprobieren, schl&auml;gt der Plan allerdings fehl: Der Grund ist, dass wir zwar eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim Schlie&szlig;en <\/b>des Detailformulars festgelegt haben, dieses aber nicht in die entsprechende Ereigniseigenschaft eingetragen wurde.<\/p>\n<p>Weiter oben in der Beschreibung der grundlegenden Techniken hat dies noch funktioniert, weil das Ereignis bereits im Formular vorhanden und dementsprechend auch die Ereigniseigenschaft gef&uuml;llt war. An dieser Stelle gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie tragen manuell den Wert <b>[Ereignisprozedur] <\/b>(besser englisch <b>[Event Procedure]<\/b>) f&uuml;r die Eigenschaft <b>Beim Schlie&szlig;en <\/b>des Detailformulars ein oder<\/li>\n<li class=\"aufz-hlung\">Sie lassen dies das aufrufende Formular per Code erledigen.<\/li>\n<\/ul>\n<p>F&uuml;r Letzteres ist nur eine Zeile n&ouml;tig, die Sie in die <b>Beim Klicken<\/b>-Prozedur des &Uuml;bersichtsformulars gleich hinter der Anweisung zum F&uuml;llen der Objektvariablen <b>objFrmArtikelDetails_I <\/b>einf&uuml;gen:<\/p>\n<pre>objFrmArtikelDetails_I.OnClose =\r\n\"[Event Procedure]\"<\/pre>\n<p>Somit wird nun beim Schlie&szlig;en des Detailformulars <b>frmArtikelDetails <\/b>die im Klassenmodul des &Uuml;bersichtsformulars <b>frmArtikelUebersicht <\/b>angelegte Ereignisprozedur ausgel&ouml;st, die das zeitnahe Aktualisieren des Unterformulars erm&ouml;glicht, ohne dass das Detailformular als modaler Dialog ge&ouml;ffnet werden muss.<\/p>\n<p><b>Ereignisimplantat f&uuml;r Haupt- und Unterformulare<\/b><\/p>\n<p>Wenn Sie in einem Formular ein Unterformular verwenden, sollten Sie ebenfalls auf die Abh&auml;ngigkeiten der beiden Elemente achten. Sinnvoll w&auml;re es, wenn die Steuerung beziehungsweise die Logik komplett im Hauptformular l&auml;ge.<\/p>\n<p>Als Beispiel schauen wir uns die Artikel&uuml;bersicht vom Anfang dieses Beitrags an. Sie enth&auml;lt einige Schaltfl&auml;chen, die normalerweise nur verwendet werden k&ouml;nnen, wenn ein Datensatz im Unterformular markiert ist. Um die Wirkung der folgenden Technik ein wenig zu unterstreichen, soll beispielsweise die <b>L&ouml;schen<\/b>-Schaltfl&auml;che nur aktiviert sein, wenn der im Unterformular angezeigte Artikel einen <b>Lagerbestand <\/b>von <b>0 <\/b>aufweist.<\/p>\n<p>Normalerweise w&uuml;rden Sie nun im Unterformular eine Ereignisprozedur f&uuml;r die Ereigniseigenschaft <b>Beim Anzeigen <\/b>anlegen, welche den aktuellen Datensatz pr&uuml;ft und die Schaltfl&auml;che <b>cmdLoeschen <\/b>im Hauptformular in Abh&auml;ngigkeit vom ausgew&auml;hlten Datensatz aktiviert oder deaktiviert.<\/p>\n<p>Diese Abh&auml;ngigkeit geht in die falsche Richtung: Das Unterformular sollte normalerweise v&ouml;llig unabh&auml;ngig vom Hauptformular sein, sich also ohne Probleme auch in andere Hauptformulare einf&uuml;gen lassen &#8211; beispielsweise eines, das nur f&uuml;r solche Mitarbeiter gedacht ist, die nur Artikeldaten lesen, diese aber nicht bearbeiten und schon gar nicht l&ouml;schen d&uuml;rfen.<\/p>\n<p>Das Formular <b>frmArtikeluebersicht_II <\/b>sieht wie in Bild 5 aus und enth&auml;lt als Unterformular das Formular <b>sfmArtikeluebersicht_II<\/b>. F&uuml;r die Objektreferenz auf das Unterformular brauchen wir wieder eine entsprechende Variable, die wir im Kopf des Klassenmoduls von <b>frmArtikeluebersicht_II <\/b>platzieren:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Dieses Formular implantiert dem Unterformular ein Beim Anzeigen-Ereignis.<\/span><\/b><\/p>\n<pre>Dim WithEvents objSfmArtikeluebersicht_II As Form<\/pre>\n<p>Die <b>L&ouml;schen<\/b>-Schaltfl&auml;che soll diese Funktion ausl&ouml;sen:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    With Me.sfmArtikeluebersicht.Form\r\n    .RecordsetClone.Bookmark = .Bookmark\r\n    .RecordsetClone.Delete\r\n    .Requery\r\n    End With\r\n    End Sub<\/pre>\n<p>Wie Sie sehen, enth&auml;lt die Prozedur keinerlei Pr&uuml;fung, ob der Datensatzzeiger des Unterformulars &uuml;berhaupt auf einem l&ouml;schbaren Datensatz und nicht etwa auf einem neuen, leeren Datensatz wie in Bild 5 steht, was zu einem Fehler f&uuml;hren w&uuml;rde.<\/p>\n<p>Also sorgen wir daf&uuml;r, dass die <b>L&ouml;schen<\/b>-Schaltfl&auml;che nur dann aktiviert ist, wenn das Unterformular einen l&ouml;schbaren Datensatz anzeigt.<\/p>\n<p>Dazu f&uuml;llen wir im <b>Beim Laden<\/b>-Ereignis des Hauptformulars zun&auml;chst die Objektvariable f&uuml;r das Unterformular und stellen dann die Eigenschaft <b>Beim Anzeigen <\/b>auf <b>[Event Procedure] <\/b>ein:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objSfmArtikeluebersicht_II =\r\n    Me!sfmArtikeluebersicht.Form\r\n    With objSfmArtikeluebersicht_II\r\n    .OnCurrent = \"[Event Procedure]\"\r\n    End With\r\n    End Sub<\/pre>\n<p>Fehlt noch die Ereignisprozedur, die wie folgt aussieht und beim Wechseln des Datensatzes im Unterformular ausgel&ouml;st wird: <\/p>\n<pre>Private Sub objSfmArtikeluebersicht_II_Current()\r\n    If objSfmArtikeluebersicht_II.NewRecord _\r\n    Or objSfmArtikeluebersicht_II. _\r\n    Lagerbestand = 0 Then\r\n    Me!cmdLoeschen.Enabled = False\r\nElse\r\n Me!cmdLoeschen.Enabled = True\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Die Routine pr&uuml;ft einfach nur, ob das Unterformular gerade einen leeren, neuen Datensatz anzeigt oder einen mit einem <b>Lagerbestand <\/b>von <b>0<\/b>, und aktiviert oder deaktiviert die <b>L&ouml;schen<\/b>-Schaltfl&auml;che entsprechend.<\/p>\n<p>Falls dies nicht funktioniert, besitzt das Unterformular m&ouml;glicherweise noch kein Klassenmodul. Dies legen Sie ganz einfach an, indem Sie <b>Enth&auml;lt Modul <\/b>auf den Wert <b>Ja <\/b>einstellen.<\/p>\n<p><b>Selbstimplantierung<\/b><\/p>\n<p>Nicht immer muss das ausf&uuml;hrende Formular selbst f&uuml;r das Implantieren der Ereignisprozeduren zust&auml;ndig sein. Schauen wir uns folgendes Beispiel an: Eine Anwendung verwendet ein Formular, das immer eingeblendet ist und beispielsweise die wichtigsten Unternehmensdaten anzeigt.<\/p>\n<p>Nun kann der Benutzer zu den dortigen Informationen Datens&auml;tze hinzuf&uuml;gen und dies auf zwei Arten initiieren:<\/p>\n<ul>\n<li class=\"aufz-hlung\">per Schaltfl&auml;che vom Hauptformular der Anwendung aus &#8211; hier l&auml;uft die Aktualisierung im Hauptformular dann ganz einfach wie in obigem Beispiel ab oder<\/li>\n<li class=\"aufz-hlung\">durch das &Ouml;ffnen des Formulars zum Anlegen eines neuen Datensatzes von einer anderen Stelle aus &#8211; beispielsweise &uuml;ber die Men&uuml;leiste oder das Ribbon, vielleicht aber auch &uuml;ber eine Tastenkombination.<\/li>\n<\/ul>\n<p>Erkennen Sie das Problem, das bei der zweiten Variante auftritt<\/p>\n<p>Richtig: Das Hauptformular ruft das Detailformular nicht selbst auf und kann diesem deshalb auch keine Ereignisprozeduren implantieren, die ihm dabei helfen, das Hinzuf&uuml;gen neuer Daten zu erkennen.<\/p>\n<p>Zur Vereinfachung nehmen wir statt eines Men&uuml;- oder Ribbon-Eintrags einfach eine kleine VBA-Routine, die das Detailformular zum Anlegen eines neuen Artikels &ouml;ffnet:<\/p>\n<pre>Public Sub SampleImplantEvent()\r\nDoCmd.OpenForm \"frmArtikeldetails_III\", _\r\nDataMode:=acFormAdd\r\nEnd Sub<\/pre>\n<p>Das <b>Beim Laden<\/b>-Ereignis des Detailformulars <b>frmArtikeldetails_III <\/b>statten wir mit dieser Ereignisprozedur aus:<\/p>\n<pre>Private Sub Form_Load()\r\nIf IstFormularGeoeffnet(\"frmArtikel\r\nuebersicht_III\") Then\r\nForms!frmArtikeluebersicht_III.\r\nImplantCloseEvent\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Die Routine pr&uuml;ft zun&auml;chst mit einer Hilfsfunktion, ob das Hauptformular dieses Beispiels, <b>frmArtikeluebersicht_III<\/b>, &uuml;berhaupt ge&ouml;ffnet ist, und ruft dann dessen Methode <b>ImplantCloseEvent <\/b>auf.<\/p>\n<p>Diese wiederum sieht so aus:<\/p>\n<pre>Public Sub ImplantCloseEvent()\r\nSet objFrmArtikelDetails_III =\r\nForms!frmArtikeldetails_III\r\nobjFrmArtikelDetails_III.OnClose =\r\n\"[Event Procedure]\"\r\nEnd Sub<\/pre>\n<p>Diese enth&auml;lt wiederum nur zwei Anweisungen, die einfach nur aus der Ereignisprozedur <b>Form_Load <\/b>des ersten Beispiels dieses Beitrags entnommen sind.<\/p>\n<p>Sie f&uuml;gen der Objektvariablen <b>objFrmArtikelDetails_III <\/b>einen Verweis auf das soeben ge&ouml;ffnete Formular <b>frmArtikeldetails_III <\/b>und stellen die Eigenschaft <b>Beim Schlie&szlig;en <\/b>auf den Wert <b>[Event Procedure] <\/b>ein.<\/p>\n<p>Was passiert hier nun Ganz einfach: <b>frmArtikelUebersicht_III<\/b>, das Hauptformular mit der Artikel&uuml;bersicht, ist bereits ge&ouml;ffnet.<\/p>\n<p>Die Routine <b>SampleImplantEvent <\/b>&ouml;ffnet das Formular <b>frmArtikelDetails_III<\/b>, das wiederum beim Laden pr&uuml;ft, ob das Formular <b>frmArtikelUebersicht_III <\/b>ge&ouml;ffnet ist, und ruft dessen Methode <b>ImplantCloseEvent <\/b>auf.<\/p>\n<p>Diese wiederum sorgt daf&uuml;r, dass das Formular <b>frmArtikelUebersicht_III <\/b>es mitbekommt, wenn der Benutzer das Formular <b>frmArtikelDetails_III <\/b>schlie&szlig;t und somit die in <b>frmArtikelUebersicht_III <\/b>angezeigten Daten aktualisiert werden k&ouml;nnen.<\/p>\n<p>Ups &#8211; haben Sie es auch gemerkt Wir haben da gerade eine Abh&auml;ngigkeit vom aufgerufenen Formular <b>frmArtikelDetails_III <\/b>zum eigentlichen Hauptformular <b>frmArtikelUebersicht_III <\/b>hergestellt, und das wollten wir ja gerade vermeiden.<\/p>\n<p>Kein Problem: Wir k&ouml;nnen die Anweisungen, welche die Methode <b>ImplantCloseEvent <\/b>des Formulars <b>frmArtikelUebersicht_III <\/b>aufrufen, ja auch nach au&szlig;en verlagern, etwa in die Routine, die f&uuml;r das &Ouml;ffnen des Formulars <b>frmArtikelDetails_III <\/b>verantwortlich ist:<\/p>\n<pre>Public Sub SampleImplantEvent()\r\nDoCmd.OpenForm \"frmArtikeldetails_III\",\r\nDataMode:=acFormAdd\r\nIf IstFormularGeoeffnet(\"frmArtikel\r\nuebersicht_III\") Then\r\nForms!frmArtikeluebersicht_III.\r\nImplantCloseEvent\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Das Formular <b>frmArtikelDetails_III <\/b>ist nun, wie gew&uuml;nscht, nach wie vor v&ouml;llig unabh&auml;ngig von den aufrufenden Instanzen. Und jede Instanz, die es mitbekommen m&ouml;chte, wenn das Formular geschlossen und m&ouml;glicherweise ein neuer Datensatz angelegt wurde, erf&auml;hrt auch davon &#8211; und kann dann etwa seine Artikel&uuml;bersicht aktualisieren.<\/p>\n<p><b>Erst lesen, dann schlie&szlig;en<\/b><\/p>\n<p>Noch eine Stufe weiter geht die Variante, bei der das aufrufende Formular Informationen vom aufgerufenen Formular auslesen muss, bevor dieses geschlossen wird.<\/p>\n<p>Die Beispielformulare f&uuml;r diesen Fall hei&szlig;en <b>frmForm <\/b>und <b>frmPopup<\/b>. <b>frmForm <\/b>und <b>frmPopup <\/b>besitzen beide ein Textfeld. <b>frmForm <\/b>kann <b>frmPopup <\/b>per Klick auf eine Schaltfl&auml;che aufrufen. Der Inhalt des Textfelds von <b>frmPopup <\/b>soll dann nach dem Schlie&szlig;en von <b>frmPopup <\/b>in das Textfeld von <b>frmForm <\/b>geschrieben werden (siehe Bild 6).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_05\/EreignisseAbfangenUndAuswerten-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Vom aufrufenden Formular zum Popup-Formular und zur&uuml;ck<\/span><\/b><\/p>\n<p>Normalerweise geschieht dies, indem Sie <b>frmPopup <\/b>als modalen Dialog &ouml;ffnen und dort zwei Schaltfl&auml;chen unterbringen: Die erste hei&szlig;t <b>cmdOK <\/b>und macht das Formular <b>frmPopup <\/b>unsichtbar, das zweite namens <b>cmdAbbrechen <\/b>schlie&szlig;t das Formular gleich komplett.<\/p>\n<p>Der aufrufende Code l&auml;uft dann nach dem Fokusverlust des modalen Dialogs weiter und pr&uuml;ft, ob das Formular <b>frmPopup <\/b>noch ge&ouml;ffnet ist: Falls ja, steht fest, dass der Benutzer die Schaltfl&auml;che <b>cmdOK <\/b>angeklickt hat (die Variante &uuml;ber die eingebaute Schlie&szlig;en-Schaltfl&auml;che lassen wir au&szlig;en vor). In diesem Fall liest die Routine den Inhalt des Textfelds im zwar nun unsichtbaren, aber noch ge&ouml;ffneten Formular <b>frmPopup <\/b>aus, schreibt diesen in das eigene Textfeld und schlie&szlig;t dieses dann endg&uuml;ltig. Falls der Benutzer <b>frmPopup <\/b>&uuml;ber die <b>Abbrechen<\/b>-Schaltfl&auml;che verlassen hat, findet die aufrufende Prozedur das Formular nicht mehr und geht davon aus, dass der Inhalt des Textfelds nicht ge&auml;ndert werden soll.<\/p>\n<p>Sehen Sie das Problem Das Formular <b>frmPopup <\/b>wird auf unsichtbar geschaltet, damit das aufrufende Formular noch darauf zugreifen kann.<\/p>\n<p><b>frmPopup <\/b>ist somit abh&auml;ngig vom aufrufenden Formular, weil es sonst nicht geschlossen wird und beim n&auml;chsten Aufruf per <b>DoCmd.OpenForm <\/b>die &uuml;bergebenen Parameter nicht ausgewertet werden, weil das Formular schon ge&ouml;ffnet ist.<\/p>\n<p>Beim Versuch, diese Konstellation mit den oben vorgestellten Techniken abzubilden, sto&szlig;en wir an deren Grenzen. Wir wollen erreichen, dass das aufrufende Formular beim Schlie&szlig;en des Popup-Formulars ermitteln kann, ob dieses &uuml;ber die <b>OK<\/b>&#8211; oder die <b>Abbrechen<\/b>-Schaltfl&auml;che geschlossen wurde, und somit entscheiden, ob der Inhalt des dortigen Textfelds in das Textfeld des aufrufenden Formulars &uuml;bernommen werden soll.<\/p>\n<p>Der erste Versuch l&auml;uft &uuml;ber das Implantieren des <b>Beim Schlie&szlig;en<\/b>-Ereignisses. Die Information &uuml;ber die gedr&uuml;ckte Schaltfl&auml;che soll uns die Eigenschaft <b>Screen.ActiveControl <\/b>liefern, aber leider hat das Popup-Formular zum Zeitpunkt des Schlie&szlig;ens nicht mehr den Fokus und <b>Screen.ActiveControl <\/b>f&uuml;hrt zu einem Fehler.<\/p>\n<p>Als N&auml;chstes versuchen wir, eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim Klicken <\/b>der <b>OK<\/b>-Schaltfl&auml;che zu implantieren. Wird dieses Ereignis ausgel&ouml;st, steht fest, dass der Benutzer diese Schaltfl&auml;che zum Schlie&szlig;en des Formulars verwendet hat und somit auch den Text aus dem Textfeld &uuml;bernehmen m&ouml;chte.<\/p>\n<p>Leider gibt es auch hier ein Problem: Es liegen n&auml;mlich nun zwei <b>Beim Klicken<\/b>-Ereignisprozeduren vor. Die erste im Klassenmodul des Popup-Formulars sieht so aus:<\/p>\n<pre>Private Sub cmdOK_Click()\r\nDoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Die implantierte Variante, die sich im Klassenmodul des aufrufenden Formulars befindet, besitzt diesen Code:<\/p>\n<pre>Private Sub objCmdOK_Click()\r\nMe!txtVonPopup = objFrmPopup!txtPopup\r\nEnd Sub<\/pre>\n<p>Zun&auml;chst einmal m&uuml;ssen Sie Zugriff auf die Ereignisse der Schaltfl&auml;che <b>cmdOK <\/b>des Popup-Formular erhalten, was nicht viel aufwendiger als beim Formular selbst ist. Die folgende Routine &ouml;ffnet zun&auml;chst <b>frmPopup<\/b>, holt sich dann die Referenz auf das Formular, legt dessen Ereigniseigenschaft <b>Beim Schlie&szlig;en <\/b>fest und bezieht dann eine zweite Referenz, diesmal auf die Schaltfl&auml;che <b>cmdOK <\/b>im bereits referenzierten Formular. Auch die damit gef&uuml;llte Objektvariable erh&auml;lt noch einen entsprechenden Wert f&uuml;r die Ereigniseigenschaft <b>Beim Klicken<\/b>:<\/p>\n<pre>Private Sub cmdPopupOeffnen_Click()\r\nDoCmd.OpenForm \"frmPopup\"\r\nSet objFrmPopup = New Form_frmPopup\r\nobjFrmPopup.OnClose = \"[Event Procedure]\"\r\nSet objCmdOK = objFrmPopup!cmdOK\r\nobjCmdOK.OnClick = \"[Event Procedure]\"\r\nEnd Sub<\/pre>\n<p>Nun stellt sich die Frage, ob &uuml;berhaupt beide Ereignisprozeduren ausgel&ouml;st werden, und wenn ja, welche zuerst<\/p>\n<p>Die Antwort ist ung&uuml;nstig: Die im Popup-Formular befindliche wird zuerst ausgel&ouml;st und sorgt somit daf&uuml;r, dass das Formular bereits geschlossen ist, wenn die implantierte <b>Beim Schlie&szlig;en<\/b>-Prozedur startet und versucht, den Inhalt des Textfelds auszulesen. Somit gibt es auch hier keine M&ouml;glichkeit, beim Schlie&szlig;en auf den Text zuzugreifen.<\/p>\n<p>Um es vorwegzunehmen: Es gibt noch die M&ouml;glichkeit, das <b>KeyDown<\/b>-Ereignis zu nutzen. Dieses wird durch das Herunterdr&uuml;cken der Maustaste und vor allem vor dem Ereignis <b>OnClick <\/b>ausgel&ouml;st und w&uuml;rde die M&ouml;glichkeit bieten, den Inhalt des Textfelds aus dem Popup-Formular in das aufrufende Formular zu &uuml;bertragen.<\/p>\n<p>Das Problem ist aber: Sie m&uuml;ssen dann sicherstellen, dass der Benutzer auch wirklich die Maustaste verwendet, um das Formular zu schlie&szlig;en.<\/p>\n<p>Dies ist ja auch &uuml;ber das vorherige Aktivieren der Schaltfl&auml;che per Tab- oder Cursor-Taste und anschlie&szlig;endes Bet&auml;tigen der Leertaste oder der Eingabetaste m&ouml;glich &#8211; und wenn dann noch das Ereignis <b>Bei Taste ab <\/b>ins Spiel kommt, &uuml;bersteigt der Aufwand doch allm&auml;hlich den Nutzen.<\/p>\n<p>Es gibt allerdings eine M&ouml;glichkeit, dies recht einfach zu l&ouml;sen &#8211; allerdings nicht durch das Implantieren eines eingebauten, sondern eines benutzerdefinierten Ereignisses. Huh! Das w&auml;re nun wirklich etwas viel neuer Stoff f&uuml;r einen einzigen Beitrag, weshalb wir darauf detaillierter im Beitrag <b>Ereignisse im Eigenbau <\/b>(Shortlink 685) eingehen.<\/p>\n<p>An dieser Stelle nur so viel zu dieser Methode: Sie werden dabei das kleine Manko der Reihenfolge beim Ausl&ouml;sen von originalen und implantierten Ereignissen beheben und daf&uuml;r sorgen, dass das externe Element in Aktion treten kann und somit vor dem Schlie&szlig;en des Formulars zum Zuge kommt, und gleichzeitig keine zus&auml;tzlichen Abh&auml;ngigkeiten schaffen &#8211; mehr erfahren Sie im oben genannten Beitrag.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ereignisse.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{728142F2-A123-452B-B122-D1869A24C502}\/aiu_686.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ereignisse kann man nicht nur innerhalb des jeweiligen Klassenmoduls eines Objekts wie in Formularen oder Berichten abfangen. Sie k&ouml;nnen auch Code in Klassenmodulen, Formular- und Berichtsmodulen unterbringen, der die Ereignisse anderer Klassenmodule abf&auml;ngt und sich dort einklinkt. Dieser Beitrag zeigt, wie n&uuml;tzlich dies sein kann und wie es &uuml;berhaupt funktioniert.<\/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":[662009,66052009,44000025],"tags":[],"class_list":["post-55000686","post","type-post","status-publish","format-standard","hentry","category-662009","category-66052009","category-VBA_und_Programmiertechniken"],"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>Ereignisprozeduren implantieren - 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\/Ereignisprozeduren_implantieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ereignisprozeduren implantieren\" \/>\n<meta property=\"og:description\" content=\"Ereignisse kann man nicht nur innerhalb des jeweiligen Klassenmoduls eines Objekts wie in Formularen oder Berichten abfangen. Sie k&ouml;nnen auch Code in Klassenmodulen, Formular- und Berichtsmodulen unterbringen, der die Ereignisse anderer Klassenmodule abf&auml;ngt und sich dort einklinkt. Dieser Beitrag zeigt, wie n&uuml;tzlich dies sein kann und wie es &uuml;berhaupt funktioniert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:17:55+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ereignisprozeduren implantieren\",\"datePublished\":\"2020-05-22T22:17:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/\"},\"wordCount\":3240,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/09a8c5d8864d4b25b286803ef3af6bf3\",\"articleSection\":[\"2009\",\"5\\\/2009\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/\",\"name\":\"Ereignisprozeduren implantieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/09a8c5d8864d4b25b286803ef3af6bf3\",\"datePublished\":\"2020-05-22T22:17:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/09a8c5d8864d4b25b286803ef3af6bf3\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/09a8c5d8864d4b25b286803ef3af6bf3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ereignisprozeduren_implantieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ereignisprozeduren implantieren\"}]},{\"@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":"Ereignisprozeduren implantieren - 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\/Ereignisprozeduren_implantieren\/","og_locale":"de_DE","og_type":"article","og_title":"Ereignisprozeduren implantieren","og_description":"Ereignisse kann man nicht nur innerhalb des jeweiligen Klassenmoduls eines Objekts wie in Formularen oder Berichten abfangen. Sie k&ouml;nnen auch Code in Klassenmodulen, Formular- und Berichtsmodulen unterbringen, der die Ereignisse anderer Klassenmodule abf&auml;ngt und sich dort einklinkt. Dieser Beitrag zeigt, wie n&uuml;tzlich dies sein kann und wie es &uuml;berhaupt funktioniert.","og_url":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:17:55+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ereignisprozeduren implantieren","datePublished":"2020-05-22T22:17:55+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/"},"wordCount":3240,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3","articleSection":["2009","5\/2009","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/","url":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/","name":"Ereignisprozeduren implantieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3","datePublished":"2020-05-22T22:17:55+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/09a8c5d8864d4b25b286803ef3af6bf3"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ereignisprozeduren_implantieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ereignisprozeduren implantieren"}]},{"@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\/55000686","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=55000686"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000686\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}