{"id":55001492,"date":"2024-04-01T00:00:00","date_gmt":"2024-02-02T09:42:11","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1492"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"TreeView_Bug_durch_falsche_Einheiten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/","title":{"rendered":"TreeView: Bug durch falsche Einheiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn man das TreeView-Steuerelement professioneller nutzt, programmiert man unter anderem Ereignisse, die durch das Anklicken von Elementen ausgel&ouml;st werden. Damit kann man Ereignisprozeduren ausl&ouml;sen, die beispielsweise Daten zum angeklickten Element in einem Unterformular anzeigen oder man blendet ein Kontextmen&uuml; zum jeweils angeklickten Element mit weiteren Optionen ein. Dazu ist es notwendig, zu identifizieren, auf welches Element der Benutzer geklickt hat. Die notwendigen Informationen liefern die Parameter der Prozeduren, das Ermitteln des angeklickten Elements erledigt man mit einer bestimmten Funktion. Seit Kurzem erreichen uns allerdings Meldungen von Lesern, bei denen dies nicht mehr zuverl&auml;ssig funktioniert: Es werden keine Kontextmen&uuml;s mehr angezeigt und auch das Anklicken gelingt nicht mehr wie gew&uuml;nscht. Interessanterweise tritt das Problem nur bei Verwendung von Office 365 auf. Wir schauen uns in diesem Beitrag an, woher das Problem r&uuml;hrt und wie Sie es l&ouml;sen k&ouml;nnen.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>F&uuml;r die folgenden Experimente legen wir in einem neuen, leeren Formular einfach ein <b>TreeView<\/b>-Steuerelement namens <b>ctlTreeView <\/b>an.<\/p>\n<p>Dazu w&auml;hlen wir im Ribbon den Befehl <b>Formularentwurf|Steuerelemente|ActiveX<\/b>-Steuerelemente aus (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_001.png\" alt=\"ActiveX-Steuerelement hinzuf&uuml;gen\" width=\"549,559\" height=\"334,0625\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: ActiveX-Steuerelement hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Dies &ouml;ffnet den Dialog <b>ActiveX-Steuerelement einf&uuml;gen<\/b>, wo wir den Eintrag <b>Microsoft TreeView Control, version 6.0 <\/b>ausw&auml;hlen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_002.png\" alt=\"TreeView-Steuerelement selektieren\" width=\"299,5588\" height=\"328,2956\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: TreeView-Steuerelement selektieren<\/span><\/b><\/p>\n<p>Danach sehen wir das neue <b>TreeView<\/b>-Steuerelement im Formular und passen seine Gr&ouml;&szlig;e entsprechend an (siehe Bild 3). Damit k&ouml;nnen wir zu den Feinheiten der Referenzierung und Programmierung &uuml;bergehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_003.png\" alt=\"TreeView-Steuerelement nach dem Einbau\" width=\"424,5589\" height=\"296,807\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: TreeView-Steuerelement nach dem Einbau<\/span><\/b><\/p>\n<p>Nach dem Einf&uuml;gen des <b>TreeView<\/b>-Steuerelements passen wir noch seinen Namen auf <b>ctlTreeView <\/b>an.<\/p>\n<h2>TreeView als Steuerelement oder als Objektvariable referenzieren<\/h2>\n<p>Es gibt zwei Wege, wie man ein <b>TreeView<\/b>-Steuerelement per VBA referenzieren kann. Der erste ist, dieses wie bei den eingebauten Steuerelementen einfach &uuml;ber das Schl&uuml;sselwort <b>Me <\/b>in Verbindung mit dem Steuerelementnamen zu referenzieren, hier also <b>ctlTreeView<\/b>. Wenn wir dies im VBA-Editor erledigen und einen weiteren Punkt anf&uuml;gen, um per IntelliSense auf die Methoden und Eigenschaften des <b>TreeView<\/b>-Steuerelements zuzugreifen, erhalten wir das Ergebnis aus Bild 4. Hier erkennen wir, dass wir nur die allgemeinen Eigenschaften von Steuerelementen anw&auml;hlen k&ouml;nnen, nicht jedoch die speziellen Elemente des TreeView-Steuerelements.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_004.png\" alt=\"Referenzieren des Steuerelements\" width=\"424,5589\" height=\"288,2686\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Referenzieren des Steuerelements<\/span><\/b><\/p>\n<p>Dazu m&uuml;ssen wir eine Objektvariable anlegen, die wir wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objTreeView<span style=\"color:blue;\"> As <\/span>MSCOMCTLLib.TreeView<\/pre>\n<p>Diese Variable f&uuml;llen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objTreeView = Me!ctlTreeView.Object<\/pre>\n<p>Wir k&ouml;nnen das <b>TreeView<\/b>-Steuerelement nicht direkt &uuml;ber <b>Me!ctlTreeView <\/b>referenzieren, weil wir damit nur die H&uuml;lle des Steuerelements referenzieren w&uuml;rden. Diese hat den Datentyp <b>CustomControl<\/b>. Dies k&ouml;nnen wir belegen, indem wir zuerst den Typ von <b>ctlTreeView <\/b>ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TypeName(Me!ctlTreeView)\r\nCustomControl<\/pre>\n<p>Erst &uuml;ber das <b>Object<\/b>-Element erhalten wir den gesuchten Typ:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TypeName(Me!ctlTreeView.Object)\r\nTreeView<\/pre>\n<p>Mit der Referenzierung &uuml;ber die Objektvariable <b>objTreeView<\/b> erhalten wir schlie&szlig;lich auch die <b>TreeView<\/b>-spezifischen Eigenschaften und Methoden per IntelliSense (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_005.png\" alt=\"Referenzieren des TreeView-Steuerelements per Objektvariable\" width=\"424,5589\" height=\"313,5504\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Referenzieren des TreeView-Steuerelements per Objektvariable<\/span><\/b><\/p>\n<p>Sie sehen: Ein Grund, das <b>TreeView<\/b>-Steuerelement nicht &uuml;ber das als Container verwendete Steuerelement <b>CustomControl<\/b>, sondern &uuml;ber das darin enthaltene <b>TreeView<\/b>-Steuerelement zu referenzieren, erlaubt den Zugriff auf die Eigenschaften und Methoden per IntelliSense.<\/p>\n<h2>Verwendung von Ereignissen<\/h2>\n<p>Wir wollen exemplarisch das Ereignis <b>MouseDown <\/b>verwenden, weil es das Problem verdeutlicht. Wir k&ouml;nnen das Ereignis auf zwei Arten in Form einer Ereignisprozedur implementieren. Bei der ersten verwenden wir die Ereignisse des Steuerelements <b>ctlTreeView<\/b>. Um das Ereignis anzulegen, w&auml;hlen wir im Codefenster des Klassenmoduls des Formulars oben links den Eintrag f&uuml;r das <b>TreeView<\/b>-Steuerelement <b>ctlTreeView <\/b>aus und aus der nun aufgeklappten Liste auf der rechten Seite den Eintrag <b>MouseDown<\/b>. Die automatisch hinzugef&uuml;gte Ereignisprozedur <b>ctlTreeView_Updated <\/b>k&ouml;nnen wir wieder l&ouml;schen (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_006.png\" alt=\"Anlegen des MouseDown-Ereignisses f&uuml;r ctlTreeView\" width=\"649,559\" height=\"333,1266\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen des MouseDown-Ereignisses f&uuml;r ctlTreeView<\/span><\/b><\/p>\n<p>Die neue Ereignisprozedur hat die folgende Signatur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlTreeView_MouseDown( _\r\n     ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n     ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n     ByVal x<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal y<span style=\"color:blue;\"> As Long<\/span>)<\/pre>\n<p><b>Button <\/b>liefert einen Hinweis, ob die linke oder rechte Maustaste gedr&uuml;ckt wurde, <b>Shift <\/b>gibt an, ob eine der Tasten <b>Alt<\/b>, <b>Strg <\/b>oder <b>Umschalt <\/b>beim Bet&auml;tigen der Maustaste gehalten wurde.<\/p>\n<p>Mit <b>x <\/b>und <b>y <\/b>erhalten wir die Koordinaten, an denen der Mausklick erfolgte. Wie es unter Access &uuml;blich ist, werden diese Koordinaten im Format <b>Twips <\/b>geliefert.<\/p>\n<h2>Ereignis f&uuml;r die Objektvariable anlegen<\/h2>\n<p>Wir k&ouml;nnen das Ereignis allerdings auch f&uuml;r die oben vorgestellte Objektvariable <b>objTreeView <\/b>anlegen. Dazu m&uuml;ssen wir die Deklaration dieser Variablen nur aus der Prozedur <b>Form_Load <\/b>herausholen und in den allgemeinen Teil des Moduls verschieben (siehe Bild 7). Au&szlig;erdem f&uuml;gen wir das Schl&uuml;sselwort <b>WithEvents <\/b>hinzu, damit der VBA-Editor wei&szlig;, dass wir in diesem Klassenmodul Ereignisse f&uuml;r dieses Element implementieren k&ouml;nnen wollen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_007.png\" alt=\"&Auml;nderung der Deklaration von objTreeView\" width=\"424,5589\" height=\"172,3911\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: &Auml;nderung der Deklaration von objTreeView<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir nun wie zuvor f&uuml;r <b>ctlTreeView<\/b> auch f&uuml;r <b>objTreeView <\/b>die Ereignisse &uuml;ber die Auswahlfelder oben im Codefenster hinzuf&uuml;gen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_008.png\" alt=\"Anlegen des MouseDown-Ereignisses f&uuml;r die Objektvariable objTreeView\" width=\"649,559\" height=\"283,8026\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Anlegen des MouseDown-Ereignisses f&uuml;r die Objektvariable objTreeView<\/span><\/b><\/p>\n<p>Das erledigen wir wie zuvor und sehen uns dann die Signatur des <b>MouseDown<\/b>-Ereignisses f&uuml;r die Objektvariable <b>objTreeView <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objTreeView_MouseDown( _\r\n     ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n     ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n     ByVal x<span style=\"color:blue;\"> As <\/span>stdole.OLE_XPOS_PIXELS, _\r\n     ByVal y<span style=\"color:blue;\"> As <\/span>stdole.OLE_YPOS_PIXELS)<\/pre>\n<p>Die Signatur ist bez&uuml;glich der Anzahl und der Benennung der Elemente identisch, jedoch unterscheidet sich der Datentyp bei den Parametern <b>x <\/b>und <b>y<\/b>. W&auml;hrend wir es zuvor mit <b>Long<\/b>-Werten zu tun hatten, finden wir nun den Datentyp <b>stdole.OLOE_XPOS_PIXELS <\/b>vor. Lassen wir uns innerhalb dieses Ereignisse jedoch einmal den Datentyp mit <b>Typename<\/b> ausgeben, erhalten wir hier ebenfalls <b>Long <\/b>als Datentyp. Allerdings sehen wir, dass der Datentyp die Zeichenkette <b>PIXELS <\/b>enth&auml;lt, war darauf hindeutet, dass hier nicht Twips wie bei der gleichnamigen Ereignisprozedur f&uuml;r das Steuerelement geliefert werden, sondern Pixel.<\/p>\n<p>Die Frage ist nun: Ist das auch der Fall?<\/p>\n<p>Dazu f&uuml;gen wir dem Formular vier Textfelder namens <b>txtCtlX<\/b>, <b>txtCtlY<\/b>, <b>txtObjX <\/b>und <b>txtObjY <\/b>hinzu (siehe Bild 9). Die Textfelder f&uuml;llen wir beim Ausl&ouml;sen der Ereignisprozeduren beim Ereignis <b>MouseDown <\/b>mit den Werten f&uuml;r die Parameter <b>x <\/b>und <b>y<\/b>:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_009.png\" alt=\"Steuerelemente zum Anzeigen der x- und y-Werte f&uuml;r die beiden Ereignisprozeduren\" width=\"424,5589\" height=\"381,3345\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Steuerelemente zum Anzeigen der x- und y-Werte f&uuml;r die beiden Ereignisprozeduren<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlTreeView_MouseDown(_\r\n     ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         ByVal x<span style=\"color:blue;\"> As Long<\/span>, ByVal y<span style=\"color:blue;\"> As Long<\/span>)\r\n     Me!txtCtlX = x\r\n     Me!txtCtlY = y\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>objTreeView_MouseDown( _\r\n         ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         ByVal x<span style=\"color:blue;\"> As <\/span>stdole.OLE_XPOS_PIXELS, _\r\n         ByVal y<span style=\"color:blue;\"> As <\/span>stdole.OLE_YPOS_PIXELS)\r\n     Me!txtObjX = x\r\n     Me!txtObjY = y\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und hier wird es spannend: Unter Access in der Version von Office 365 erhalten wir f&uuml;r beide Ereignisprozeduren beim einem Klick in die rechte, untere Ecke unterschiedliche Werte f&uuml;r die Parameter <b>x <\/b>und <b>y<\/b> (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_010.png\" alt=\"Ergebnis beim Anklicken unter Office 365\" width=\"424,5589\" height=\"328,5049\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Ergebnis beim Anklicken unter Office 365<\/span><\/b><\/p>\n<p>Das Ereignis f&uuml;r <b>ctlTreeView <\/b>liefert die Werte in der Einheit <b>Twips<\/b>, das Ereignis f&uuml;r <b>objTreeView <\/b>in der Einheit <b>Pixel<\/b>.<\/p>\n<p>Richtig interessant wird es, wenn wir das gleiche Formular in Access 2010 &ouml;ffnen (Gleiches gilt f&uuml;r Access 2013 und 2016). Hier erhalten wir f&uuml;r das Ereignis <b>MouseOver<\/b> des Steuerelements <b>ctlTreeView <\/b>und der Objektvariablen <b>objTreeView <\/b>beim Anklicken des Steuerelements in der rechten, unteren Ecke alle Werte in der Einheit <b>Twips<\/b> (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_011.png\" alt=\"Ergebnis beim Anklicken unter Access 2010\" width=\"424,5589\" height=\"357,4193\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Ergebnis beim Anklicken unter Access 2010<\/span><\/b><\/p>\n<p>Aber warum sollte das ein Problem sein? Das schauen wir uns im Anschluss an.<\/p>\n<h2>Probleme durch unterschiedliche Einheiten<\/h2>\n<p>Wir f&uuml;llen nun das <b>TreeView<\/b>-Steuerelement beim Laden des Formulars mit drei einfachen <b>Node<\/b>-Elementen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objTreeView = Me!ctlTreeView.Object\r\n     objTreeView.Nodes.Add , , \"t1\", \"Test1\"\r\n     objTreeView.Nodes.Add , , \"t2\", \"Test2\"\r\n     objTreeView.Nodes.Add , , \"t3\", \"Test3\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Implementierung von Ereignisprozeduren mit den Parametern <b>x <\/b>und <b>y <\/b>basiert meist darauf, dass man irgendeine Aktion auf Basis des  Elements durchf&uuml;hren m&ouml;chte, &uuml;ber dem sich gerade der Mauszeiger befindet. Das betrifft die folgenden Ereignisse:<\/p>\n<ul>\n<li><b>MouseDown<\/b><\/li>\n<li><b>MouseMove<\/b><\/li>\n<li><b>MouseUp<\/b><\/li>\n<li><b>OLEDragDrop<\/b><\/li>\n<li><b>OLEDragOver<\/b><\/li>\n<\/ul>\n<p>Hier ist es essenziell, dass wir &uuml;ber die Koordinaten <b>x <\/b>und <b>y <\/b>das richtige Element referenzieren. Wie aber k&ouml;nnen wir die Koordinaten dazu nutzen?<\/p>\n<p>Dazu verwenden wir die Funktion <b>HitTest <\/b>des <b>TreeView<\/b>-Steuerelements, die wiederum die Parameter <b>x <\/b>und <b>y <\/b>erwartet und einen Verweis auf das <b>Node<\/b>-Element zur&uuml;ckgibt, das sich unter diesen Koordinaten befindet.<\/p>\n<p>Um auszugeben, welchen Node der Benutzer anklickt, f&uuml;gen wir dem Formular zwei weitere Textfelder namens <b>txtCtlNode <\/b>und <b>txtObjNode <\/b>hinzu (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_012.png\" alt=\"Steuerelemente zum Anzeigen der angeklickten Node-Elemente\" width=\"424,5589\" height=\"411,3549\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Steuerelemente zum Anzeigen der angeklickten Node-Elemente<\/span><\/b><\/p>\n<p>Die Prozedur <b>ctlTreeView_MouseDown <\/b>erg&auml;nzen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlTreeView_MouseDown(..., _\r\n         ByVal x<span style=\"color:blue;\"> As Long<\/span>, ByVal y<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     Me!txtCtlX = x\r\n     Me!txtCtlY = y\r\n     <span style=\"color:blue;\">Set<\/span> objNode = ctlTreeView.HitTest(x, y)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtCtlNode = objNode.Text\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtCtlNode = Null\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir versuchen, mit <b>ctlTreeView.HitTest <\/b>das angeklickte Element zu referenzieren und schreiben seinen Text in das Textfeld <b>txtCtlNode<\/b>.<\/p>\n<p>Die Prozedur f&uuml;r das Ereignis <b>objTreeView_MouseDown <\/b>gestalten wir analog: <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objTreeView_MouseDown(..., _\r\n         ByVal x<span style=\"color:blue;\"> As <\/span>stdole.OLE_XPOS_PIXELS, _\r\n         ByVal y<span style=\"color:blue;\"> As <\/span>stdole.OLE_YPOS_PIXELS)\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     Me!txtObjX = x\r\n     Me!txtObjY = y\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.HitTest(x, y)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtObjNode = objNode.Text\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtObjNode = Null\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Klicken wir nun unter Access in der Office 365-Version das erste <b>Node<\/b>-Element an, erhalten wir das erwartete Ergebnis. Ein Klick auf das <b>Node<\/b>-Element mit dem Text <b>Text2 <\/b>liefert allerdings bereits eine Abweichung (siehe Bild 13). <b>ctlTreeView <\/b>liefert korrekterweise den Verweis auf <b>Text2 <\/b>zur&uuml;ck, <b>objTreeView <\/b>liefert <b>Text1<\/b>. Wie kann das sein?<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_013.png\" alt=\"Auswertung des angeklickten Node-Elements mit HitTest\" width=\"424,5589\" height=\"411,3549\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Auswertung des angeklickten Node-Elements mit HitTest<\/span><\/b><\/p>\n<p>Untersuchen wir die gleiche Datenbank unter Access 2010, erhalten wir das Ergebnis aus Bild 14 &#8211; hier ist also alles korrekt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_014.png\" alt=\"Das gleiche Experiment unter Access 2010\" width=\"424,5589\" height=\"357,4193\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Das gleiche Experiment unter Access 2010<\/span><\/b><\/p>\n<h2>Interpretation<\/h2>\n<p>Fassen wir die Beobachtungen zusammen, finden wir zun&auml;chst einmal:<\/p>\n<ul>\n<li>Microsoft hat die Einheit f&uuml;r die Parameter <b>x <\/b>und <b>y <\/b>der <b>MouseMove<\/b>-Methode f&uuml;r die Klasse <b>MSCOMCTLLib.TreeView <\/b>in unter Office 365 in Pixel ge&auml;ndert.<\/li>\n<li>Offensichtlich wurde auch die Einheit der Parameter <b>x <\/b>und <b>y <\/b>der Funktion <b>HitTest <\/b>der <b>MSCOMCTLLib.TreeView<\/b>-Steuerelements jedoch auf Twips beibehalten, sodass diese f&uuml;r die mit den Parametern x und y gelieferten Daten nicht mehr korrekt funktioniert.<\/li>\n<li>Wenn wir jedoch Ereignisse wie <b>MouseMove <\/b>f&uuml;r das <b>TreeView<\/b>-Steuerelement selbst implementieren, also f&uuml;r <b>ctlTreeView<\/b>, wird nach wie vor Twips als Einheit f&uuml;r <b>x <\/b>und <b>y <\/b>verwendet. Da die <b>HitTest<\/b>-Funktion auch diese Einheit verwendet, funktioniert das Ermitteln des angeklickten Elements hier wie gew&uuml;nscht.<\/li>\n<\/ul>\n<p>All diese Beobachtungen gelten f&uuml;r Access in der Version aus Office 365. In &auml;lteren Versionen werden die Parameter <b>x <\/b>und <b>y <\/b>jeweils in der Einheit Twips geliefert und verarbeitet.<\/p>\n<p>Dass <b>HitTest <\/b>der Klasse <b>MSCOMCTLLib.TreeView <\/b>noch mit Twips arbeitet, kann man testen, indem man der Prozedur <b>ctlTreeView_MouseDown <\/b>die folgende Zeile hinzuf&uuml;gt:<\/p>\n<pre><span style=\"color:blue;\">MsgBox<\/span> objTreeView.HitTest(x, y).Text<\/pre>\n<p>Achtung: Damit diese Anweisung funktioniert, muss man ein <b>Node<\/b>-Element anklicken, da sonst ein Fehler ausgel&ouml;st wird.<\/p>\n<p>Das hei&szlig;t also, dass wir f&uuml;r <b>x <\/b>und <b>y <\/b>beim <b>MSCOMCTLLib.TreeView<\/b>-Element viel kleinere Werte erhalten als die <b>HitTest<\/b>-Funktion erwartet. So erhalten wir immer noch einen Verweis auf das Element mit dem Text <b>Test1<\/b>, auch wenn wir auf den Bereich rechts davon oder darunter klicken.<\/p>\n<h2>Workarounds f&uuml;r den Fehler<\/h2>\n<p>Da wir nicht wissen, ob und wann Microsoft dieses Problem behebt, ben&ouml;tigen wir einen Workaround, der auch noch funktioniert, wenn der Fehler behoben ist.<\/p>\n<p>Die erste M&ouml;glichkeit ist, einfach nur direkt das Steuerelement zu referenzieren, so wie es im Formularentwurf benannt wurde &#8211; also wie in der Prozedur <b>ctlTreeView_MouseDown<\/b>. Hier gibt es folgende potenzielle Nachteile:<\/p>\n<ul>\n<li>Wir k&ouml;nnen nicht mehr IntelliSense f&uuml;r den Zugriff auf die Methoden und Eigenschaften des mit <b>ctlTreeView.Object <\/b>referenzierten Steuerelements nutzen.<\/li>\n<li>Wir k&ouml;nnen die Ereignisse nicht mehr mit Objektvariablen mit dem Schl&uuml;sselwort <b>WithEvents <\/b>implementieren.<\/li>\n<\/ul>\n<p>Der zuerst genannte Nachteil ist vernachl&auml;ssigbar, denn wir k&ouml;nnen ja w&auml;hrend der Programmierung mit einer Objektvariablen mit dem Datentyp <b>MSCOMCTLLib.TreeView <\/b>arbeiten und diesen sp&auml;ter durch die Referenz auf das Steuerelement mit <b>Me!ctlTreeView.Object <\/b>ersetzen.<\/p>\n<p>Der zweite Nachteil ist entscheidend, wenn wir die Funktionalit&auml;t des <b>TreeView<\/b>-Steuerelements in einem Klassenmodul kapseln wollen, dem wir einen Verweis auf das <b>TreeView<\/b>-Steuerelement &uuml;bergeben. Wir haben das beispielsweise im Beitrag <b>TreeView-Konfigurator <\/b>(<b>www.access-im-unternehmen.de\/667<\/b>) so gemacht.<\/p>\n<p>Die zweite M&ouml;glichkeit besteht darin, die von <b>MouseDown <\/b>als Pixel gelieferten Werte f&uuml;r <b>x <\/b>und <b>y <\/b>in Twips umzurechnen, bevor wie sie an die <b>HitTest<\/b>-Funktion weitergeben.<\/p>\n<p>Das erledigen wir, indem wir zun&auml;chst die folgenden drei API-Funktionen deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GetDC Lib \"user32\" ( _\r\n     ByVal hwnd<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GetDeviceCaps Lib \"gdi32\"  _\r\n     (ByVal hDC<span style=\"color:blue;\"> As Long<\/span>, ByVal nIndex<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function ReleaseDC Lib \"user32\" _\r\n     (ByVal hwnd<span style=\"color:blue;\"> As Long<\/span>, ByVal hDC<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Zus&auml;tzlich ben&ouml;tigen wir noch einen Type, der die X- und Y-Koordinaten aufnimmt und wie folgt deklariert wird:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Type POINTAPI\r\n     X<span style=\"color:blue;\"> As Long<\/span>\r\n     Y<span style=\"color:blue;\"> As Long<\/span>\r\nEnd Type<\/pre>\n<p>Dann legen wir eine Prozedur zum Konvertieren der Werte an (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ConvertPixelsToTwips(ByRef x<span style=\"color:blue;\"> As <\/span>stdole.OLE_XPOS_PIXELS, _\r\n         ByRef y<span style=\"color:blue;\"> As <\/span>stdole.OLE_YPOS_PIXELS)\r\n     <span style=\"color:blue;\">Dim <\/span>hDC<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>RetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>TwipsPerPixelX<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>TwipsPerPixelY<span style=\"color:blue;\"> As Long<\/span>\r\n     Const LOGPIXELSX = 88\r\n     Const LOGPIXELSY = 90\r\n     Const TWIPSPERINCH = 1440\r\n     hDC = GetDC(0)\r\n     TwipsPerPixelX = TWIPSPERINCH \/ GetDeviceCaps(hDC, LOGPIXELSX)\r\n     TwipsPerPixelY = TWIPSPERINCH \/ GetDeviceCaps(hDC, LOGPIXELSY)\r\n     RetVal = ReleaseDC(0, hDC)\r\n     x = x * TwipsPerPixelX\r\n     y = y * TwipsPerPixelY\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anpassung der Prozedur f&uuml;r das Vergr&ouml;&szlig;ern und Verkleinern<\/span><\/b><\/p>\n<p>Diese rufen wir in der Prozedur <b>objTreeView_MouseDown <\/b>direkt in der ersten Anweisung nach der Deklaration von <b>objNode <\/b>auf:<\/p>\n<pre>ConvertPixelsToTwips x, y<\/pre>\n<p>Nun werden <b>x <\/b>und <b>y <\/b>mit einer Zahl etwa mit dem Wert <b>15 <\/b>multipliziert und <b>HitTest(x, y) <\/b>kann das richtige <b>Node<\/b>-Element ermitteln.<\/p>\n<p>Damit erhalten wir allerdings ein weiteres Problem: Wenn die das Formular nun unter Access 2010, 2013, 2016 et cetera ausprobieren (2019 und 2021 nicht getestet), wird der als Twips gelieferte Wert f&uuml;r <b>x <\/b>und <b>y <\/b>ebenfalls mit dem ermittelten Faktor multipliziert, was dazu f&uuml;hrt, dass nun hier die Ermittlung des angeklickten <b>Node<\/b>-Elements nicht mehr funktioniert.<\/p>\n<p>Wir m&uuml;ssen also pr&uuml;fen, in welcher Einheit Access die Werte f&uuml;r die Parameter <b>x <\/b>und <b>y <\/b>bei Ereignisprozeduren wie <b>MouseDown <\/b>et cetera liefert. Dazu gibt es eigentlich nur eine M&ouml;glichkeit: Wir ermitteln die tats&auml;chliche Mausposition innerhalb des Steuerelements mit anderen Methoden wie beispielsweise API-Funktionen und pr&uuml;fen, ob die Werte gleich sind.<\/p>\n<p>Dazu m&uuml;ssen wir wissen, dass die API-Funktionen grunds&auml;tzlich alle Angaben bez&uuml;glich Position und Abmessungen in Pixeln liefern. Wir k&ouml;nnen also die folgenden beiden  API-Funktionen verwenden, um die Position des Mauszeigers im aktuellen Kontext zu ermitteln:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function ScreenToClient _\r\n     Lib \"user32\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>Ptr, _\r\n     lpPoint<span style=\"color:blue;\"> As <\/span>POINTAPI)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n<span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GetCursorPos _\r\n     Lib \"user32\" (lpPoint<span style=\"color:blue;\"> As <\/span>POINTAPI)<span style=\"color:blue;\"> As Long<\/span>Ptr<\/pre>\n<p>Die API-Funktionen verwenden wir in der &uuml;berarbeiteten Prozedur f&uuml;r das <b>MouseDown<\/b>-Ereignis des <b>MSCOMCTLLib.TreeView<\/b>-Elements aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objTreeView_MouseDown(ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, ByVal X<span style=\"color:blue;\"> As <\/span>stdole.OLE_XPOS_PIXELS, _\r\n         ByVal Y<span style=\"color:blue;\"> As <\/span>stdole.OLE_YPOS_PIXELS)\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>pt<span style=\"color:blue;\"> As <\/span>POINTAPI\r\n     GetCursorPos pt\r\n     ScreenToClient CLngPtr(ctlTreeView.hWnd), pt\r\n     Me!txtObjX = X\r\n     Me!txtObjY = Y\r\n     Me!txtAPIX = pt.X\r\n     Me!txtAPIY = pt.Y\r\n     <span style=\"color:blue;\">If <\/span>pt.X = X<span style=\"color:blue;\"> Then<\/span>\r\n         ConvertPixelsToTwips X, Y\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.HitTest(X, Y)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtObjNode = objNode.Text\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtObjNode = 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 2: Diese Version pr&uuml;ft, ob der mit X gelieferte Wert dem Wert entspricht, den wir per API ermittelt haben<\/span><\/b><\/p>\n<p>Diese deklariert mit der Variablen <b>pt <\/b>ein <b>Type<\/b>-Element mit dem Datentyp <b>POINTAPI<\/b>. Dieses f&uuml;llen wir gleich im Anschluss mit der API-Funktion <b>GetCursorPos <\/b>mit den aktuellen Koordinaten des Mauszeigers.<\/p>\n<p>Danach liefern <b>pt.X <\/b>und <b>pt.Y <\/b>die Position des Mauszeigers bezogen auf die linke, obere Ecke des Bildschirms. Wir k&ouml;nnen diese Werte mit der folgenden Anweisung testweise ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> \"GetCursorPos: \" & pt.X, pt.Y<\/pre>\n<p>Danach rufen wir die API-Funktion <b>ScreenToClient <\/b>auf. Dieser &uuml;bergeben wir ein Handle auf das <b>MSCOMCTLLib.TreeView<\/b>-Element und die Variable <b>pt<\/b>. Die <b>ScreenToClient<\/b>-Funktion konvertiert die Bildschirmkoordinaten des mit <b>pt<\/b> angegebenen Punkts auf dem Bildschirm in Clientbereichskoordinaten, also in die Koordinaten, die der Punkt in dem mit <b>objTreeView.hWnd <\/b>angegebenen Element aufweist. Die transformierten Werte geben wir beispielsweise mit der folgenden Anweisung aus:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> \"ScreenToClient: \" & pt.X, pt.Y<\/pre>\n<p>Nun tragen wir die mit den Parametern <b>X <\/b>und <b>Y <\/b>gelieferten Koordinaten in die Textfelder <b>txtObjX <\/b>und <b>txtObjY <\/b>ein.  Dem Formular haben wir noch zwei weitere Textfelder namens <b>txtAPIX <\/b>und <b>txtAPIY <\/b>hinzugef&uuml;gt, denen wir die durch die API-Funktionen ermittelten Koordinaten des Mauszeigers &uuml;bergeben. Dies sieht dann beispielsweise wie in Bild 15 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_015.png\" alt=\"Ermitteln der Koordinaten, nun auch per API\" width=\"424,5589\" height=\"361,798\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Ermitteln der Koordinaten, nun auch per API<\/span><\/b><\/p>\n<p>Nun folgt der entscheidende Schritt: Wir pr&uuml;fen anhand der <b>X<\/b>-Koordinate, ob diese durch den Parameter <b>X <\/b>in der Einheit Pixel geliefert wurde. Dazu vergleichen wir <b>X <\/b>mit dem als Pixel vorliegenden Wert aus <b>pt.X<\/b>. Sind beide gleich, wurde auch <b>X <\/b>als Pixel geliefert (und folglich auch <b>Y<\/b>). In diesem Fall konvertieren wir die Werte aus <b>X <\/b>und <b>Y <\/b>mit der Funktion <b>ConvertPixelsToTwips<\/b> in die Einheit Twips.<\/p>\n<p>Damit k&ouml;nnen wir nun mit <b>HitTest <\/b>das <b>Node<\/b>-Element unter dem Mauszeiger ermitteln und dieses ausgeben. Unter Office 365 erhalten wir wie in der Abbildung gezeigt die <b>X<\/b>&#8211; und <b>Y<\/b>-Werte in Pixeln und wandeln diese zur Ermittlung des Node-Elements zuvor um.<\/p>\n<p>In Access 2010 sehen wir wie in Bild 16, dass X und Y direkt in Twips geliefert werden &#8211; hier ist keine Umwandlung mehr n&ouml;tig.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1492_016.png\" alt=\"Ermitteln der Koordinaten unter Access 2010\" width=\"424,5589\" height=\"325,6151\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Ermitteln der Koordinaten unter Access 2010<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Wenn Sie Ereignisprozeduren wie <b>MouseMove <\/b>einer Objektvariablen des Typs <b>MSCOMCTLLib.TreeView <\/b>verwenden, m&uuml;ssen Sie pr&uuml;fen, ob die Koordinaten <b>X <\/b>und <b>Y <\/b>in Twips geliefert werden. Ist das nicht der Fall und die Koordinaten kommen als Pixel, muss man diese zuvor noch umwandeln, damit man damit korrekte Ergebnisse f&uuml;r die Funktion <b>HitTest <\/b>bekommt und das tats&auml;chlich angeklickte <b>Node<\/b>-Element referenzieren kann, um weitere Aktionen damit durchzuf&uuml;hren.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TreeViewExperimente_2016.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F17C4A77-83CD-489A-A686-C8A95BF30F4B\/aiu_1492.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man das TreeView-Steuerelement professioneller nutzt, programmiert man unter anderem Ereignisse, die durch das Anklicken von Elementen ausgel&ouml;st werden. Damit kann man Ereignisprozeduren ausl&ouml;sen, die beispielsweise Daten zum angeklickten Element in einem Unterformular anzeigen oder man blendet ein Kontextmen&uuml; zum jeweils angeklickten Element mit weiteren Optionen ein. Dazu ist es notwendig, zu identifizieren, auf welches Element der Benutzer geklickt hat. Die notwendigen Informationen liefern die Parameter der Prozeduren, das Ermitteln des angeklickten Elements erledigt man mit einer bestimmten Funktion. Seit Kurzem erreichen uns allerdings Meldungen von Lesern, bei denen dies nicht mehr zuverl&auml;ssig funktioniert: Es werden keine Kontextmen&uuml;s mehr angezeigt und auch das Anklicken gelingt nicht mehr wie gew&uuml;nscht. Interessanterweise tritt das Problem nur bei Verwendung von Office 365 auf. Wir schauen uns in diesem Beitrag an, woher das Problem r&uuml;hrt und wie Sie es l&ouml;sen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022024,662024,44000023],"tags":[],"class_list":["post-55001492","post","type-post","status-publish","format-standard","hentry","category-66022024","category-662024","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>TreeView: Bug durch falsche Einheiten - 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\/TreeView_Bug_durch_falsche_Einheiten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TreeView: Bug durch falsche Einheiten\" \/>\n<meta property=\"og:description\" content=\"Wenn man das TreeView-Steuerelement professioneller nutzt, programmiert man unter anderem Ereignisse, die durch das Anklicken von Elementen ausgel&ouml;st werden. Damit kann man Ereignisprozeduren ausl&ouml;sen, die beispielsweise Daten zum angeklickten Element in einem Unterformular anzeigen oder man blendet ein Kontextmen&uuml; zum jeweils angeklickten Element mit weiteren Optionen ein. Dazu ist es notwendig, zu identifizieren, auf welches Element der Benutzer geklickt hat. Die notwendigen Informationen liefern die Parameter der Prozeduren, das Ermitteln des angeklickten Elements erledigt man mit einer bestimmten Funktion. Seit Kurzem erreichen uns allerdings Meldungen von Lesern, bei denen dies nicht mehr zuverl&auml;ssig funktioniert: Es werden keine Kontextmen&uuml;s mehr angezeigt und auch das Anklicken gelingt nicht mehr wie gew&uuml;nscht. Interessanterweise tritt das Problem nur bei Verwendung von Office 365 auf. Wir schauen uns in diesem Beitrag an, woher das Problem r&uuml;hrt und wie Sie es l&ouml;sen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T09:42:11+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5\" \/>\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\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"TreeView: Bug durch falsche Einheiten\",\"datePublished\":\"2024-02-02T09:42:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/\"},\"wordCount\":2609,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4b287816bae94764a60b8284712475f5\",\"articleSection\":[\"2\\\/2024\",\"2024\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/\",\"name\":\"TreeView: Bug durch falsche Einheiten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4b287816bae94764a60b8284712475f5\",\"datePublished\":\"2024-02-02T09:42:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4b287816bae94764a60b8284712475f5\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/4b287816bae94764a60b8284712475f5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Bug_durch_falsche_Einheiten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TreeView: Bug durch falsche Einheiten\"}]},{\"@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":"TreeView: Bug durch falsche Einheiten - 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\/TreeView_Bug_durch_falsche_Einheiten\/","og_locale":"de_DE","og_type":"article","og_title":"TreeView: Bug durch falsche Einheiten","og_description":"Wenn man das TreeView-Steuerelement professioneller nutzt, programmiert man unter anderem Ereignisse, die durch das Anklicken von Elementen ausgel&ouml;st werden. Damit kann man Ereignisprozeduren ausl&ouml;sen, die beispielsweise Daten zum angeklickten Element in einem Unterformular anzeigen oder man blendet ein Kontextmen&uuml; zum jeweils angeklickten Element mit weiteren Optionen ein. Dazu ist es notwendig, zu identifizieren, auf welches Element der Benutzer geklickt hat. Die notwendigen Informationen liefern die Parameter der Prozeduren, das Ermitteln des angeklickten Elements erledigt man mit einer bestimmten Funktion. Seit Kurzem erreichen uns allerdings Meldungen von Lesern, bei denen dies nicht mehr zuverl&auml;ssig funktioniert: Es werden keine Kontextmen&uuml;s mehr angezeigt und auch das Anklicken gelingt nicht mehr wie gew&uuml;nscht. Interessanterweise tritt das Problem nur bei Verwendung von Office 365 auf. Wir schauen uns in diesem Beitrag an, woher das Problem r&uuml;hrt und wie Sie es l&ouml;sen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-02T09:42:11+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5","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\/TreeView_Bug_durch_falsche_Einheiten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"TreeView: Bug durch falsche Einheiten","datePublished":"2024-02-02T09:42:11+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/"},"wordCount":2609,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5","articleSection":["2\/2024","2024","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/","url":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/","name":"TreeView: Bug durch falsche Einheiten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5","datePublished":"2024-02-02T09:42:11+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/4b287816bae94764a60b8284712475f5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Bug_durch_falsche_Einheiten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"TreeView: Bug durch falsche Einheiten"}]},{"@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\/55001492","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=55001492"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001492\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}