{"id":55001245,"date":"2020-08-01T00:00:00","date_gmt":"2020-08-05T10:30:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1245"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Formulare_zur_Laufzeit_analysieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/","title":{"rendered":"Formulare zur Laufzeit analysieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie selbst eine Anwendung programmieren und ein Formular nicht so funktioniert wie gew&uuml;nscht, wissen Sie, wie die Steuer-elemente hei&szlig;en, an welche Datenquellen sie gebunden sind und so weiter. Vielleicht ist die Entwicklung der Anwendung auch etwas l&auml;nger her und Sie m&uuml;ssen sich erst wieder einarbeiten &#8211; oder Sie erhalten von einem Kunden eine Anwendung mit der Bitte, dort eine Funktion in einem Formular zu &uuml;berpr&uuml;fen. In den beiden letzteren F&auml;llen ist es recht m&uuml;hsam, zwischen Formular- und Entwurfsansicht zu wechseln, um Steuerelementnamen, Datenherk&uuml;nfte und andere Informationen herauszufinden, die zur L&ouml;sung des Problems beitragen k&ouml;nnten. Der vorliegende Beitrag zeigt, wie Sie ein Formular schnell mithilfe eines zur Laufzeit hinzugef&uuml;gten Kontextmen&uuml;s analysieren k&ouml;nnen, um schneller L&ouml;sungen zu finden.<\/b><\/p>\n<p>Die &uuml;blichen Mittel, die einem zur Verf&uuml;gung stehen, um Informationen &uuml;ber das Formular, die enthaltenen Steuer-elemente oder ihre Eigenschaften zu ermitteln, sind die Elemente der <b>Screen<\/b>-Klasse. Dieses bietet Eigenschaften wie <b>ActiveForm <\/b>f&uuml;r das Ermitteln eines Verweises auf das aktuelle Formular oder <b>ActiveControl <\/b>f&uuml;r das Ermitteln des aktuellen Steuerelements.<\/p>\n<p>Den Namen des aktuellen Formulars k&ouml;nnen Sie so beispielsweise &uuml;ber das Direktfenster ermitteln, ohne in die Entwurfsansicht wechseln zu m&uuml;ssen. Dazu geben Sie den folgenden Befehl ein:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Screen.ActiveForm.Name<\/pre>\n<p>Vielleicht wollen Sie auch auf die Eigenschaften des aktuellen Steuer-elements zugreifen. Dann verwenden Sie <b>ActiveControl<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Screen.ActiveControl.Name<\/pre>\n<p>Wenn Sie dann auf eine spezielle Eigenschaft des Formulars oder Steuerelements zugreifen wollen, die Sie nicht genau kennen, weil Sie diese sonst immer per IntelliSense eingeben, wird es allerdings schwierig, weil zumindest <b>Screen.ActiveControl <\/b>nur einige allgemeine Eigenschaften liefert.<\/p>\n<p><b>Geplante L&ouml;sung<\/b><\/p>\n<p>Was wir nun machen wollen, ist die Bereitstellung aller Eigenschaften eines Formulars oder Steuerelements &uuml;ber das Kontextmen&uuml; des jeweiligen Elements. Wenn der Entwickler also mit der rechten Maustaste auf ein Formular oder Steuer-element klickt, soll ein Kontextmen&uuml; erscheinen, das zus&auml;tzlich zu den eingebauten Befehlen noch weitere Eintr&auml;ge enth&auml;lt &#8211; einen, der direkt den Namen des Elements anzeigt und einen, der in einem Untermen&uuml; alle Eigenschaften des Elements samt Werten liefert.<\/p>\n<p>Das soll etwa wie in Bild 1 aussehen. Diese Kontextmen&uuml;-Eintr&auml;ge wollen wir f&uuml;r alle Elemente des Formulars liefern &#8211; also sowohl f&uuml;r das Formular selbst, f&uuml;r die Steuer-elemente als auch f&uuml;r die Elemente in Unterformularen, unabh&auml;ngig davon, ob es sich um die Datenblatt- oder die Formularansicht handelt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1245_001.png\" alt=\"Anzeige der Eigenschaften per Kontextmen&uuml;\" width=\"700\" height=\"521,769\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anzeige der Eigenschaften per Kontextmen&uuml;<\/span><\/b><\/p>\n<p><b>Realisierung<\/b><\/p>\n<p>Im aufwendigsten Fall f&uuml;gt man f&uuml;r jedes Formular und f&uuml;r jedes Steuer-element eine Ereignisprozedur hinzu, die durch das Ereignis <b>Bei Maustaste ab <\/b>ausgel&ouml;st wird.<\/p>\n<p>In dieser Prozedur pr&uuml;ft man dann, ob der Benutzer die linke oder die rechte Taste gedr&uuml;ckt hat. Im Falle der rechten Maustaste soll dann das nun anzuzeigende Kontextmen&uuml; erweitert werden, und zwar um ein Element mit dem Namen des Formulars oder Steuerelements und mit einem Untermen&uuml; mit den Eigenschaften des Elements.<\/p>\n<p>Allerdings m&uuml;sste man das dann f&uuml;r alle Formulare und Steuer-elemente machen, die man untersuchen m&ouml;chte &#8211; und das wollen wir nicht. Stattdessen arbeiten wir, wie schon des &Ouml;fteren, mit zwei Klassenmodulen, denen wir die Formulare und Steuer-elemente zuweisen und welche die notwendigen Ereignisprozeduren bereits enthalten.<\/p>\n<p>Diese schauen wir uns nun an &#8211; zuerst das Klassenmodul, mit dem wir das Formular referenzieren und das die Kontextmen&uuml;-Befehle f&uuml;r dieses bereitstellt.<\/p>\n<p><b>Klassenmodul f&uuml;r die Kontextmen&uuml;s in Formularen<\/b><\/p>\n<p>Dieses Klassenmodul nennen wir <b>clsForm<\/b>.<\/p>\n<p>Das Formular verwendet die folgenden Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_frm<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_Detail<span style=\"color:blue;\"> As <\/span>Section\r\n<span style=\"color:blue;\">Public <\/span>colControls<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_IsSubform<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Die beiden Variablen <b>m_frm <\/b>und <b>m_Detail <\/b>werden mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausgestattet, wodurch wir in dem Klassenmodul, in dem die Objekte deklariert sind, Ereignisprozeduren f&uuml;r diese Objekte implementieren k&ouml;nnen.<\/p>\n<p>Die Klasse stellt eine &ouml;ffentliche Eigenschaft namens <b>Form <\/b>zur Verf&uuml;gung, die das mit den Kontextmen&uuml;s auszustattende Formular entgegennimmt und die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>objControl<span style=\"color:blue;\"> As <\/span>clsControl\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_frm = frm\r\n     <span style=\"color:blue;\">With<\/span> m_frm\r\n         .OnMouseDown = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_Detail = Form.Section(0)\r\n     <span style=\"color:blue;\">With<\/span> m_Detail\r\n         .OnMouseDown = \"[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_frm.Controls\r\n         <span style=\"color:blue;\">Set<\/span> objControl = <span style=\"color:blue;\">New<\/span> clsControl\r\n         <span style=\"color:blue;\">With<\/span> objControl\r\n             .IsSubform = m_IsSubform\r\n             <span style=\"color:blue;\">Set<\/span> .Control = ctl\r\n             colControls.Add objControl\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Diese <b>Property Set<\/b>-Prozedur speichert zun&auml;chst den mit <b>frm <\/b>&uuml;bergebenen Verweis auf das betreffende Formular in der Variablen <b>m_frm<\/b>. Dann stellt es f&uuml;r die Ereignis-eigenschaft <b>Bei Maustaste ab <\/b>(<b>OnMouseDown<\/b>) des Formulars den Wert <b>Ereignisprozedur <\/b>ein (<b>[Event Procedure]<\/b>). Danach ermittelt die Prozedur den Detailbereich des Formulars und referenziert diesen mit der Variablen <b>m_Detail<\/b>. Auch daf&uuml;r stellt sie den Wert <b>[Event Procedure] <\/b>f&uuml;r die Eigenschaft <b>OnMouseDown <\/b>ein. Danach durchl&auml;uft die Methode die Steuerelemente im Formular und legt f&uuml;r jedes Steuer-element eine neue Instanz der Klasse <b>clsControl<\/b>, die wir weiter unten erl&auml;utern, an und weist der Eigenschaft <b>Control <\/b>dieses Objekts das aktuelle Steuer-element zu. Gegebenenfalls befinden wir uns gerade in einem Unterformular, dann wird noch der Wert <b>True <\/b>f&uuml;r die Eigenschaft <b>IsSubform <\/b>&uuml;bergeben. Schlie&szlig;lich landen alle Objekte auf Basis der Klasse <b>clsControl <\/b>in der Collection <b>colControls<\/b>.<\/p>\n<p><b>Rechter Mausklick auf Formular oder Detailbereich<\/b><\/p>\n<p>Wenn der Benutzer mit der rechten Maustaste auf das Formular oder den Detailbereich klickt, l&ouml;st er die Prozedur <b>m_Detail_MouseDown <\/b>aus. Diese legen Sie an, indem Sie im Codefenster der Klasse <b>clsForm <\/b>im linken Kombinationsfeld den Eintrag <b>m_Detail <\/b>und im rechten den Eintrag <b>MouseDown <\/b>ausw&auml;hlen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1245_002.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r eine Objektvariable\" width=\"700\" height=\"312,3832\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen einer Ereignisprozedur f&uuml;r eine Objektvariable<\/span><\/b><\/p>\n<p>Dadurch wird eine Ereignisprozedur angelegt, die wir wie in Listing 1 erg&auml;nzen. Hier deklarieren wir zun&auml;chst zwei Variablen, um eine Men&uuml;leiste und eine Men&uuml;schaltfl&auml;che zu referenzieren.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Detail_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;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">If <\/span>m_frm.CurrentView = acCurViewDatasheet<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form DataSheetCell\")\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>m_IsSubform<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Subform\")\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View popup\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> Err.Number = 0\r\n         cbr.Controls(\"Steuerelement-Infos anzeigen\").Delete\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> Err.Number = 0\r\n         cbr.Controls(\"Eigenschaften\").Delete\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbb\r\n         <span style=\"color:blue;\">If <\/span>m_IsSubform<span style=\"color:blue;\"> Then<\/span>\r\n             .Caption = \"Unterformular: \" & m_frm.Name\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             .Caption = \"Formular: \" & m_frm.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     PropertiesHinzufuegen cbr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur beim Mausklick auf ein Formular<\/span><\/b><\/p>\n<p><b>Kontextmen&uuml;s identifizieren<\/b><\/p>\n<p>Nun folgen wichtige Schritte, in denen wir festlegen, welches Kontextmen&uuml; &uuml;berhaupt mit unseren zus&auml;tzlichen Eintr&auml;gen versehen werden soll. Access zeigt n&auml;mlich immer andere Kontextmen&uuml;s an, wenn Sie unterschiedliche Elemente mit der rechten Maustaste anklicken &#8211; und deren Namen wir durch den Aufruf einer bestimmten Prozedur ermitteln k&ouml;nnen. Diese sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ButtonMitNameZuKontextmenuesHinzufuegen()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     For Each cbr In CommandBars\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add( msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n         cbb.Caption = cbr.Name\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> cbr.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur durchl&auml;uft alle Eintr&auml;ge der <b>CommandBars<\/b>-Auflistung von Access und f&uuml;gt jedem ein Element des Typs <b>msoControlButton <\/b>hinzu, also eine einfache Schaltfl&auml;che.<\/p>\n<p>Die Beschriftung des jeweiligen Elements f&uuml;llen wir mit dem Namen des aktuellen Kontextmen&uuml;s. Dadurch zeigt jedes Kontextmen&uuml; von nun an als letzten Eintrag seinen Namen an &#8211; wie am Beispiel eines Datenblatts zu erkennen (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1245_003.png\" alt=\"Anzeige des Kontextmen&uuml;-Namens im Kontextmen&uuml;\" width=\"649,559\" height=\"480,8554\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anzeige des Kontextmen&uuml;-Namens im Kontextmen&uuml;<\/span><\/b><\/p>\n<p><b>Kontextmen&uuml; im Kontext des jeweiligen Objekts anpassen<\/b><\/p>\n<p>Dann pr&uuml;fen wir, ob das aktuelle Formular in der Datenblattansicht angezeigt wird, was der Fall ist, wenn die Eigenschaft <b>CurrentView <\/b>den Wert <b>acCurViewDatasheet <\/b>liefert. In diesem Fall erstellen wir ein <b>CommandBar<\/b>-Objekt auf Basis des Men&uuml;s <b>Form DataSheetCell<\/b>.<\/p>\n<p>Anderenfalls, also wenn das Formular nicht in der Datenblattansicht angezeigt wird, pr&uuml;fen wir den Inhalt der Variablen <b>m_IsSubform<\/b>. Ist dieser <b>True<\/b>, befinden wir uns gerade in einem Unterformular. Dann zeigt der rechte Mausklick das Men&uuml; <b>Form View Subform <\/b>an, welches wir der Variablen <b>cbr <\/b>zuweisen. Ist es kein Unterformular, verwenden wir das Kontextmen&uuml; namens <b>Form View Popup<\/b>.<\/p>\n<p>Danach l&ouml;schen wir alle eventuell bereits aus vorherigen Anwendungen vorhandenen Schaltfl&auml;chen mit den Beschriftungen <b>Steuerelement-Infos anzeigen <\/b>und <b>Eigenschaften <\/b>aus dem Kontextmen&uuml;. Das erledigen wir bei deaktivierter Fehlerbehandlung in jeweils einer <b>Do While<\/b>-Schleife, die verlassen wird, wenn ein Fehler aufgetaucht ist &#8211; und das geschieht, wenn das L&ouml;schen der genannten Elemente nicht mehr erfolgreich ist, weil kein passendes Element mehr gefunden werden konnte.<\/p>\n<p>Dann f&uuml;gen wir mit der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung der Men&uuml;leiste aus <b>cbr <\/b>ein neues Element zur <b>Men&uuml;leiste <\/b>hinzu und referenzieren dieses mit der Variablen <b>cbb<\/b>.<\/p>\n<p>F&uuml;r diese legen wir dann die Beschriftung fest, wobei diese wieder vom Wert der Variablen <b>m_IsSubform <\/b>abh&auml;ngt. Weist diese den Wert <b>True <\/b>auf, haben wir ein Unterformular und geben den Text <b>Unterformular <\/b>gefolgt von einem Doppelpunkt und den aus <b>m_frm.Name <\/b>ermittelten Formularnamen an. Anderenfalls lautet der Text <b>Formular: <\/b>plus dem Formularnamen.<\/p>\n<p>Schlie&szlig;lich rufen wir die Prozedur <b>PropertiesHinzufuegen <\/b>auf und &uuml;bergeben dieser die Variable mit dem Verweis auf das <b>CommandBar<\/b>-Objekt.<\/p>\n<p><b>Eigenschaften in Kontextmen&uuml; eintragen<\/b><\/p>\n<p>Die Prozedur <b>PropertiesHinzufuegen <\/b>tr&auml;gt die Eigenschaften des Formulars als Elemente des noch hinzuzuf&uuml;genden Untermen&uuml;s <b>Eigenschaften <\/b>ein (siehe Listing 2). Sie erwartet eine Verweis auf das <b>CommandBar<\/b>-Objekt, dem das Untermen&uuml; hinzugef&uuml;gt werden soll und deklariert die Variablen <b>cbp <\/b>(<b>CommandBarPopup<\/b>, f&uuml;r das Untermen&uuml;), <b>prp <\/b>(<b>Property<\/b>, f&uuml;r das Durchlaufen der Eigenschaften des Formulars) und <b>cbb <\/b>(<b>CommandBarButton<\/b>, f&uuml;r die anzulegenden Elemente im Untermen&uuml;).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>PropertiesHinzufuegen(cbr<span style=\"color:blue;\"> As <\/span>CommandBar)\r\n     <span style=\"color:blue;\">Dim <\/span>cbp<span style=\"color:blue;\"> As <\/span>CommandBarPopup\r\n     <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>DAO.Property\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Set<\/span> cbp = cbr.Controls.Add(msoControlPopup, , , , <span style=\"color:blue;\">True<\/span>)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> Err.Number = 0\r\n         cbr.Controls(\"Eigenschaften\").Delete\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     cbp.Caption = \"Eigenschaften\"\r\n     For Each prp In m_frm.Properties\r\n         <span style=\"color:blue;\">Set<\/span> cbb = cbp.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         cbb.Caption = prp.Name & \": \" & prp.Value\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span> prp\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Hinzuf&uuml;gen der Eigenschaften samt ihrer Werte<\/span><\/b><\/p>\n<p>Das <b>CommandBarPopup<\/b>-Element <b>cbp <\/b>legen wir wieder mit der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung des <b>CommandBar<\/b>-Objekts an, diesmal mit dem Typ <b>msoControlPopup <\/b>als Wert des ersten Parameters.<\/p>\n<p>Dann entfernen wir wieder eventuell vorhandene Elemente namens <b>Eigenschaften <\/b>und weisen dem neu erstellten Element genau diesen Namen zu. Schlie&szlig;lich durchlaufen wir alle Eigenschaften der <b>Properties<\/b>-Auflistung des Formulars aus <b>m_frm<\/b> in einer <b>For Each<\/b>-Schleife. Dabei legen wir f&uuml;r jede Eigenschaft ein neues Element im Untermen&uuml; an und weisen diesem als Beschriftung den Namen der Eigenschaft (<b>prp.Name<\/b>) und den Wert der Eigenschaft zu (<b>prp.Value<\/b>).<\/p>\n<p>Damit ist das Kontextmen&uuml; f&uuml;r das Abfragen der Eigenschaften des Formulars so erweitert, dass es die gew&uuml;nschten Informationen beim Rechtsklick anzeigt.<\/p>\n<p><b>Die Klasse clsControls f&uuml;r die Kontextmen&uuml;s der Steuer-elemente<\/b><\/p>\n<p>In der Klasse, die f&uuml;r jede einzelne Steuer-element des Formulars angelegt wird &#8211; und auch f&uuml;r Unterformulare und die darin enthaltenen Steuer-elemente -, deklarieren wir zun&auml;chst einige Variablen. Als Erstes ben&ouml;tigen wir f&uuml;r jeden g&auml;ngigen Steuerelementtyp eine Variable, mit der wir das Steuer-element referenzieren k&ouml;nnen. Diese deklarieren wir mit dem Schl&uuml;sselwort <b>WithEvents<\/b>, damit wir wieder das Ereignis <b>Bei Maustaste ab <\/b>im gleichen Klassenmodul implementieren k&ouml;nnen. Wir deklarieren deshalb f&uuml;r jeden Steuerelementtyp eine eigene Variable, weil diese zwar eine Menge gemeinsamer Eigenschaften aufweisen, jeder Steuerelementtyp aber auch einige individuelle Eigenschaften aufweist:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents chk<span style=\"color:blue;\"> As <\/span>CheckBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cbo<span style=\"color:blue;\"> As <\/span>ComboBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cmd<span style=\"color:blue;\"> As <\/span>CommandButton\r\n<span style=\"color:blue;\">Private <\/span>WithEvents lst<span style=\"color:blue;\"> As <\/span>ListBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents lbl<span style=\"color:blue;\"> As <\/span>Label\r\n<span style=\"color:blue;\">Private <\/span>WithEvents opt<span style=\"color:blue;\"> As <\/span>OptionButton\r\n<span style=\"color:blue;\">Private <\/span>WithEvents ogr<span style=\"color:blue;\"> As <\/span>OptionGroup\r\n<span style=\"color:blue;\">Private <\/span>WithEvents tgl<span style=\"color:blue;\"> As <\/span>ToggleButton\r\n<span style=\"color:blue;\">Private <\/span>WithEvents sfm<span style=\"color:blue;\"> As <\/span>SubForm<\/pre>\n<p>Wir haben hier die wichtigsten Steuerelementtypen ber&uuml;cksichtigt. Sie k&ouml;nnen noch weitere Steuerelementtypen hinzuf&uuml;gen, wenn Sie Bedarf haben.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wie eine Variable, die wir vor&uuml;bergehend mit dem Verweis auf das Steuer-element f&uuml;llen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_ctl<span style=\"color:blue;\"> As <\/span>Control<\/pre>\n<p>Mit <b>objForm <\/b>wollen wir die Instanz der Klasse <b>clsForm <\/b>referenzieren, welche die Steuerelement-Klasse <b>clsControl <\/b>angelegt hat:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objForm<span style=\"color:blue;\"> As <\/span>clsForm<\/pre>\n<p>Und in <b>m_IsSubform <\/b>speichern wir wiederum die Information, ob das Steuer-element sich in einem Unterformular befindet:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_IsSubform<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Zum Einstellen der Eigenschaft <b>m_IsSubform <\/b>verwenden wir die folgende <b>Property Let<\/b>-Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>IsSubform(bol<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     m_IsSubform = bol\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die <b>Property Set<\/b>-Prozedur <b>Control <\/b>erlaubt das Hinzuf&uuml;gen des Steuerelements zur Eigenschaft <b>m_ctl<\/b>. Sie wird von der &uuml;bergeordneten Klasse <b>clsForm <\/b>gef&uuml;llt, wenn diese die Steuer-elemente des Formulars durchl&auml;uft und f&uuml;r jedes Steuer-element ein Objekt des Typs <b>clsControl <\/b>anlegt (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Control(ctl<span style=\"color:blue;\"> As <\/span>Control)\r\n     <span style=\"color:blue;\">Set<\/span> m_ctl = ctl\r\n     <span style=\"color:blue;\">Debug.Print<\/span> ctl.Name, ctl.Parent.Name\r\n     Select Case m_ctl.ControlType\r\n         <span style=\"color:blue;\">Case <\/span>acTextBox\r\n             <span style=\"color:blue;\">Set<\/span> txt = m_ctl\r\n             txt.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acCheckBox\r\n             <span style=\"color:blue;\">Set<\/span> chk = m_ctl\r\n             chk.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acComboBox\r\n             <span style=\"color:blue;\">Set<\/span> cbo = m_ctl\r\n             cbo.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acCommandButton\r\n             <span style=\"color:blue;\">Set<\/span> cmd = m_ctl\r\n             cmd.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acListBox\r\n             <span style=\"color:blue;\">Set<\/span> lst = m_ctl\r\n             lst.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acLabel\r\n             <span style=\"color:blue;\">Set<\/span> lbl = m_ctl\r\n             lbl.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acOptionButton\r\n             <span style=\"color:blue;\">Set<\/span> opt = m_ctl\r\n             opt.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acOptionGroup\r\n             <span style=\"color:blue;\">Set<\/span> ogr = m_ctl\r\n             ogr.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acToggleButton\r\n             <span style=\"color:blue;\">Set<\/span> tgl = m_ctl\r\n             tgl.OnMouseDown = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">Case <\/span>acSubform\r\n             <span style=\"color:blue;\">Set<\/span> sfm = m_ctl\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> sfm.Form.HasModule<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Unterformular '\" & sfm.Form.Name & \"' hat kein Klassenmodul, daher werden \" _\r\n                     & \"Kontextmen&uuml;eintr&auml;ge nicht hinzugef&uuml;gt.\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objForm = <span style=\"color:blue;\">New<\/span> clsForm\r\n             <span style=\"color:blue;\">With<\/span> objForm\r\n                 .IsSubform = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Set<\/span> .Form = sfm.Form\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> m_ctl.ControlType\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Property Set-Prozedur f&uuml;r das Einstellen des Steuerelements der Klasse clsControl<\/span><\/b><\/p>\n<p>Den mit <b>ctl<\/b> &uuml;bergebenen Verweis auf das Steuer-element speichert die Prozedur in der Variablen <b>m_ctl<\/b>. Dann pr&uuml;ft sie den Typ des Steuerelements &uuml;ber die Eigenschaft <b>ControlType<\/b>. Abh&auml;ngig davon stellt sie eine der weiter oben vorgestellten Variablen auf das Steuer-element aus <b>m_ctl <\/b>ein. Wenn es sich beispielsweise um ein Textfeld handelt, wird die Variable <b>txt <\/b>mit dem Verweis aus <b>m_ctl <\/b>gef&uuml;llt, wenn es sich um ein Kontrollk&auml;stchen handelt, landet der Verweis aus <b>m_ctl <\/b>in der Variablen <b>chk <\/b>und so weiter.<\/p>\n<p>Eine etwas andere Behandlung erf&auml;hrt das Steuer-element, wenn es sich dabei um ein Unterformular handelt, das den Typ <b>acSubform <\/b>aufweist. In diesem Fall stellen wir zwar wiederum die Variable <b>sfm <\/b>auf den Wert von <b>m_ctl <\/b>ein. Danach pr&uuml;fen wir aber noch anhand der Eigenschaft <b>HasModule<\/b>, ob das Formular ein Klassenmodul hat. Falls nicht, geben wir eine Meldung aus, denn in diesem Fall k&ouml;nnen wir zwar das Kontextmen&uuml; erweitern, aber die daf&uuml;r implementierte Ereignisprozedur kann nur ausgel&ouml;st werden, wenn das als Unterformular verwendete Formular auch ein Klassenmodul enth&auml;lt.<\/p>\n<p>Wenn ein Klassenmodul vorhanden ist, erstellen wir ein neues Element des Typs <b>clsForm<\/b>, dem wir &uuml;ber die Eigenschaft <b>IsSubform <\/b>den Wert <b>True <\/b>zuweisen, da es sich um ein Unterformular handelt. Au&szlig;erdem stellen wir die Eigenschaft <b>Form <\/b>auf das in <b>sfm <\/b>enthaltene Formular ein.<\/p>\n<p>Dadurch, dass wir das erledigen, wird in der Klasse <b>clsForm<\/b>, die das Unterformular aufnimmt, auch wieder die <b>For Each<\/b>-Schleife &uuml;ber alle Steuerelemente ausgef&uuml;hrt, um die im Unterformular enthaltenen Steuer-elemente mit den entsprechenden Kontextmen&uuml;-Eintr&auml;gen auszustatten. Sollte das Unterformular weitere Unterformulare enthalten, setzt sich dies entsprechend fort.<\/p>\n<p><b>Ereignisprozeduren f&uuml;r die Steuer-elemente<\/b><\/p>\n<p>Da wir das mit <b>ctl <\/b>&uuml;bergebene Steuer-element einer der Steuerelement-spezifischen Variablen <b>cbo<\/b>, <b>chk<\/b>, <b>cmd<\/b>, <b>lbl <\/b>und so weiter &uuml;bergeben, die ihrerseits mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert wurden, und wir nicht vorher wissen, in welcher der Variablen das Steuerelement landet, m&uuml;ssen wir auch f&uuml;r jedes dieser Steuer-elemente die <b>Bei Maustaste ab<\/b>-Ereignisprozedur implementieren. Das sieht dann wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbo_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>chk_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmd_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>lbl_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>lst_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>ogr_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>opt_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>tgl_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txt_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     KontextmenueAnzeigen Button, Shift, X, Y\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Zum Gl&uuml;ck sehen die in diesen Prozeduren ausgef&uuml;hrten Anweisungen wieder gleich aus, sodass wir diese in einer einzigen Prozedur zusammenfassen und diese von allen Ereignisprozeduren aus aufrufen k&ouml;nnen.<\/p>\n<p>Die dort aufgerufene Prozedur <b>KontextmenueAnzeigen <\/b>finden Sie in Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KontextmenueAnzeigen(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;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">If <\/span>Button = acRightButton<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>m_ctl.Parent.DefaultView = acCurViewDatasheet<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form Datasheet Cell\")\r\n             amvControlsLoeschen cbr\r\n             PropertyHinzufuegen cbr, \"Formular: \", m_ctl.Parent.Properties(\"Name\"), <span style=\"color:blue;\">True<\/span>\r\n             PropertyHinzufuegen cbr, \"Datensatzquelle: \", m_ctl.Parent.Properties(\"Recordsource\")\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Select Case m_ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acComboBox, acTextBox, acToggleButton, acOptionButton, acOptionGroup, acListBox, acCheckBox\r\n                     <span style=\"color:blue;\">If <\/span>m_IsSubform<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Subform Control\")\r\n                     <span style=\"color:blue;\">Else<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Control\")\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>acCommandButton\r\n                     <span style=\"color:blue;\">If <\/span>m_IsSubform<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Subform\")\r\n                     <span style=\"color:blue;\">Else<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View popup\")\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> m_ctl.ControlType\r\n                     <span style=\"color:blue;\">Exit Sub<\/span>\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n             amvControlsLoeschen cbr\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         PropertyHinzufuegen cbr, \"Name\", m_ctl.Properties(\"Name\"), <span style=\"color:blue;\">True<\/span>\r\n         PropertiesHinzufuegen cbr\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Prozedur KontextmenueAnzeigen<\/span><\/b><\/p>\n<p>Der Prozedur &uuml;bergeben wir alle Parameter, die auch den jeweiligen Ereignisprozeduren zur Verf&uuml;gung stehen. Wir ben&ouml;tigen allerdings nur den ersten Parameter <b>Button<\/b>, um zu pr&uuml;fen, ob der Benutzer die linke oder die rechte Maustaste gedr&uuml;ckt hat.<\/p>\n<p>Wir deklarieren hier wieder eine Variable namens <b>cbr <\/b>f&uuml;r das <b>CommandBar<\/b>-Objekt. Falls der Benutzer die rechte Schaltfl&auml;che angeklickt hat, f&uuml;hrt die Prozedur die in der ersten <b>If&#8230;Then<\/b>-Bedingung enthaltenen Anweisungen aus.<\/p>\n<p>Dann pr&uuml;ft die Prozedur wieder, in welchem Kontext der Benutzer die rechte Maustaste angeklickt hat, denn davon h&auml;ngt wiederum ab, welches Kontextmen&uuml; uns Access pr&auml;sentiert. Und das m&uuml;ssen wir wissen, wenn wir dieses um die ben&ouml;tigten Eintr&auml;ge erweitern wollen. Als Erstes pr&uuml;fen wir, ob das Formular in der Datenblattansicht ge&ouml;ffnet ist oder nicht. Falls ja, folgt der <b>If<\/b>-Teil der zweiten <b>If&#8230;Then<\/b>-Bedingung. Hier referenziert die Prozedur das Kontextmen&uuml; <b>Form Datasheet Cell<\/b> mit der Variablen <b>cbr<\/b>. Dann l&ouml;scht es durch einen Aufruf der Prozedur <b>amvControlsLoeschen <\/b>alle Elemente, die in der Eigenschaft <b>Tag <\/b>den Wert <b>amv <\/b>enthalten. Diese Prozedur sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>amvControlsLoeschen(cbr<span style=\"color:blue;\"> As <\/span>CommandBar)\r\n     <span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>CommandBarControl\r\n     For Each cbc In cbr.Controls\r\n         <span style=\"color:blue;\">If <\/span>cbc.Tag = \"amv\"<span style=\"color:blue;\"> Then<\/span>\r\n             cbc.Delete\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> cbc\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies ist eine Alternative zu der in der Klasse <b>clsForm <\/b>verwendeten Methode zum L&ouml;schen der bereits zuvor angelegten Elemente im Kontextmen&uuml;. Damit diese funktioniert, m&uuml;ssen wir die Elemente nat&uuml;rlich auch um den Wert <b>amv <\/b>f&uuml;r die <b>Tag<\/b>-Eigenschaft erg&auml;nzen &#8211; was wir gleich tun.<\/p>\n<p>Die Prozedur <b>KontextmenueAnzeigen <\/b>ruft dann die Prozedur <b>PropertyHinzufuegen <\/b>auf und &uuml;bergibt dieser einen Verweis auf das <b>CommandBar<\/b>-Element, den Namen des Formulars sowie den Wert <b>True <\/b>daf&uuml;r, dass eine neue Gruppe im <b>CommandBar <\/b>angefangen werden soll. Diese wird durch einen Trennstrich vom vorherigen Element getrennt. Diese Prozedur stellen wir weiter unten vor. <\/p>\n<p>Die Prozedur wird danach erneut aufgerufen, diesmal &uuml;bergeben wir die Angabe der Datensatzquelle als Text des anzulegenden Elements. Warum aber &uuml;bergeben wir hier &uuml;berhaupt den Formularnamen und die Datensatzquelle, obwohl wir ja eigentlich ein Steuerelement und seine Eigenschaften zum Kontextmen&uuml; hinzuf&uuml;gen wollen Weil wir in einem Formular oder Unterformular in der Datenblattansicht keine andere f&uuml;r den Benutzer offensichtliche M&ouml;glichkeit haben, das Formular anzuklicken &#8211; und weil die Angabe, wie das Unterformular hei&szlig;t und welche Datenquelle es enth&auml;lt, manchmal sehr wichtig sein kann.<\/p>\n<p>Falls es sich bei dem Formular nicht um ein Formular in der Datenblattansicht handelt, m&uuml;ssen wir pr&uuml;fen, um welchen Steuerelementtyp es sich handelt. Interessanterweise zeigt Access f&uuml;r ein Steuer-element des Typs <b>acCommandButton <\/b>das Kontextmen&uuml; <b>Form View Control <\/b>an und f&uuml;r alle anderen Steuer-elemente <b>Form View Popup<\/b>. In beiden F&auml;llen pr&uuml;fen wir auch noch, ob sich die Steuer-elemente in einem Unterformular befinden. Dann verwenden wir in beiden F&auml;llen das Kontextmen&uuml; namens <b>Form View Subform Control<\/b> f&uuml;r die Variable <b>cbr<\/b>.<\/p>\n<p>Auch hier l&ouml;schen wir die mit der Marke <b>amv <\/b>ausgezeichneten Elemente.<\/p>\n<p>Danach rufen wir die Prozedur <b>PropertyHinzufuegen <\/b>f&uuml;r das Element zur Anzeige des Namens des Steuerelements auf und schlie&szlig;lich die Prozedur <b>PropertiesHinzuf&uuml;gen <\/b>f&uuml;r die Eigenschaften des Steuerelements, die im Untermen&uuml; landen sollen.<\/p>\n<p><b>Eine Eigenschaft hinzuf&uuml;gen<\/b><\/p>\n<p>Die weiter oben angesprochene Prozedur <b>PropertyHinzuf&uuml;gen <\/b>finden Sie in Listing 5. Diese legt ein neues Element im Kontextmen&uuml; aus <b>cbr <\/b>an und referenziert dieses Element mit der Variablen <b>cbb<\/b>. Dann stellt sie die Eigenschaft <b>BeginGroup<\/b> auf den Wert des Parameters <b>bolBeginGroup <\/b>ein, die Eigenschaft <b>Caption <\/b>auf den Namen der Eigenschaft (aus <b>strProperty<\/b>) und den Wert der Eigenschaft (aus <b>strValue<\/b>) ein &#8211; getrennt durch einen Doppelpunkt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>PropertyHinzufuegen(cbr<span style=\"color:blue;\"> As <\/span>CommandBar, strProperty<span style=\"color:blue;\"> As String<\/span>, strValue<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> _\r\n         bolBeginGroup<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbb\r\n         .BeginGroup = bolBeginGroup\r\n         .Caption = strProperty & \": \" & strValue\r\n         .Tag = \"amv\"\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 5: Die Prozedur PropertyHinzufuegen<\/span><\/b><\/p>\n<p>Schlie&szlig;lich wird f&uuml;r die Eigenschaft <b>Tag <\/b>der Wert <b>amv <\/b>eingetragen, damit diese Elemente beim n&auml;chsten F&uuml;llen des Kontextmen&uuml;s wieder geleert werden k&ouml;nnen.<\/p>\n<p><b>Alle Eigenschaften eines Steuerelements hinzuf&uuml;gen<\/b><\/p>\n<p>Die Prozedur <b>PropertiesHinzufuegen <\/b>aus Listing 6 erwartet das zu bearbeitende CommandBar mit dem Parameter <b>cbr<\/b>. Sie deklariert die Variable <b>cbp <\/b>f&uuml;r das Untermen&uuml;, <b>prp <\/b>zum Durchlaufen der Steuerelement-Eigenschaften und <b>cbb <\/b>zum Anlegen der <b>CommandButton<\/b>-Elemente f&uuml;r die Anzeige der Eigenschaften samt der Werte.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>PropertiesHinzufuegen(cbr<span style=\"color:blue;\"> As <\/span>CommandBar)\r\n     <span style=\"color:blue;\">Dim <\/span>cbp<span style=\"color:blue;\"> As <\/span>CommandBarPopup\r\n     <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>DAO.Property\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Set<\/span> cbp = cbr.Controls.Add(msoControlPopup, , , , <span style=\"color:blue;\">True<\/span>)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> Err.Number = 0\r\n         cbr.Controls(\"Eigenschaften\").Delete\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     cbp.Caption = \"Eigenschaften\"\r\n     For Each prp In m_ctl.Properties\r\n         <span style=\"color:blue;\">Set<\/span> cbb = cbp.Controls.Add(msoControlButton, , , , <span style=\"color:blue;\">True<\/span>)\r\n         cbb.Tag = \"amv\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         cbb.Caption = prp.Name & \": \" & prp.Value\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span> prp\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Prozedur PropertiesHinzufuegen<\/span><\/b><\/p>\n<p>Dann legt sie zun&auml;chst das Untermen&uuml; an und referenziert es mit der Variablen <b>cbp<\/b>. Sie l&ouml;scht dann ein eventuell vorhandenes Element mit dem Namen <b>Eigenschaften <\/b>und f&uuml;llt das neue Untermen&uuml; mit eben diesem Text. Dann durchl&auml;uft sie alle Eigenschaften in einer <b>For Each<\/b>-Schleife und legt f&uuml;r jede Eigenschaft eine neue Schaltfl&auml;che im Untermen&uuml; an, die dann mit dem Namen und dem Wert der Eigenschaft gef&uuml;llt wird.<\/p>\n<p><b>Kontextmen&uuml;s zu Formular hinzuf&uuml;gen<\/b><\/p>\n<p>Bisher haben wir noch nicht dar&uuml;ber gesprochen, wie und wann wir die Kontextmen&uuml;s zu den Formularen und Steuerelementen hinzuf&uuml;gen wollen.<\/p>\n<p>Wenn wir bisher die Formulare und Steuerelemente mit durch Klassen realisierten Elementen oder Ereignissen versehen haben, geschah dies meist in der Ereignisprozedur, die durch das Ereignis beim Laden ausgel&ouml;st wurde.<\/p>\n<p>Das w&uuml;rde dann im Klassenmodul des Formulars wie folgt aussehen. Als Erstes deklarieren wir eine Variable, welche die Instanz der Klasse <b>clsForm <\/b>aufnimmt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objForm<span style=\"color:blue;\"> As <\/span>clsForm<\/pre>\n<p>Dann f&uuml;llen wir die Ereignisprozedur <b>Form_Load <\/b>mit den folgenden Anweisungen, die daf&uuml;r sorgen, dass das Objekt <b>objForm <\/b>erstellt und mit einem Verweis auf das Formular gef&uuml;llt wird:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objForm = <span style=\"color:blue;\">New<\/span> clsForm\r\n     <span style=\"color:blue;\">With<\/span> objForm\r\n         <span style=\"color:blue;\">Set<\/span> .Form = Screen.ActiveForm\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das k&ouml;nnte man so machen, aber in der Regel will man die Kontextmen&uuml;s zum schnellen Ausgeben der Formular- und Steuerelementeigenschaften nicht dauerhaft im Formular haben.<\/p>\n<p><b>Kontextmen&uuml;s per Add-In<\/b><\/p>\n<p>Daher haben wir uns eine andere L&ouml;sung &uuml;berlegt: Wir f&uuml;gen die Kontextmen&uuml;s &uuml;ber ein Add-In zum aktuellen Formular hinzu, indem wir die entsprechende Add-In-Funktion aufrufen, wenn das Formular angezeigt wird! Also &auml;ndern wir die Dateiendung von <b>.accdb <\/b>auf <b>.accda<\/b>.<\/p>\n<p>Dann f&uuml;gen wir eine <b>Autostart<\/b>-Funktion zu einem Standardmodul hinzu, die wie in Listing 7 aussieht. Diese pr&uuml;ft ob bei Aufruf der Funktion ein Formular ge&ouml;ffnet ist. Falls nicht, gibt sie eine entsprechende Meldung aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart()\r\n     <span style=\"color:blue;\">If <\/span>Screen.ActiveForm Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte &ouml;ffnen Sie zun&auml;chst das Formular, das Sie analysieren wollen.\", vbOKOnly + vbExclamation, _\r\n             \"amvAnalysierenPerKontextmen&uuml; - Kein Formular ge&ouml;ffnet\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         FormularAnalysierenPerKontextmenue\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Autostart-Funktion des Add-Ins<\/span><\/b><\/p>\n<p>Anderenfalls ruft sie die Prozedur <b>FormularAnalysierenPerKontextmenue <\/b>auf, die so aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularAnalysierenPerKontextmenue()\r\n     <span style=\"color:blue;\">Set<\/span> objForm = <span style=\"color:blue;\">New<\/span> clsForm\r\n     <span style=\"color:blue;\">With<\/span> objForm\r\n         <span style=\"color:blue;\">Set<\/span> .Form = Screen.ActiveForm\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur enth&auml;lt also die gleichen Anweisungen, die wir auch der Ereignisprozedur <b>Form_Load <\/b>hinzugef&uuml;gt h&auml;tten.<\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen wir in diesem Standardmodul auch noch die Variable f&uuml;r die Instanz der Klasse <b>clsForm<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objForm<span style=\"color:blue;\"> As <\/span>clsForm<\/pre>\n<p>Damit das Add-In nun installiert werden kann, m&uuml;ssen wir diesem noch eine Tabelle namens <b>USysRegInfo <\/b>hinzuf&uuml;gen. Diese enth&auml;lt die Daten aus Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1245_004.png\" alt=\"Die Tabelle USysRegInfo f&uuml;r die Installation des Add-Ins\" width=\"649,559\" height=\"765,222\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle USysRegInfo f&uuml;r die Installation des Add-Ins<\/span><\/b><\/p>\n<p>Die ersten vier Datens&auml;tze dienen der Installation der hier vorgestellten Funktion. Die zweiten vier f&uuml;gen einen weiteren Eintrag zum Add-In-Men&uuml; hinzu, mit der wir die Funktion <b>Autostart_NameZuKontextmenue <\/b>aufrufen. Diese ruft die weiter oben vorgestellten Prozedur zum Hinzuf&uuml;gen des Namens eines Kontextmen&uuml;s zum jeweiligen Kontextmen&uuml; auf:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart_NameZuKontextmenue()\r\n     ButtonMitNameZuKontextmenuesHinzufuegen\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die dritten vier Zeilen der Tabelle f&uuml;gen ein drittes Add-in zur Liste hinzu, das die Kontextmen&uuml;s komplett zur&uuml;cksetzt, also in den Zustand bei Installation von Access (siehe <b>mdlAnalysierenPerKontextmenue<\/b>).<\/p>\n<p>Damit kann das Add-In nun installiert werden. Dazu rufen Sie den Add-In-Manager &uuml;ber den Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>auf. Hier w&auml;hlen Sie den Befehl <b>Neues hinzuf&uuml;gen <\/b>aus und w&auml;hlen die Datei <b>FormulareAnalysierenPerKontextmenue.accda<\/b> aus dem Download zu diesem Artikel aus.<\/p>\n<p>Danach finden Sie in der Liste der Add-Ins drei neue Eintr&auml;ge vor, mit denen Sie die neuen Funktionen aufrufen k&ouml;nnen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1245_005.png\" alt=\"Add-Ins in der Add-In-Liste\" width=\"424,7115\" height=\"282,7827\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Add-Ins in der Add-In-Liste<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieses Add-In erlaubt Ihnen das schnelle Anzeigen von Formular- und Steuerelementeigenschaften zur Laufzeit. Sie k&ouml;nnen das Add-In beliebig erweitern &#8211; zum Beispiel, um mit einem neuen Befehl ein Formular mit den Eigenschaften des Formulars oder Steuerelements auszugeben. In diesem k&ouml;nnen Sie dann beispielsweise das &Auml;ndern der Eigenschaften zur Laufzeit anbieten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormulareAnalysierenPerKontextmenue.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/A4F4C474-6E3F-4023-89C2-037C952F3D15\/aiu_1245.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie selbst eine Anwendung programmieren und ein Formular nicht so funktioniert wie gew&uuml;nscht, wissen Sie, wie die Steuer-elemente hei&szlig;en, an welche Datenquellen sie gebunden sind und so weiter. Vielleicht ist die Entwicklung der Anwendung auch etwas l&auml;nger her und Sie m&uuml;ssen sich erst wieder einarbeiten &#8211; oder Sie erhalten von einem Kunden eine Anwendung mit der Bitte, dort eine Funktion in einem Formular zu &uuml;berpr&uuml;fen. In den beiden letzteren F&auml;llen ist es recht m&uuml;hsam, zwischen Formular- und Entwurfsansicht zu wechseln, um Steuerelementnamen, Datenherk&uuml;nfte und andere Informationen herauszufinden, die zur L&ouml;sung des Problems beitragen k&ouml;nnten. Der vorliegende Beitrag zeigt, wie Sie ein Formular schnell mithilfe eines zur Laufzeit hinzugef&uuml;gten Kontextmen&uuml;s analysieren k&ouml;nnen, um schneller L&ouml;sungen zu finden.<\/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":[662020,66042020,44000023],"tags":[],"class_list":["post-55001245","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Formulare zur Laufzeit analysieren - 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\/Formulare_zur_Laufzeit_analysieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formulare zur Laufzeit analysieren\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie selbst eine Anwendung programmieren und ein Formular nicht so funktioniert wie gew&uuml;nscht, wissen Sie, wie die Steuer-elemente hei&szlig;en, an welche Datenquellen sie gebunden sind und so weiter. Vielleicht ist die Entwicklung der Anwendung auch etwas l&auml;nger her und Sie m&uuml;ssen sich erst wieder einarbeiten - oder Sie erhalten von einem Kunden eine Anwendung mit der Bitte, dort eine Funktion in einem Formular zu &uuml;berpr&uuml;fen. In den beiden letzteren F&auml;llen ist es recht m&uuml;hsam, zwischen Formular- und Entwurfsansicht zu wechseln, um Steuerelementnamen, Datenherk&uuml;nfte und andere Informationen herauszufinden, die zur L&ouml;sung des Problems beitragen k&ouml;nnten. Der vorliegende Beitrag zeigt, wie Sie ein Formular schnell mithilfe eines zur Laufzeit hinzugef&uuml;gten Kontextmen&uuml;s analysieren k&ouml;nnen, um schneller L&ouml;sungen zu finden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-05T10:30:10+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db\" \/>\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=\"24\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Formulare zur Laufzeit analysieren\",\"datePublished\":\"2020-08-05T10:30:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/\"},\"wordCount\":3682,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2f10c0406fa443d1a60f0191864670db\",\"articleSection\":[\"2020\",\"4\\\/2020\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/\",\"name\":\"Formulare zur Laufzeit analysieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2f10c0406fa443d1a60f0191864670db\",\"datePublished\":\"2020-08-05T10:30:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2f10c0406fa443d1a60f0191864670db\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2f10c0406fa443d1a60f0191864670db\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formulare_zur_Laufzeit_analysieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formulare zur Laufzeit analysieren\"}]},{\"@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":"Formulare zur Laufzeit analysieren - 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\/Formulare_zur_Laufzeit_analysieren\/","og_locale":"de_DE","og_type":"article","og_title":"Formulare zur Laufzeit analysieren","og_description":"Wenn Sie selbst eine Anwendung programmieren und ein Formular nicht so funktioniert wie gew&uuml;nscht, wissen Sie, wie die Steuer-elemente hei&szlig;en, an welche Datenquellen sie gebunden sind und so weiter. Vielleicht ist die Entwicklung der Anwendung auch etwas l&auml;nger her und Sie m&uuml;ssen sich erst wieder einarbeiten - oder Sie erhalten von einem Kunden eine Anwendung mit der Bitte, dort eine Funktion in einem Formular zu &uuml;berpr&uuml;fen. In den beiden letzteren F&auml;llen ist es recht m&uuml;hsam, zwischen Formular- und Entwurfsansicht zu wechseln, um Steuerelementnamen, Datenherk&uuml;nfte und andere Informationen herauszufinden, die zur L&ouml;sung des Problems beitragen k&ouml;nnten. Der vorliegende Beitrag zeigt, wie Sie ein Formular schnell mithilfe eines zur Laufzeit hinzugef&uuml;gten Kontextmen&uuml;s analysieren k&ouml;nnen, um schneller L&ouml;sungen zu finden.","og_url":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-08-05T10:30:10+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"24\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Formulare zur Laufzeit analysieren","datePublished":"2020-08-05T10:30:10+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/"},"wordCount":3682,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db","articleSection":["2020","4\/2020","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/","url":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/","name":"Formulare zur Laufzeit analysieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db","datePublished":"2020-08-05T10:30:10+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2f10c0406fa443d1a60f0191864670db"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Formulare_zur_Laufzeit_analysieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Formulare zur Laufzeit analysieren"}]},{"@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\/55001245","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=55001245"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001245\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}