GUI TreeView: Eine hoffentlich leichte Frage

  • Hallo Zusammen

    Meine Frage ist hoffentlich leicht zu beantworten,auch wenn nicht von mir selbst: :D

    Ich erstelle mir gerade ein GUI, das aus GUICtrlCreateTreeView und einem Edit besteht.
    In dem Edit würde ich gerne Text anzeigen, der vom angeklickten TreeView-Item abhängig ist - sozusagen als Vorschau.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 253, 342, 192, 124)
    $TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("1a", $TreeView1_0)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("1b", $TreeView1_0)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("2a", $TreeView1_3)
    $TreeView1_5 = GUICtrlCreateTreeViewItem("2b", $TreeView1_3)
    $TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
    $TreeView1_7 = GUICtrlCreateTreeViewItem("3a", $TreeView1_6)
    $TreeView1_8 = GUICtrlCreateTreeViewItem("3b", $TreeView1_6)
    $Edit = GUICtrlCreateEdit("",12,230,229,109)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]

    Also wenn im Beispiel "1b" angeklickt wird, soll ein diesem Item zugeordneter Text angezeigt wird.
    Und sobald per Doppelklick auf eines der Item geklickt wird, soll das GUI geschlossen und der Text an der Cursor-Position geschrieben werden.

    Das Schreiben ist ja mit ControlSend bspw Recht einfach umsetzbar aber für mich ist nun die Frage, wie mach ich das mit der Vorschau und dem schließen des GUI per Doppelklick? ?(

    4 Mal editiert, zuletzt von SmilingStar (12. April 2014 um 17:44)

  • Danke für den Hinweis, die Richtung scheint die Gleiche zu sein.
    Mir fehlt da allerdings etwas die Erklärung zu. ?(

    Soweit ich das verstehe, wird das Ergebnis nicht wie von mir angedacht, durch eine Änderung des vorhandenen Edit, im Bsp. ein Label, erreicht.
    Stattdessen wird das vorhandene Label per Hide ausgeblendet und ein anderes eingeblendet ?!
    Und um das zu erreichen, wird zuvor für jedes Item im TreeView ein eigenes Label erstellt und versteckt ?!
    Klingt zwar nach einer Unmenge Quelltext, je größer das TreeView wird aber was solls.

    Die Frage mit dem Doppelklick wäre aber noch offen.
    Ich möchte bei einem Doppelklick auf ein TreeItem die GUI schließen und den Inhalt des Item an die Cursorposition senden. Wie mache ich ihm den "Case Doppelklick" klar?

    • Offizieller Beitrag

    Also Klick und Doppelklick auszuwerten ist nicht empfehlenswert, da der erste Klick des Doppelklicks sofort vom Klick-Event abgefangen wird.
    Ich empfehle daher statt Doppelklick den Rechtsklick. Da das Treeview standardmäßig kein Kontextmenü hat, ist das auch ohne Probleme realisierbar.
    Ich habe deinenCode mal entsprechend erweitert:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTreeView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; == Zuweisung Texte an Item, am besten per Dictionary Objekt
    Global $oDict = ObjCreate('Scripting.Dictionary')
    $oDict.Add('1', 'Text für "1"')
    $oDict.Add('1a', 'Text für "1a"')
    $oDict.Add('1b', 'Text für "1b"')
    $oDict.Add('2', 'Text für "2"')
    $oDict.Add('2a', 'Text für "2a"')
    $oDict.Add('2b', 'Text für "2b"')
    $oDict.Add('3', 'Text für "3"')
    $oDict.Add('3a', 'Text für "3a"')
    $oDict.Add('3b', 'Text für "3b"')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 253, 342, 192, 124)
    $TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
    $hTreeview = GUICtrlGetHandle($TreeView1)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("1a", $TreeView1_0)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("1b", $TreeView1_0)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("2a", $TreeView1_3)
    $TreeView1_5 = GUICtrlCreateTreeViewItem("2b", $TreeView1_3)
    $TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
    $TreeView1_7 = GUICtrlCreateTreeViewItem("3a", $TreeView1_6)
    $TreeView1_8 = GUICtrlCreateTreeViewItem("3b", $TreeView1_6)
    $Edit = GUICtrlCreateEdit("",12,230,229,109)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    _GetText(False)
    Case $GUI_EVENT_SECONDARYDOWN
    _GetText(True)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetText($_fSend)
    Local $sItem, $hItem, $cItem = GUICtrlRead($TreeView1) ; == $cItem ist das Control des aktuell aktiven Item
    If $cItem <= 0 Then Return ; == wenn kein gültiges Control - Funktion verlassen
    $hItem = GUICtrlGetHandle($cItem) ; == das Handle des aktiven Item holen
    $sItem = _GUICtrlTreeView_GetText($hTreeview, $hItem) ; == den Text des aktiven Item auslesen
    Local $sText = $oDict.Item($sItem) ; == im Dictionary.Object den Voll-Text für das Item auslesen, Variable $sText enthält jetzt den vollen Text zur weiteren Nutzung
    If $_fSend Then ; == wenn $_fSend=True wird der Code zum Senden des Textes aufgerufen (bei Rechtsklick)
    ; == Sende $sText
    Else
    GUICtrlSetData($Edit, $sText) ; == bei False wird der Text in das Edit-Control geschrieben (bei Linksklick)
    EndIf
    EndFunc

    [/autoit]

    Um die Item in bestimmter Reihenfolge zu erstellen (u. auch wieder abzuspeichern) habe ich mal eine UDF erstellt. Vielleicht kannst du das auch dabei brauchen.

  • Also Klick und Doppelklick auszuwerten ist nicht empfehlenswert, da der erste Klick des Doppelklicks sofort vom Klick-Event abgefangen wird.
    Ich empfehle daher statt Doppelklick den Rechtsklick. Da das Treeview standardmäßig kein Kontextmenü hat, ist das auch ohne Probleme realisierbar.
    Ich habe deinenCode mal entsprechend erweitert:
    [...]
    Um die Item in bestimmter Reihenfolge zu erstellen (u. auch wieder abzuspeichern) habe ich mal eine UDF erstellt. Vielleicht kannst du das auch dabei brauchen.

    Ich seh das deine Verbesserung die entsprechenden Texte wunderbar im Edit anzeigt, Danke.
    Aber kannst du mir das Ganze noch etwas erklären? ?(
    Soweit ich das verstehe, ruft er bei einem Klick mit der linken Maustaste über _GetText(False) deine Funktion _GetText() auf.
    Allerdings steige ich da nicht ganz durch, wie er dann den Text zuordnet und im Edit anzeigt.

    Welche Variable müsste ich den angehen, um beim von dir vorgeschlagenen Rechtsklick dann den Text des gewählten Item zu erhalten? ?(

  • Ich muss doch noch einmal Fragen: Du hast zwar davor gewarnt, sowohl Klick als auch Doppelklick zu verwenden, ich würde es aber trotzdem versuchen wollen.
    Bin hierzu auf ein paar Versuche mit ListView gestoßen, konnte mit meinem Viertel- bis Halbwissen aber nichts davon gebrauchen. :D
    Die Zuverlässigkeit von IsPressed hast du ja schon entsprechend kritisch kommentiert, also wohl keine wirklich Option.

    Wie bekomm ich das hin, statt $GUI_EVENT_SECONDARYDOWN eventuell $NM_DBLCLK zu verwenden?

    • Offizieller Beitrag

    Du hast zwar davor gewarnt, sowohl Klick als auch Doppelklick zu verwenden, ich würde es aber trotzdem versuchen wollen.


    Nun, ich erkläre mal im Detail was passiert, wenn du die Message $WM_NOTIFY registrierst und $NM_CLICK und $NM_DBLCLK auswertest und mit welchen weiteren Problemen du zu kämpfen hast:
    • Einfach-Klick auf ein Item
    - $NM_CLICK wird ausgelöst
    - Aber erst wenn die Message-Funktion verlassen wurde, ist auch das angeklickte Item markiert! Eine aus der Funktion heraus gestartete Aktion würde also mit dem zuletzt aktiven Item arbeiten!! Das gilt für alle Events innerhalb der Message-Funktion.

    • Doppel-Klick auf ein Item
    - $NM_CLICK wird ausgelöst
    - $NM_DBLCLK wird ausgelöst

    Du könntest jetzt versuchen durch Timer-Konstrukte o.ä. NM_CLICK von NM_DBLCLK zu trennen - Viel Spaß dabei.
    Unabhängig davon wird ja ein Item erst markiert, wenn die Message-Funktion bereits abgearbeitet ist. Das liesse sich lösen, indem man einen internen Zähler setzt. Ist er 1 wird die Funktion verlassen und nochmal aufgerufen mit denselben Parametern (dadurch findet das normale Prozedere statt und die Auswertung beginnt mit dem dann korrekt markiertem Item in Durchlauf 2). Beim 2-ten mal wird der Zähler zurückgesetzt und die gewünschten Operationen werden ausgeführt.

    Du siehst, das ist nicht ganz soo easy - aber nicht unmöglich. Nun entscheide ob du einen ganz einfachen Weg wählst oder dich hart reinkniest. :D

  • Ist denn $NM_DBLCLK die einzige Möglichkeit, so einen Doppelklick abzufangen ?
    Spontan hätte ich ja auch erst einmal die Idee geäußert, den einfachen Klick mit einer Art Timer vom Doppelklick zu unterscheiden. So nach dem Motto "Klick und in X ms kein weiter? Dann ist es Klick"

    Dein Gedanke mit dem Zähler würde bedeuten, dass bei einem Klick auf ein Item der Zähler auf 1 gesetzt, die Funktion wie in einer Schleife neu aufgerufen und damit das zuvor erstellte "Inhalt im Edit anzeigen" ausgeführt wird. Und bei einem erneuten Klick, würde dann sozusagen Option 2 ausgeführt werden - das senden des Inhalts. Würde das dann nicht bedeuten, dass jedes Item zweimal angeklickt werden muss?

    Sicher ein schlechtes Argument aber ich hab schon eine GUI mit TreeView gesehen, welches per Doppelklick und Klick bedient wurde, das muss doch also ohne blutige Knie gehen.^^

    • Offizieller Beitrag

    Dein Gedanke mit dem Zähler würde bedeuten, dass bei einem Klick auf ein Item der Zähler auf 1 gesetzt, die Funktion wie in einer Schleife neu aufgerufen und damit das zuvor erstellte "Inhalt im Edit anzeigen" ausgeführt wird. Und bei einem erneuten Klick, würde dann sozusagen Option 2 ausgeführt werden - das senden des Inhalts. Würde das dann nicht bedeuten, dass jedes Item zweimal angeklickt werden muss?


    Ein Doppelklick hat immer als erstes Element den Single-Klick. Wenn man nur den Doppelklick benötigt ist das schnuppe. Willst du beides ist es am sichersten die Auswertung gänzlich in eigene Verwaltung zu nehmen.
    Ich würde einen Mouse-Hook nutzen (begrenzt auf das Treeview).
    - Left-Klick ==> startet Timer
    - Timer >= Doppelklickzeit (Registryeintrag auslesen) ==> Das ist ein Single-Klick
    - Timer < Doppelklickzeit und neuer Leftklick ==> Das ist ein Doppel-Klick
    Das ist aber nicht ganz unkompliziert. Du darfst die Klicks nicht an das System weiterleiten. Erst wenn klar ist ob Single/Doubleklick kannst du die gewünschten Aktionen starten. Auch hier hast du das Problem, dass erst wenn die Art des Klicks erkannt ist, das entsprechende Item aktiviert wird. Also musst du eine Ereignisvariable auf Single oder Double setzen und dann in einer folgenden Auswertefunktion anhand dieser Variablen operieren.

  • Ist das denn möglich, so ein Mouse-Hook auf die GUI zu begrenzen? Hab über die Suche die entsprechenden Seiten von Microsoft gefunden aber wirklich geholfen, hat mir das nicht.
    Dort sind zwar auch Variablen genannt, die offensichtlich definieren, ob die Klicks an das System weitergeleitet und wann aber naja. Mir fehlt da der Einblick, wie man das überhaupt anfängt.


    Kurzer Zwischenschwenk auf das ursprüngliche/erste Thema.
    Ich hab nun in den SubItems Bezeichnungen die sich wiederholen, d.h. um beim Beispiel zu bleiben, unterhalb von 1 befinden sich die Subitem a und b, gleichfalls bei 2 und 3.
    Lässt sich deine Lösung irgendwie anpassen, ohne jedes Subitem von der Bezeichnung her zu individualisieren?!

    • Offizieller Beitrag

    Ich weiß nicht so recht, ob ich das vielleicht falsch verstehe, aber suchst Du nicht einfach sowas:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 253, 342, 192, 124)
    $TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("1a", $TreeView1_0)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("1b", $TreeView1_0)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("2a", $TreeView1_3)
    $TreeView1_5 = GUICtrlCreateTreeViewItem("2b", $TreeView1_3)
    $TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
    $TreeView1_7 = GUICtrlCreateTreeViewItem("3a", $TreeView1_6)
    $TreeView1_8 = GUICtrlCreateTreeViewItem("3b", $TreeView1_6)
    $Edit = GUICtrlCreateEdit("", 12, 230, 229, 109)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $iDblClkTimer = TimerInit(), $iDoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed')
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYUP ; Linke Maustaste losgelassen
    $iSelItem = ControlTreeView($Form1, '', $TreeView1, 'GetSelected')
    $sItemText = ControlTreeView($Form1, '', $TreeView1, 'GetText', $iSelItem)
    GUICtrlSetData($Edit, $sItemText)
    If TimerDiff($iDblClkTimer) < $iDoubleClickSpeed Then ; Zeitdifferenz kleiner als Doppelklick-Geschwindigkeit, dann...
    MsgBox(0, 'Test', 'Doppelklick' & @CRLF & $sItemText)
    EndIf
    $iDblClkTimer = TimerInit()
    EndSwitch
    WEnd

    [/autoit]
  • Ich weiß nicht so recht, ob ich das vielleicht falsch verstehe, aber suchst Du nicht einfach sowas:

    Ja, was den Doppelklick angeht, an sowas dachte ich, Danke. :thumbup:
    Zumindest in meinem virtuellen XP scheine ich damit allerdings ab und an zu schnell zu klicken - muss das mal an einem echten XP testen. Wenn ich zügig hintereinander zwei Items durch klicke, als würde ich die Möglichkeiten durch klicken wollen, nimmt er das als Doppelklick wahr.


    Bleibt für mich nun nur die Sache mit dem Inhalt des $Edit.
    Darin soll nicht der Name des ausgewählten TreeViewItem stehen, sondern ein diesem Item zugeordneter Text - aus einer entsprechenden Variable/Quelle.
    BugFix hat dafür eine super Lösung präsentiert, die allerdings nicht mehr richtig funktioniert, sobald "SubItems" identische Texte haben - sich unterhalb von Item 1 und Item 2 jeweils die Item a und b bestehen.
    Wie hier in seinem Quelltext, indem ich zum Verständnis nur mal die 1 und 2 vor den Buchstaben entfernt hab.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTreeView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; == Zuweisung Texte an Item, am besten per Dictionary Objekt
    Global $oDict = ObjCreate('Scripting.Dictionary')
    $oDict.Add('1', 'Text für "1"')
    $oDict.Add('1a', 'Text für "1a"') ; funktioniert so nicht mehr
    $oDict.Add('1b', 'Text für "1b"') ; funktioniert so nicht mehr
    $oDict.Add('2', 'Text für "2"')
    $oDict.Add('2a', 'Text für "2a"') ; funktioniert so nicht mehr
    $oDict.Add('2b', 'Text für "2b"') ; funktioniert so nicht mehr
    $oDict.Add('3', 'Text für "3"')
    $oDict.Add('3a', 'Text für "3a"') ; funktioniert so nicht mehr
    $oDict.Add('3b', 'Text für "3b"') ; funktioniert so nicht mehr

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 253, 342, 192, 124)
    $TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
    $hTreeview = GUICtrlGetHandle($TreeView1)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("a", $TreeView1_0)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("b", $TreeView1_0)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("a", $TreeView1_3)
    $TreeView1_5 = GUICtrlCreateTreeViewItem("b", $TreeView1_3)
    $TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
    $TreeView1_7 = GUICtrlCreateTreeViewItem("a", $TreeView1_6)
    $TreeView1_8 = GUICtrlCreateTreeViewItem("b", $TreeView1_6)
    $Edit = GUICtrlCreateEdit("",12,230,229,109)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    _GetText(False)
    Case $GUI_EVENT_SECONDARYDOWN
    _GetText(True)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetText($_fSend)
    Local $sItem, $hItem, $cItem = GUICtrlRead($TreeView1) ; == $cItem ist das Control des aktuell aktiven Item
    If $cItem <= 0 Then Return ; == wenn kein gültiges Control - Funktion verlassen
    $hItem = GUICtrlGetHandle($cItem) ; == das Handle des aktiven Item holen
    $sItem = _GUICtrlTreeView_GetText($hTreeview, $hItem) ; == den Text des aktiven Item auslesen
    Local $sText = $oDict.Item($sItem) ; == im Dictionary.Object den Voll-Text für das Item auslesen, Variable $sText enthält jetzt den vollen Text zur weiteren Nutzung
    If $_fSend Then ; == wenn $_fSend=True wird der Code zum Senden des Textes aufgerufen (bei Rechtsklick)
    ; == Sende $sText
    MsgBox(0,"",$sText)
    Else
    GUICtrlSetData($Edit, $sText) ; == bei False wird der Text in das Edit-Control geschrieben (bei Linksklick)
    EndIf
    EndFunc

    [/autoit]

    Hm... könnte man die Texte im "Dictionary Objekt" nicht auch beim Eintragen dem Control zuordnen? Also statt 1a und 2a bspw ID 4 und 7.

    Einmal editiert, zuletzt von SmilingStar (6. April 2014 um 17:52)

    • Offizieller Beitrag

    Ich würde es so machen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 253, 342, 192, 124)
    $TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("1a", $TreeView1_0)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("1b", $TreeView1_0)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("2a", $TreeView1_3)
    $TreeView1_5 = GUICtrlCreateTreeViewItem("2b", $TreeView1_3)
    $TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
    $TreeView1_7 = GUICtrlCreateTreeViewItem("3a", $TreeView1_6)
    $TreeView1_8 = GUICtrlCreateTreeViewItem("3b", $TreeView1_6)
    $Edit = GUICtrlCreateEdit("", 12, 230, 229, 109)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $iDblClkTimer = TimerInit(), $iDoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed')
    Global $aText[3][3] = [['Text1', 'Text1a', 'Text1b'],['Text2', 'Text2a', 'Text2b'],['Text3', 'Text3a', 'Text3b']] ; <- hier den zugeordneten Text eintragen
    Global $iSelItem, $aSelItem, $aCursorInfo

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYUP ; Linke Maustaste losgelassen
    $aCursorInfo = GUIGetCursorInfo($Form1) ; GUI-Element ermitteln, damit nur beim Klick auf das Treeview reagiert wird
    If $aCursorInfo[4] = $TreeView1 Then ; wenn auf's Treeview geklickt wurde, dann...
    $iSelItem = StringReplace(ControlTreeView($Form1, '', $TreeView1, 'GetSelected', 1), '#', '') & '|-1' ; Index vom Treeview holen und # entfernen
    $aSelItem = StringSplit($iSelItem, '|', 2) ; Index trennen
    ;~ ConsoleWrite($aSelItem[0] & ' ' & $aSelItem[1] & @CR)
    GUICtrlSetData($Edit, $aText[$aSelItem[0]][$aSelItem[1] + 1]) ; Text in Edit-Control eintragen
    If TimerDiff($iDblClkTimer) < $iDoubleClickSpeed Then ; Zeitdifferenz kleiner als Doppelklick-Geschwindigkeit, dann...
    MsgBox(0, 'Test', 'Doppelklick' & @CRLF & $aText[$aSelItem[0]][$aSelItem[1] + 1]) ; <- Doppelklick-Event
    EndIf
    $iDblClkTimer = TimerInit()
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Edit: Wenn Dir die Doppelklickgeschwindigkeit nicht schnell genug ist, dann im System anpassen oder den Wert von $iDoubleClickSpeed auf die entsprechenden Millisekunden setzen.

  • Interessant Lösung, statt den richtigen Text zu suchen, wird er vorher per Hand in der gewünschten Reihenfolge in die Variable $aText[3][3] geschrieben.
    Spricht an der Stelle etwas dagegen, den Text in und aus einem Array zu schreiben/lesen?
    Dann könnte ich ihn beim Start aus einer externen Quelle/TXT-Datei einlesen und würde das Script nicht durch den Text unnötig aufblasen.