1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Lars@Work

Beiträge von Lars@Work

  • Problem mit Event-Aufruf beim einklappen eines TreeViewItems

    • Lars@Work
    • 2. Juni 2014 um 09:00

    Hallo und Vielen Dank!

    Hatte jetzt etwas zeit um mich wieder um das Problem zu kümmern. Mit dem Beispielcode von Oscar war es auch ganz schnell gelöst! Vielen Dank dafür!

  • Problem mit Event-Aufruf beim einklappen eines TreeViewItems

    • Lars@Work
    • 26. Mai 2014 um 08:16

    Hallo und Guten Morgen,

    jetzt habe ich mein Script auf das "Wesentliche" gekürzt und hier angehangen. Für das von mir beschriebene Verhalten einfach alle Knoten aufklappen und dann z.B. unter "Main 2" das Sub-Item "Sub 7" auswählen. Nun sind die Items "Sub 7", "Main 2" und "Main" markiert bzw. auf Checked gesetzt. Wenn man jetzt den Knoten "Main" einklappt und wieder ausklappt sind nun alle Sub-Items markiert auch wenn sie vorher nicht ausgewählt werden.

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTreeView.au3>

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

    $Debug_TV = False
    Opt("GUIOnEventMode", 1)

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

    $Form1_1 = GUICreate("Test Framework Build Tool", 500, 360, 382, 56, BitOR($GUI_SS_DEFAULT_GUI,$DS_MODALFRAME))
    $Group1 = GUICtrlCreateGroup("Build Steps", 8, 8, 481, 350)
    $TreeView1 = GUICtrlCreateTreeView(16, 24, 465, 326, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_CHECKBOXES))
    $TreeView1_4 = GUICtrlCreateTreeViewItem("Main", $TreeView1)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Item = GUICtrlCreateTreeViewItem("Main 1", $TreeView1_4)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub1Item = GUICtrlCreateTreeViewItem("Sub 1", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub2Item = GUICtrlCreateTreeViewItem("Sub 2", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub3Item = GUICtrlCreateTreeViewItem("Sub 3", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub4Item = GUICtrlCreateTreeViewItem("Sub 4", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub5Item = GUICtrlCreateTreeViewItem("Sub 5", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub6Item = GUICtrlCreateTreeViewItem("Sub 6", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main1Sub7Item = GUICtrlCreateTreeViewItem("Sub 7", $main1Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Item = GUICtrlCreateTreeViewItem("Main 2", $TreeView1_4)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub1Item = GUICtrlCreateTreeViewItem("Sub 1", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub2Item = GUICtrlCreateTreeViewItem("Sub 2", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub3Item = GUICtrlCreateTreeViewItem("Sub 3", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub4Item = GUICtrlCreateTreeViewItem("Sub 4", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub5Item = GUICtrlCreateTreeViewItem("Sub 5", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub6Item = GUICtrlCreateTreeViewItem("Sub 6", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $main2Sub7Item = GUICtrlCreateTreeViewItem("Sub 7", $main2Item)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")

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

    GUISetState(@SW_SHOW)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1_1Close")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1_1Minimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Form1_1Maximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "Form1_1Restore")

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

    While 1
    Sleep(100)
    WEnd

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

    Func SelectionChangedChildItem()
    SetCheckedForAllChildItems(@GUI_CtrlId)
    SetCheckedForParentItem(@GUI_CtrlId)
    EndFunc

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

    Func SetCheckedForParentItem($hChildItem)
    Local $hParent = _GUICtrlTreeView_GetParentHandle ($TreeView1, $hChildItem)

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

    If $hParent <> 0 Then
    If _GUICtrlTreeView_GetChecked($TreeView1, $hChildItem) Then
    _GUICtrlTreeView_SetChecked($TreeView1, $hParent)
    ;SetTreeViewItemCheckedState($TreeView1, $hParent, True)
    Else
    Local $hChild
    Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParent)
    If $childCount > 0 Then
    Local $isAnyChildChecked = false
    For $i = 1 To $childCount
    If $i = 1 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParent)
    Else
    $hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
    EndIf
    $isAnyChildChecked = BitOR($isAnyChildChecked, _GUICtrlTreeView_GetChecked($TreeView1, $hChild))
    Next
    _GUICtrlTreeView_SetChecked($TreeView1, $hParent, $isAnyChildChecked)
    ;SetTreeViewItemCheckedState($TreeView1, $hParent, $isAnyChildChecked)
    EndIF
    EndIF
    SetCheckedForParentItem($hParent)
    EndIf
    EndFunc

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

    Func SetTreeViewItemCheckedState($treeViewCtrl, $treeViewItem, $isChecked)
    If _GUICtrlTreeView_GetChecked($treeViewCtrl, $treeViewItem) <> $isChecked Then
    _GUICtrlTreeView_SetChecked($treeViewCtrl, $treeViewItem, $isChecked)
    EndIf
    EndFunc

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

    Func SetCheckedForAllChildItems($hParentItem)
    Local $hChild
    Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParentItem)
    Local $isChecked = _GUICtrlTreeView_GetChecked($TreeView1, $hParentItem)

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

    If $childCount > 0 Then
    For $i = 1 To $childCount
    If $i = 1 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParentItem)
    Else
    $hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
    EndIf
    _GUICtrlTreeView_SetChecked($TreeView1, $hChild, $isChecked)
    ;SetTreeViewItemCheckedState($TreeView1, $hChild, $isChecked)
    SetCheckedForAllChildItems($hChild)
    Next
    EndIf
    EndFunc

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

    Func OnCloseSecondary()
    EndFunc

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

    Func Form1_1Close()
    Exit
    EndFunc ;==>Form1_1Close

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

    Func Form1_1Maximize()
    EndFunc ;==>Form1_1Maximize

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

    Func Form1_1Minimize()
    EndFunc ;==>Form1_1Minimize

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

    Func Form1_1Restore()
    EndFunc ;==>Form1_1Restore

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

    Func Input1Change()
    EndFunc ;==>Input1Change

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

    Func TreeView1Click()
    EndFunc ;==>TreeView1Click

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Problem mit Event-Aufruf beim einklappen eines TreeViewItems

    • Lars@Work
    • 22. Mai 2014 um 17:06

    Hallo AutoIt-Gemeinde,

    zur Zeit verzweifle ich an einem seltsamen TreeView-Event-Problem. Und zwar habe ich folgendes vor:

    Zur
    Software-Installation möchte ich mittels eines TreeViews dem Nutzer die
    Möglichkeit geben, alle gewünschten Komponenten selbst auszuwählen.
    Also in diesem TreeView werden einige Hauptkomponenten dargestellt. Und
    jede Hauptkomponente hat mehrere Sub-Komponenten. Das Auswahlverhalten
    soll wie folgt sein. Wählt der Nutzer eine Hauptkomponente, werden von
    dieser auch alle Sub-Komponenten ausgewählt. Soll heißen, alle
    Kind-Items werden auf Checked gesetzt. Weiter soll, wenn ein einzelnes
    Kind-Element ausgewählt wird, werden auch alle Eltern-Items davon auf
    Checked gesetzt.

    Die TreeViewItems erzeuge ich einfach mit:

    [autoit]


    $treeView = GUICtrlCreateTreeView(16, 192, 465, 326, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_CHECKBOXES))
    $mainItem1 = GUICtrlCreateTreeViewItem("Main 1", $treeView)
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $subItem1 = GUICtrlCreateTreeViewItem("Sub 1", $mainItem1 )
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")
    $subItem2 = GUICtrlCreateTreeViewItem("Sub 2", $mainItem1 )
    GUICtrlSetOnEvent(-1,"SelectionChangedChildItem")

    [/autoit]

    Und die Implementierung des Event-Handling ist wie folgt:

    [autoit]


    Func SelectionChangedChildItem()
    SetCheckedForAllChildItems(@GUI_CtrlId)
    SetCheckedForParentItem(@GUI_CtrlId)
    EndFunc

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

    Func SetCheckedForParentItem($hChildItem)
    Local $hParent = _GUICtrlTreeView_GetParentHandle ($TreeView1, $hChildItem)

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

    If $hParent <> 0 Then
    If _GUICtrlTreeView_GetChecked($TreeView1, $hChildItem) Then
    _GUICtrlTreeView_SetChecked($TreeView1, $hParent)
    Else
    Local $hChild
    Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParent)
    If $childCount > 0 Then
    Local $isAnyChildChecked = false
    For $i = 1 To $childCount
    If $i = 1 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParent)
    Else
    $hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
    EndIf
    $isAnyChildChecked = BitOR($isAnyChildChecked, _GUICtrlTreeView_GetChecked($TreeView1, $hChild))
    Next
    _GUICtrlTreeView_SetChecked($TreeView1, $hParent, $isAnyChildChecked)
    EndIF
    EndIF
    SetCheckedForParentItem($hParent)
    EndIf
    EndFunc

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

    Func SetCheckedForAllChildItems($hParentItem)
    Local $hChild
    Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParentItem)
    Local $isChecked = _GUICtrlTreeView_GetChecked($TreeView1, $hParentItem)

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

    If $childCount > 0 Then
    For $i = 1 To $childCount
    If $i = 1 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParentItem)
    Else
    $hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
    EndIf
    _GUICtrlTreeView_SetChecked($TreeView1, $hChild, $isChecked)
    SetCheckedForAllChildItems($hChild)
    Next
    EndIf
    EndFunc

    [/autoit]

    Das
    Setzten des Checked-Status funktioniert soweit ohne Probleme nur wenn
    ein Item im TreeView eingeklappt wird kommt es zu einem seltsamen
    Verhalten. Und zwar wird dann einmalig ebenfalls
    "SelectionChangedChildItem" aufgerufen. Und dieses führt dazu, dass wenn
    das Item welches eingeklappt wird auf Checked gesetzt ist, alle
    Kind-Items davon ebenfalls auf Checked gesetzt werden. Wobei dieses
    Verhalten nur beim !ersten! einklappen zu beobachten ist und auch nur,
    wenn vorher des Checked-Status der Kind-Elemente geändert wurde.

    Im obigen Beispiel wäre dies wie folgt:

    Ich
    habe eine Hauptkomponente "Main 1" mit zwei Sub-Komponenten "Sub 1" uns
    "Sub 2". Wird "Sub 1" nun auch Checked gesetzt wird ebenfalls "Main 1"
    auf Checked gesetzt. Soweit alles richtig. Nun setzte ich auch "Sub 2"
    auf Checked, nichts weiter passiert. Alles i.O. Nun deaktiviere ich "Sub
    1" wieder, also sind nur noch "Main 1" und "Sub 2" markiert bzw.
    Checked. Wenn ich nun "Main 1" einklappe wird
    "SelectionChangedChildItem" aufgerufen und da dieses den Checked-Status
    von "Main 1" abfragt werden "Sub 1" und "Sub 2" auf Checked gesetzt.
    Also meine Auswahl ist dahin. Nun kann ich "Main 1" aus- und einklappen
    wie ich will "SelectionChangedChildItem" wird nicht mehr aufgerufen.
    An
    diesem Punkt komme ich einfach nicht mehr weiter, es scheint ja nur
    einen Event für das ganze TreeViewItem-Handling zu geben bzw ich weiß
    nicht, ob man irgendwie im Event unterscheiden kann, ob das Item nur
    markiert bzw ein- oder ausgeklappt wurde.

    Könnt Ihr mir da vielleicht bei diesem Problem weiter helfen?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™