{"id":55000999,"date":"2015-10-01T00:00:00","date_gmt":"2020-05-22T19:11:13","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=999"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenblattereignisse_mit_Klasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/","title":{"rendered":"Datenblattereignisse mit Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie Ereignisse ausl&ouml;sen m&ouml;chten, sobald der Benutzer an irgendeine Stelle eines Datensatzes in der Datenblattansicht klickt, m&uuml;ssen Sie theoretisch f&uuml;r jedes einzelne Steuerelement eine entsprechende Ereignisprozedur anlegen. Bei Formularen mit vielen Feldern kann das recht m&uuml;hselig werden. Daher stellt dieser Beitrag eine Klasse vor, der Sie das Unterformular in der Datenblattansicht &uuml;bergeben und die Ihnen Ereignisse f&uuml;r die g&auml;ngigen Ereignisse wie Klick, Doppelklick et cetera bereitstellt. Diese m&uuml;ssen Sie dann nur noch einfach im Hauptformular implementieren.<\/b><\/p>\n<p>Die hier vorgestellte Klasse soll folgende Funktionen bieten:<\/p>\n<ul>\n<li>Erfassung von Klick-, Doppelklick-, Maus auf- und Maus ab-Ereignissen<\/li>\n<li>M&ouml;glichkeit der Implementierung an einer Stelle im Hauptformular, wobei mehrere Informationen &uuml;bergeben werden sollen &#8211; n&auml;mlich das Steuerelement, das angeklickt wurde, sowie optional der Prim&auml;rschl&uuml;sselwert des Datensatzes, der angeklickt wurde. Alternativ kann auch der Wert jedes beliebigen anderen Feldes &uuml;bergeben werden.<\/li>\n<li>&uuml;bergabe des markierten Datensatzes auch dann, wenn der Benutzer auf den Datensatzmarkierer klickt<\/li>\n<li>Optionale Markierung des kompletten Datensatzes beim Anklicken oder Doppelklicken<\/li>\n<\/ul>\n<p>Im Beispiel aus Bild 1 werten wir beispielsweise den Prim&auml;rschl&uuml;sselwert, die Aktion (also <b>Click<\/b>, <b>DblClick<\/b>, <b>MouseUp <\/b>oder <b>MouseDown<\/b>) und den Namen des angeklickten Steuerelements aus und zeigen diesen in den drei Textfeldern des Formulars an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_05\/pic_999_001.png\" alt=\"Unterformular mit Ereignisprozeduren im Hauptformular\" width=\"650\" height=\"403,6949\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Unterformular mit Ereignisprozeduren im Hauptformular<\/span><\/b><\/p>\n<p>Um dies zu realisieren, sind, sobald die beiden Klassen <b>clsDatasheetForm <\/b>und <b>clsDatasheetControl <\/b>einmal in das Projekt importiert wurden, nur einige wenige Zeilen Code erforderlich.<\/p>\n<p>Dabei deklarieren wir zun&auml;chst eine Variable, welche ein Objekt auf Basis der Klasse <b>clsDatasheetForm<\/b> aufnimmt, und zwar unter dem Namen <b>objDatasheetForm<\/b>. Au&szlig;erdem erstellen wir eine Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Diese sieht wie in Listing 1 aus (dort finden Sie auch die Deklaration des Objekts <b>objDatasheetForm<\/b>). Die Prozedur erstellt eine neue Instanz der Klasse <b>clsDatasheetForm<\/b> und speichert den Verweis auf das neue Objekt in der Variablen <b>objDatasheetForm<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objDatasheetForm<span style=\"color:blue;\"> As <\/span>clsDataSheetForm\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objDatasheetForm = <span style=\"color:blue;\">New<\/span> clsDatasheetForm\r\n     <span style=\"color:blue;\">With<\/span> objDatasheetForm\r\n         <span style=\"color:blue;\">Set<\/span> .DatasheetForm = Me!sfmArtikel.Form\r\n         .PrimaryKey = \"ArtikelID\"\r\n         .SelectRowOnClick = <span style=\"color:blue;\">True<\/span>\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: Ereignisprozedur, welche die Datenblattereignisse zugreifbar macht<\/span><\/b><\/p>\n<p>F&uuml;r diese stellt sie nun drei Eigenschaften ein:<\/p>\n<ul>\n<li><b>DatasheetForm <\/b>nimmt einen Verweis auf das Unterformular entgegen, dessen Ereignisse abgegriffen und an das Klassenmodul des Hauptformulars weitergeleitet werden sollen.<\/li>\n<li><b>PrimaryKey <\/b>ist eine optionale Eigenschaft, der Sie den Namen eines Feldes &uuml;bergeben k&ouml;nnen, dessen Wert beim Anklicken eines Datensatzes zur&uuml;ckgeliefert werden soll.<\/li>\n<li><b>SelectRowOnClick <\/b>ist eine <b>Boolean<\/b>-Eigenschaft, mit der Sie festlegen, ob beim Anklicken eines der Steuerelemente des Datensatzes gleich der komplette Datensatz im Unterformular markiert werden soll.<\/li>\n<\/ul>\n<p>Damit ist die Arbeit noch nicht getan. Schlie&szlig;lich m&uuml;ssen wir noch die Ereignisse definieren, die im Klassenmodul des Hauptformulars ausgel&ouml;st werden sollen, wenn ein Benutzer auf ein Feld eines Datensatzes im Unterformular klickt.<\/p>\n<p>Dazu w&auml;hlen Sie im VBA-Codefenster im linken Kombinationsfeld den Eintrag <b>objDatasheetForm <\/b>aus und im rechten einen der vier Eintr&auml;ge <b>Click<\/b>, <b>DblClick<\/b>, <b>MouseDown <\/b>oder <b>MouseUp <\/b>&#8211; je nachdem, welches Ereignis Sie implementieren m&ouml;chten. Der VBA-Editor legt dann automatisch den Prozedurrumpf f&uuml;r das jeweilige Ereignis an &#8211; genau so, als ob Sie ein Ereignis eines Formulars oder Steuerelements &uuml;ber das Eigenschaftsfenster der Entwurfsansicht anlegen (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_05\/pic_999_002.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r das Objekt objDatasheetForm\" width=\"650\" height=\"461,0132\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen einer Ereignisprozedur f&uuml;r das Objekt objDatasheetForm<\/span><\/b><\/p>\n<p>In dieser Liste sehen Sie, dass <b>objDatasheetForm <\/b>vier Ereignisse anbietet &#8211; <b>Click<\/b>, <b>DblClick<\/b>, <b>MouseDown <\/b>und <b>MouseUp<\/b>.<\/p>\n<p>Wir wollen alle vier implementieren, um Spielmaterial f&uuml;r unsere Beispielanwendung zu haben. So k&ouml;nnen Sie gut erkennen, wie Sie die Klassen einsetzen k&ouml;nnen.<\/p>\n<p>Allerdings schauen wir uns nur eine Ereignisprozedur hier an &#8211; die &uuml;brigen sind alle gleich aufgebaut. Die folgende Prozedur wird ausgel&ouml;st, wenn der Benutzer mit der Maus auf eines der Steuerelemente eines Datensatzes im Unterformular klickt &#8211; oder auf den Datensatzmarkierer:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objDatasheetForm_Click(ctl<span style=\"color:blue;\"> As <\/span>Control, _\r\n         varPKValue)\r\n     Me!txtAktion = \"Click\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctl Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtControl = ctl.Name\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtControl = \"Form\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtPKWert = varPKValue\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Parameter <b>ctl <\/b>liefert einen Verweis auf das Steu-erelement, das der Benutzer angeklickt hat. Ist <b>ctl <\/b>leer, bedeutet dies, dass der Benutzer nicht auf ein Steuerelement, sondern auf den Datensatzmarkierer geklickt hat.<\/p>\n<p>Die erste Anweisung tr&auml;gt den Text <b>Click <\/b>in das Textfeld <b>txtAktion <\/b>des Formulars ein. Dass hier das <b>Click<\/b>-Ereignis ausgel&ouml;st wurde, wissen wir nat&uuml;rlich, weil wir uns gerade im <b>objDatasheetForm_Click<\/b>-Ereignis befinden. Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob <b>ctl <\/b>nicht den Wert <b>Nothing <\/b>enth&auml;lt.<\/p>\n<p>In diesem Fall gibt die Prozedur den Namen des angeklickten Steuerelements im Textfeld <b>txtControl <\/b>aus. Anderenfalls wissen wir, dass der Benutzer anderswo im Formular geklickt hat, und tragen den Text <b>Form <\/b>in das Textfeld ein.<\/p>\n<p>Schlie&szlig;lich haben wir dem Objekt f&uuml;r die Eigenschaft <b>PrimaryKey <\/b>den Wert <b>ArtikelID <\/b>&uuml;bergeben. Deshalb liefert die Ereignisprozedur mit dem Parameter <b>varPKValue <\/b>den Wert dieses Feldes f&uuml;r den angeklickten Datensatz. Auch diesen geben wir aus &#8211; diesmal im Textfeld <b>txtPKWert<\/b>.<\/p>\n<p>Aufgrund der gelieferten Informationen wird deutlich, welche M&ouml;glichkeiten sich hier bieten. Sie k&ouml;nnen etwa &uuml;ber einen Doppelklick auf einen der Datens&auml;tze im Unterformular ein Detailformular mit weiteren Informationen zum Datensatz liefern &#8211; ohne f&uuml;r jedes einzelne Steuerelement, &uuml;ber das der Benutzer den Datensatz anklicken k&ouml;nnte, eine eigene Ereignisprozedur anlegen zu m&uuml;ssen.<\/p>\n<p>Gut: Im Hintergrund geschieht genau dies. Aber, wie Sie gleich sehen werden, auf dynamische Art und Weise, bei der Sie keine Zeile Code mehr hinzuf&uuml;gen m&uuml;ssen.<\/p>\n<h2>Technische Informationen zur Klasse clsDatasheetForm<\/h2>\n<p>Die Programmierung der Klassen, die im Hintergrund daf&uuml;r sorgen, dass die Ereignisse aller Steuerelemente des Datenblattformulars abgefangen und an das Hauptformular weitergegeben werden, scheint auf den ersten Blick recht kompliziert zu sein. Wenn man sich etwas hineinarbeitet, findet man sich allerdings gut zurecht.<\/p>\n<p>F&uuml;r die bessere &uuml;bersicht haben wir in Bild 3 ein kleines Schema der beteiligten Elemente aufgezeichnet. Links sind das Formular mit dem Unterformular und einige Steuerelemente.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_05\/pic_999_003.png\" alt=\"Schema der Formulare und Klassen\" width=\"700\" height=\"308,5134\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Schema der Formulare und Klassen<\/span><\/b><\/p>\n<p>Auf der rechten Seite sehen Sie die Klasse <b>clsData-sheetForm<\/b>. Darin befindet sich die Auflistung <b>colCon-trols<\/b>, die wiederum einige Elemente des Typs <b>clsData-sheetControl <\/b>enth&auml;lt. <\/p>\n<p>Das Ereignis <b>Beim Laden <\/b>des Hauptformulars erstellt ein Objekt auf Basis der Klasse <b>clsDatasheetForm<\/b>. Dabei &uuml;bergibt dieses einen Verweis auf das Unterformular an das Objekt <b>objDatasheetForm<\/b>. <b>objDatasheetForm <\/b>wiederum liest nach dem Zuweisen des Formulars alle Steuerelemente wie Textfelder, Kombinationsfelder, Listenfelder und Kontrollk&auml;stchen ein und legt f&uuml;r jedes eine eigene Instanz der Klasse <b>clsDatasheetControl <\/b>an. Diese landen in der Collection <b>colControls<\/b>.<\/p>\n<p>Die Instanzen der Klasse <b>clsDatasheetControl <\/b>referenzieren wiederum jeweils eines der Steuerelemente des Unterformulars.<\/p>\n<p>Dabei implementieren diese Klassen jeweils die Ereignisse <b>Beim Klicken<\/b>, <b>Beim Doppelklicken<\/b>, <b>Bei Maustaste ab <\/b>und <b>Bei Maustaste auf<\/b>. Das hei&szlig;t, dass in der Klasse <b>clsDatasheetControl <\/b>eine Ereignisprozedur ausgel&ouml;st wird, wenn der Benutzer auf eines der Steuerelemente klickt.<\/p>\n<p>Die Objekte auf Basis von <b>clsDatasheetControl <\/b>referenzieren aber nicht nur jeweils das ihnen zugeteilte Steuerelement, sondern auch die Instanz der Klasse <b>clsDatasheetForm<\/b>, deren Collection <b>colControl <\/b>sie angeh&ouml;ren. Dadurch kann <b>clsDatasheetControl <\/b>auf die in <b>clsDatasheetForm <\/b>enthaltenen Prozeduren <b>Click<\/b>, <b>DblClick<\/b>, <b>MouseDown <\/b>und <b>MouseUp <\/b>zugreifen.<\/p>\n<p>Wenn der Benutzer also auf ein Steuerelement klickt, wird das in der Klasse <b>clsDatasheetControl <\/b>implementierte Ereignis <b>OnClick <\/b>ausgel&ouml;st. Dieses wiederum ruft die Methode <b>Click <\/b>der Klasse <b>clsDatasheetForm <\/b>auf.<\/p>\n<p>Diese l&ouml;st das Ereignis <b>OnClick <\/b>der Klasse <b>clsData-sheetForm <\/b>aus, das seinerseits im Klassenmodul des Hauptformulars implementiert ist. Dort k&ouml;nnen wir dann das angeklickte Steuerelemente ermitteln und beispielsweise den Prim&auml;rschl&uuml;sselwert des markierten Datensatzes einlesen oder ein weiteres Formular etwa zur Anzeige eines Detaildatensatzes zum angeklickten Datensatz aufrufen.<\/p>\n<p>Aber warum ist das nun so kompliziert Ginge das nicht auch direkt vom Hauptformular aus Nat&uuml;rlich: Sie m&uuml;ssten dort allerdings von Hand f&uuml;r jedes Steuerelement im Unterformular die vier Ereignisse <b>Beim Klicken<\/b>, <b>Beim Doppelklicken<\/b>, <b>Bei Maustaste ab <\/b>und <b>Bei Maustaste auf <\/b>programmieren.<\/p>\n<p><!--30percent--><\/p>\n<p>Bei zehn Steuerelementen sind das schon 40 Ereignisprozeduren, die selbst bei Copy and Paste mit den damit verbundenen Fehlern beim Anpassen eine Menge Arbeit machen. Die beiden Klassen brauchen Sie nur zur Zielanwendung hinzuzuf&uuml;gen und k&ouml;nnen diese dann mit den oben gezeigten Anweisungen steuern, ohne zig Ereignisprozeduren programmieren zu m&uuml;ssen.<\/p>\n<h2>Code der Klasse clsDatasheetForm<\/h2>\n<p>Die Klasse <b>clsDatasheetForm <\/b>deklariert vier Variablen. Diese nehmen den Verweis auf das Unterformular, die Collection zum Speichern der Instanzen der Klasse <b>clsDatasheetControl<\/b>, den Namen des Prim&auml;rschl&uuml;sselfelds (<b>m_PrimaryKey<\/b>) und einen <b>Boolean<\/b>-Wert namens <b>m_SelectRow <\/b>auf, der festlegt, ob die gesamte Zeile beim Anklicken markiert werden soll:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Access.Form\r\n<span style=\"color:blue;\">Private <\/span>colControls<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_PrimaryKey<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_SelectRow<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>F&uuml;r das Erstellen der Objekte auf Basis der Klasse <b>clsDatasheetCollection <\/b>deklarieren wir au&szlig;erdem folgende Variable:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_DataSheetControl<span style=\"color:blue;\"> As <\/span>clsDatasheetControl<\/pre>\n<p>Damit das instanzierende Formular die Ereignisse der Klasse <b>clsDatasheetForm <\/b>implementieren kann, deklarieren wir diese wie folgt als <b>Public Events<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event DblClick(ctl<span style=\"color:blue;\"> As <\/span>Control,  varPKValue<span style=\"color:blue;\"> As Variant<\/span>)\r\n<span style=\"color:blue;\">Public <\/span>Event MouseDown(ctl<span style=\"color:blue;\"> As <\/span>Control,  varPKValue<span style=\"color:blue;\"> As Variant<\/span>)\r\n<span style=\"color:blue;\">Public <\/span>Event MouseUp(ctl<span style=\"color:blue;\"> As <\/span>Control,  varPKValue<span style=\"color:blue;\"> As Variant<\/span>)\r\n<span style=\"color:blue;\">Public <\/span>Event Click(ctl<span style=\"color:blue;\"> As <\/span>Control, varPKValue<span style=\"color:blue;\"> As Variant<\/span>)<\/pre>\n<p>Die obigen Member-Variablen f&uuml;llen wir &uuml;ber geeignete <b>Propery Set<\/b>&#8211; und <b>Property Let<\/b>-Prozeduren. Die wichtigste weist <b>m_Form <\/b>den Verweis auf das Unterformular zu (s. Listing 2) und hei&szlig;t <b>DatasheetForm<\/b>. Die als Parameter &uuml;bergebene <b>Form<\/b>-Variable landet in <b>m_Form<\/b>. Dann stellt die Prozedur die Eigenschaften <b>OnMouseDown<\/b>, <b>OnMouseUp<\/b>, <b>OnClick <\/b>und <b>OnDblClick <\/b>auf <b>[Event Procedure] <\/b>ein, damit in diesem Klassenmodul die entsprechenden Ereignisse implementiert werden k&ouml;nnen.<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>DatasheetForm(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n     <span style=\"color:blue;\">With<\/span> m_Form\r\n         .OnMouseDown = \"[Event Procedure]\"\r\n         .OnMouseUp = \"[Event Procedure]\"\r\n         .OnClick = \"[Event Procedure]\"\r\n         .OnDblClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> colControls = <span style=\"color:blue;\">New<\/span> Collection\r\n     For Each ctl In m_Form.Controls\r\n         Select Case ctl.ControlType\r\n             <span style=\"color:blue;\">Case <\/span>acTextBox, acComboBox, acListBox, acCheckBox\r\n                 <span style=\"color:blue;\">Set<\/span> m_DataSheetControl = <span style=\"color:blue;\">New<\/span> clsDataSheetControl\r\n                 <span style=\"color:blue;\">With<\/span> m_DataSheetControl\r\n                     <span style=\"color:blue;\">Set<\/span> .DataSheetControl = ctl\r\n                     <span style=\"color:blue;\">Set<\/span> .DataSheetForm = Me\r\n                     .SelectRowOnClick = m_SelectRow\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n                 colControls.Add m_DataSheetControl\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: F&uuml;llen der Klasse mit dem Unterformular<\/span><\/b><\/p>\n<p>Danach instanziert die Prozedur die Collection <b>colControls <\/b>und durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Steuerelemente des Unterformulars.<\/p>\n<p>Trifft es dabei auf ein Textfeld, Listenfeld, Kombinationsfeld oder ein Kontrollk&auml;stchen, legt es daf&uuml;r ein neues Objekt auf Basis der Klasse <b>clsDatasheetControl <\/b>an und weist diesem sowohl einen Verweis auf das Steuerelement als auch auf sich selbst (also auf <b>objDatasheetForm<\/b>) zu. Anschlie&szlig;end speichert sie den Verweis auf die neue <b>clsDatasheetControl<\/b>-Instanz in der Collection <b>colControls<\/b>.<\/p>\n<h2>Zeile markieren oder nicht<\/h2>\n<p>Um festzulegen, ob beim Anklicken eines Steuerelements gleich die ganze Zeile markiert werden soll, stellt die Klasse die Eigenschaft <b>SelectRowOnClick <\/b>zur Verf&uuml;gung. Diese nimmt einen <b>Boolean<\/b>-Wert entgegen und stellt zun&auml;chst die Member-Variable <b>m_SelectRow <\/b>auf den &uuml;bergebenen Wert ein. Danach muss Sie diese Einstellung noch den einzelnen Instanzen von <b>clsDatasheetControl <\/b>&uuml;bergeben.<\/p>\n<p>Dazu durchl&auml;uft sie in einer <b>For Each<\/b>-Schleife alle Elemente von <b>colControls <\/b>und stellt deren Eigenschaft <b>SelectRowOnClick <\/b>auf den &uuml;bergebenen Wert ein:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>SelectRowOnClick(bol<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objDatasheetcontrol<span style=\"color:blue;\"> As <\/span>clsDataSheetControl\r\n     m_SelectRow = bol\r\n     For Each objDatasheetcontrol In colControls\r\n         objDatasheetcontrol.SelectRowOnClick = m_SelectRow\r\n     <span style=\"color:blue;\">Next<\/span> objDatasheetcontrol\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>F&uuml;r die &uuml;bergabe des Prim&auml;rschl&uuml;ssels ist die folgende <b>Property Let<\/b>-Prozedur gedacht. Sie tr&auml;gt lediglich den &uuml;bergebenen Wert in die Variable <b>m_PrimaryKey <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>PrimaryKey( str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_PrimaryKey = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Nun sorgen wir daf&uuml;r, dass sich etwas tut, wenn der Benutzer auf den Datensatzmarkierer eines Datensatzes im Unterformular klickt. Dies l&ouml;st die Ereignisse <b>Form_Click<\/b>, <b>Form_MouseUp <\/b>und <b>Form_MouseDown <\/b>aus, beim Doppelklick auch <b>Form_DblClick<\/b>. Diese Ereignisse haben wir in Listing 3 implementiert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_PrimaryKey) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         RaiseEvent Click(Nothing, m_Form.Controls(m_PrimaryKey))\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent Click(Nothing, Null)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Form_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_PrimaryKey) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         RaiseEvent DblClick(Nothing, m_Form.Controls(m_PrimaryKey))\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent DblClick(Nothing, Null)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Form_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_PrimaryKey) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         RaiseEvent MouseDown(Nothing, m_Form.Controls(m_PrimaryKey))\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent MouseDown(Nothing, Null)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Form_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_PrimaryKey) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         RaiseEvent MouseUp(Nothing, m_Form.Controls(m_PrimaryKey))\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent MouseUp(Nothing, Null)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Implementierung der verschiedenen Maus-Ereignisse des Unterformulars<\/span><\/b><\/p>\n<p>Die Ereignisprozeduren sind &auml;hnlich aufgebaut. Sie pr&uuml;fen, ob <b>m_PrimaryKey <\/b>einen Wert enth&auml;lt und somit, ob ein Prim&auml;rschl&uuml;sselwert f&uuml;r den angeklickten Datensatz zur&uuml;ckgegeben werden soll.<\/p>\n<p>Falls ja, l&ouml;st die Prozedur das Ereignis <b>Click <\/b>aus und &uuml;bergibt diesem als ersten Parameter den Wert <b>Nothing <\/b>(hier sollte normalerweise das Steuerelement angegeben werden, auf das der Benutzer geklickt hat, was aber hier nicht der Fall ist) und als zweiten Parameter den Wert des angegebenen Prim&auml;rschl&uuml;sselfeldes.<\/p>\n<p>Sollte <b>m_PrimaryKey <\/b>leer sein, gibt die Prozedur einfach nur die Werte <b>Nothing <\/b>und <b>Null <\/b>f&uuml;r die Parameter weiter.<\/p>\n<p>Wenn der Benutzer nun eines der Steuerelemente im Unterformular anklickt, l&ouml;st er damit &#8211; kleiner Vorgriff &#8211; beispielsweise das in der Klasse <b>clsDatasheetControl <\/b>implementierte Ereignis <b>OnClick <\/b>eines Textfeldes aus. Dieses ruft dann unter anderem die Methode <b>Click <\/b>der Klasse <b>clsDatasheetForm <\/b>auf. Diese sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Click(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(m_PrimaryKey) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         RaiseEvent Click(ctl, m_Form.Controls(m_PrimaryKey))\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent Click(ctl, Null)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier geschieht also genau das Gleiche wie bei den Ereignissen, die durch das Anklicken des Datensatzmarkierers ausgel&ouml;st werden.<\/p>\n<p>Einziger Unterschied: Statt des Wertes <b>Nothing <\/b>(f&uuml;r das Formular) &uuml;bergibt die Prozedur einen Verweis auf das ausl&ouml;sende Steuerelement (<b>ctl<\/b>) an das Ereignis.<\/p>\n<p>Die &uuml;brigen drei Methoden namens <b>DblClick<\/b>, <b>MouseDown <\/b>und <b>MouseUp <\/b>sehen genauso aus.<\/p>\n<h2>Die Klasse clsDatasheetControl<\/h2>\n<p>Fehlt noch die Klasse <b>clsDatasheetControl<\/b>. Diese wird ja f&uuml;r jedes Textfeld, Kombinationsfeld, Listenfeld und Kontrollk&auml;stchen erstellt.<\/p>\n<p>Dementsprechend halten wir auch in jeder Instanz von <b>clsDatasheetControl <\/b>je eine Variable f&uuml;r die vier Steuerelementtypen vor &#8211; je nachdem, welches &uuml;bergeben wird, nutzen wir die eine oder andere Variable. Diese deklariert die Klasse wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_TextBox<span style=\"color:blue;\"> As <\/span>Access.TextBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_ListBox<span style=\"color:blue;\"> As <\/span>Access.Listbox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_ComboBox<span style=\"color:blue;\"> As <\/span>Access.ComboBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_CheckBox<span style=\"color:blue;\"> As <\/span>Access.CheckBox<\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir eine Variable f&uuml;r die instanzierende Klasse <b>clsDatasheetForm<\/b>, damit wir auf die vier Methoden <b>Click<\/b>, <b>DblClick<\/b>, <b>MouseUp <\/b>und <b>MouseDown <\/b>zugreifen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_DataSheetForm<span style=\"color:blue;\"> As <\/span>clsDataSheetForm<\/pre>\n<p>Au&szlig;erdem muss die Klasse <b>clsDatasheetForm<\/b> den Instanzen der Klasse <b>clsDatasheetControl <\/b>noch mitteilen, ob die gesamte Zeile beim Anklicken eines Datensatzes markiert werden soll. Dies speichert die folgende Variable:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_SelectRow<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<h2>Entgegennehmen der Steuerelemente<\/h2>\n<p>Den Verweis auf das Steuerelement nimmt die Eigenschaft <b>DatasheetControl <\/b>entgegen, und zwar in Form der gleichnamigen <b>Property Set<\/b>-Prozedur. Den mit dem Steuerelement gef&uuml;llten Parameter <b>ctl <\/b>pr&uuml;ft die Prozedur direkt auf die Eigenschaft <b>ControlType<\/b>.<\/p>\n<p>Je nachdem, ob es sich um <b>acTextBox<\/b>, <b>acComboBox<\/b>, <b>acListBox <\/b>oder <b>acCheckBox <\/b>handelt, weist die Prozedur <b>ctl <\/b>einer der Variablen <b>m_TextBox<\/b>, <b>m_ComboBox<\/b>, <b>m_ListBox <\/b>oder <b>m_CheckBox <\/b>zu. F&uuml;r das jeweilige Objekt stellt die Prozedur dann die Eigenschaften <b>OnMouseDown<\/b>, <b>OnMouseUp<\/b>, <b>OnMouseClick <\/b>und <b>OnMouseDblClick <\/b>auf <b>[Event Procedure] <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>DatasheetControl(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     Select Case ctl.ControlType\r\n         <span style=\"color:blue;\">Case <\/span>acTextBox\r\n             <span style=\"color:blue;\">Set<\/span> m_TextBox = ctl\r\n             m_TextBox.OnMouseDown = \"[Event Procedure]\"\r\n             m_TextBox.OnMouseUp = \"[Event Procedure]\"\r\n             m_TextBox.OnDblClick = \"[Event Procedure]\"\r\n             m_TextBox.OnClick = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acComboBox\r\n             <span style=\"color:blue;\">Set<\/span> m_ComboBox = ctl\r\n             m_ComboBox.OnMouseDown = \"[Event Procedure]\"\r\n             m_ComboBox.OnMouseUp = \"[Event Procedure]\"\r\n             m_ComboBox.OnDblClick = \"[Event Procedure]\"\r\n             m_ComboBox.OnClick = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acListBox\r\n             <span style=\"color:blue;\">Set<\/span> m_ListBox = ctl\r\n             m_ListBox.OnMouseDown = \"[Event Procedure]\"\r\n             m_ListBox.OnMouseUp = \"[Event Procedure]\"\r\n             m_ListBox.OnDblClick = \"[Event Procedure]\"\r\n             m_ListBox.OnClick = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acCheckBox\r\n             <span style=\"color:blue;\">Set<\/span> m_CheckBox = ctl\r\n             m_CheckBox.OnMouseDown = \"[Event Procedure]\"\r\n             m_CheckBox.OnMouseUp = \"[Event Procedure]\"\r\n             m_CheckBox.OnDblClick = \"[Event Procedure]\"\r\n             m_CheckBox.OnClick = \"[Event Procedure]\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Eigenschaft <b>SelectRowOnClick <\/b>nimmt die folgende <b>Property Let<\/b>-Prozedur entgegen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>SelectRowOnClick(bol<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     m_SelectRow = bol\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Auf &auml;hnliche Art wird der Verweis auf die Instanz von <b>clsDatasheetForm <\/b>gespeichert:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>DataSheetForm(obj<span style=\"color:blue;\"> As <\/span>clsDatasheetForm)\r\n     <span style=\"color:blue;\">Set<\/span> m_DataSheetForm = obj\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>F&uuml;r jede der vier Steuerelementtypen implementiert die Klasse <b>clsDatasheetControl <\/b>wiederum vier Ereignisprozeduren, die jeweils eine einzige Routine aufrufen. Nachfolgend die vier Ereignisprozeduren f&uuml;r die Variable <b>m_TextBox<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_TextBox_Click()\r\n     Click m_TextBox\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_TextBox_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     DblClick m_TextBox\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_TextBox_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     MouseDown m_TextBox\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_TextBox_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     MouseUp m_TextBox\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Jede dieser sechzehn Ereignisprozeduren ruft eine der vier folgenden Prozeduren auf &#8211; entsprechend dem Ereignis. Die Prozedur <b>m_TextBox_Click <\/b>ruft also die Routine <b>Click <\/b>auf, die Prozedur <b>m_Textbox_DblClick <\/b>die Routine <b>DblClick <\/b>und so weiter.<\/p>\n<p>Diese Prozeduren erwarten als Parameter den Verweis auf das jeweilige Steuerelement. Sie pr&uuml;fen, ob <b>m_SelectRow <\/b>den Wert <b>True <\/b>hat und starten in diesem Fall die Routine <b>SelectRow <\/b>(siehe weiter unten).<\/p>\n<p>Danach rufen sie die jeweils gleichnamige Methode der Klasse <b>clsDatasheetForm <\/b>auf, also beispielsweise <b>m_DatasheetForm.Click<\/b>. Der Verweis auf das angeklickte Steuerelement aus ctl wird hier jeweils weitergereicht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Click(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">If <\/span>m_SelectRow<span style=\"color:blue;\"> Then<\/span>\r\n         SelectRow\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_DataSheetForm.Click ctl\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>DblClick(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">If <\/span>m_SelectRow<span style=\"color:blue;\"> Then<\/span>\r\n         SelectRow\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_DataSheetForm.DblClick ctl\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>MouseDown(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">If <\/span>m_SelectRow<span style=\"color:blue;\"> Then<\/span>\r\n         SelectRow\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_DataSheetForm.MouseDown ctl\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>MouseUp(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">If <\/span>m_SelectRow<span style=\"color:blue;\"> Then<\/span>\r\n         SelectRow\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_DataSheetForm.MouseUp ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zeile markieren<\/h2>\n<p>Wie weiter oben beschreiben, l&ouml;st das Anklicken eines Steuerelements die Routine <b>SelectRow <\/b>aus, wenn die Variable <b>m_SelectRow <\/b>den Wert <b>True <\/b>hat. <b>SelectRow <\/b>erledigt nichts weiter, als die <b>RunCommand<\/b>-Methode mit dem Wert <b>acCmdSelectRecord <\/b>aufzurufen, was den aktuellen Datensatz komplett markiert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SelectRow()\r\n     DoCmd.RunCommand acCmdSelectRecord\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die beiden Klassen sparen eine Menge Tipparbeit, wenn Sie von einem Hauptformular aus auf die Ereignisse der Steuerelemente in einem Unterformular reagieren wollen.<\/p>\n<p>Ein Beispiel finden Sie im Beitrag <b>Kundendaten zusammenf&uuml;hren <\/b>(<b>www.access-im-unternehmen.de\/1000<\/b>). Dort soll die M&ouml;glichkeit geschaffen werden, f&uuml;r jeden Doppelklick im Bereich eines Datensatzes ein Detailformular unter anderem mit dem verkn&uuml;pften Daten dieses Datensatzes anzuzeigen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenblattereignisseMitKlasse.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{5825E5D8-5B72-4A76-9328-1B2AE7F80902}\/aiu_999.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Ereignisse ausl&ouml;sen m&ouml;chten, sobald der Benutzer an irgendeine Stelle eines Datensatzes in der Datenblattansicht klickt, m&uuml;ssen Sie theoretisch f&uuml;r jedes einzelne Steuerelement eine entsprechende Ereignisprozedur anlegen. Bei Formularen mit vielen Feldern kann das recht m&uuml;hselig werden. Daher stellt dieser Beitrag eine Klasse vor, der Sie das Unterformular in der Datenblattansicht &uuml;bergeben und die Ihnen Ereignisse f&uuml;r die g&auml;ngigen Ereignisse wie Klick, Doppelklick et cetera bereitstellt. Diese m&uuml;ssen Sie dann nur noch einfach im Hauptformular implementieren.<\/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,66052015,44000023],"tags":[],"class_list":["post-55000999","post","type-post","status-publish","format-standard","hentry","category-662015","category-66052015","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>Datenblattereignisse mit Klasse - 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\/Datenblattereignisse_mit_Klasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenblattereignisse mit Klasse\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Ereignisse ausl&ouml;sen m&ouml;chten, sobald der Benutzer an irgendeine Stelle eines Datensatzes in der Datenblattansicht klickt, m&uuml;ssen Sie theoretisch f&uuml;r jedes einzelne Steuerelement eine entsprechende Ereignisprozedur anlegen. Bei Formularen mit vielen Feldern kann das recht m&uuml;hselig werden. Daher stellt dieser Beitrag eine Klasse vor, der Sie das Unterformular in der Datenblattansicht &uuml;bergeben und die Ihnen Ereignisse f&uuml;r die g&auml;ngigen Ereignisse wie Klick, Doppelklick et cetera bereitstellt. Diese m&uuml;ssen Sie dann nur noch einfach im Hauptformular implementieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:11:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenblattereignisse mit Klasse\",\"datePublished\":\"2020-05-22T19:11:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/\"},\"wordCount\":2482,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/f9a0860dafeb437ea5d54686d00259c3\",\"articleSection\":[\"2015\",\"5\\\/2015\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/\",\"name\":\"Datenblattereignisse mit Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/f9a0860dafeb437ea5d54686d00259c3\",\"datePublished\":\"2020-05-22T19:11:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/f9a0860dafeb437ea5d54686d00259c3\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/f9a0860dafeb437ea5d54686d00259c3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenblattereignisse_mit_Klasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenblattereignisse mit Klasse\"}]},{\"@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":"Datenblattereignisse mit Klasse - 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\/Datenblattereignisse_mit_Klasse\/","og_locale":"de_DE","og_type":"article","og_title":"Datenblattereignisse mit Klasse","og_description":"Wenn Sie Ereignisse ausl&ouml;sen m&ouml;chten, sobald der Benutzer an irgendeine Stelle eines Datensatzes in der Datenblattansicht klickt, m&uuml;ssen Sie theoretisch f&uuml;r jedes einzelne Steuerelement eine entsprechende Ereignisprozedur anlegen. Bei Formularen mit vielen Feldern kann das recht m&uuml;hselig werden. Daher stellt dieser Beitrag eine Klasse vor, der Sie das Unterformular in der Datenblattansicht &uuml;bergeben und die Ihnen Ereignisse f&uuml;r die g&auml;ngigen Ereignisse wie Klick, Doppelklick et cetera bereitstellt. Diese m&uuml;ssen Sie dann nur noch einfach im Hauptformular implementieren.","og_url":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:11:13+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenblattereignisse mit Klasse","datePublished":"2020-05-22T19:11:13+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/"},"wordCount":2482,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3","articleSection":["2015","5\/2015","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/","url":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/","name":"Datenblattereignisse mit Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3","datePublished":"2020-05-22T19:11:13+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/f9a0860dafeb437ea5d54686d00259c3"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenblattereignisse_mit_Klasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenblattereignisse mit Klasse"}]},{"@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\/55000999","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=55000999"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000999\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000999"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000999"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000999"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}