TreeView aufgebohrt

MouseUp

Das Ereignis MouseUp wird nicht nur durch einen Rechtsklick ausgelöst, sondern auch durch andere Mausklicks inklusive Varianten mit bestimmten Tastenkombinationen. Der Parameter Button liefert einen Integer-Wert, der Auskunft über die gedrückte Taste liefert. Hier reicht die Information, dass ein Klick auf die rechte Maustaste den Wert 2 liefert. Nach der Prüfung, ob der Klick von der rechten Maustaste kommt, steht die Frage nach dem Ziel des Mausklicks an. Hat der Klick einen Kategorie-Knoten oder einen Artikel- Knoten getroffen, oder zielte er etwa auf einen leeren Bereich des TreeView-Steuerelements?

Auch diese Information erhalten Sie über die Parameter des MouseUp-Ereignisses – in diesem Fall allerdings indirekt. Es liefert nämlich die xund die y-Position zum Zeitpunkt des Mausklicks. Und die liefert mittels der Methode Hit- Test einen Hinweis auf das getroffene Node-Element.

Hier prüft die Routine zunächst, ob die Methode HitTest überhaupt einen Verweis auf ein Element des TreeView-Steuerelements zurückgibt. Falls nicht, hat der Klick im leeren Bereich des TreeViews stattgefunden. In dem Fall soll das Kontextmenü mit dem Befehl zum Anlegen einer Kategorie angezeigt werden. Entsprechend stellt die Routine die Objektvariable cbr auf die Symbolleiste TreeView_KeinEintrag ein.

Wenn die HitTest-Methode einen Verweis auf ein Element des TreeViews zurückliefert, wertet die Routine zunächst dessen Key-Eigenschaft aus: Die ersten drei Zeichen enthalten entweder die Zeichenkette „kat“ oder „art“ und werden in der Variablen strType gespeichert, die folgenden die ID des zugehörigen Eintrags in der entsprechenden Tabelle.

Zunächst ist die Zeichenkette interessant: Damit kann die Routine entscheiden, ob sie das Kontextmenü für eine Kategorie oder einen Artikel anzeigen soll. Je nach gewähltem Kontextmenü stellt die Routine nun die beim Klick auf einen der Kontextmenüeinträge aufzurufenden Funktionen ein. Dazu verwendet sie die Controls- Auflistung des jeweiligen Commandbar- Objekts und weist den enthaltenen Einträgen die passende Funktion zu. Dabei muss die Routine in den meisten Fällen die ID des aktuellen Elements übergeben: Die Funktion zum Löschen eines Artikels etwa muss schließlich wissen, welchen Artikel sie überhaupt löschen soll. Die Zuweisung sieht in dem Fall beispielsweise wie folgt aus (in einer Zeile):

cbr.Controls("Artikel löschen").OnAction = "=mnuArtikelLoeschen("& lngID & ")"

Bild 5: Einfügen eines neuen Artikels per Kontextmenü.
Bild 5: Einfügen eines neuen Artikels per Kontextmenü.

Die Kontextmenüs sind somit fertig. Bild 5 zeigt, wie das Kontextmenü eines Kategorie-Eintrags in Aktion aussieht.