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!
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!
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.
#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>
$Debug_TV = False
Opt("GUIOnEventMode", 1)
$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")
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")
While 1
Sleep(100)
WEnd
Func SelectionChangedChildItem()
SetCheckedForAllChildItems(@GUI_CtrlId)
SetCheckedForParentItem(@GUI_CtrlId)
EndFunc
Func SetCheckedForParentItem($hChildItem)
Local $hParent = _GUICtrlTreeView_GetParentHandle ($TreeView1, $hChildItem)
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
Func SetTreeViewItemCheckedState($treeViewCtrl, $treeViewItem, $isChecked)
If _GUICtrlTreeView_GetChecked($treeViewCtrl, $treeViewItem) <> $isChecked Then
_GUICtrlTreeView_SetChecked($treeViewCtrl, $treeViewItem, $isChecked)
EndIf
EndFunc
Func SetCheckedForAllChildItems($hParentItem)
Local $hChild
Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParentItem)
Local $isChecked = _GUICtrlTreeView_GetChecked($TreeView1, $hParentItem)
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
Func OnCloseSecondary()
EndFunc
Func Form1_1Close()
Exit
EndFunc ;==>Form1_1Close
Func Form1_1Maximize()
EndFunc ;==>Form1_1Maximize
Func Form1_1Minimize()
EndFunc ;==>Form1_1Minimize
Func Form1_1Restore()
EndFunc ;==>Form1_1Restore
Func Input1Change()
EndFunc ;==>Input1Change
Func TreeView1Click()
EndFunc ;==>TreeView1Click
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")
Und die Implementierung des Event-Handling ist wie folgt:
[autoit]
Func SelectionChangedChildItem()
SetCheckedForAllChildItems(@GUI_CtrlId)
SetCheckedForParentItem(@GUI_CtrlId)
EndFunc
Func SetCheckedForParentItem($hChildItem)
Local $hParent = _GUICtrlTreeView_GetParentHandle ($TreeView1, $hChildItem)
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
Func SetCheckedForAllChildItems($hParentItem)
Local $hChild
Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParentItem)
Local $isChecked = _GUICtrlTreeView_GetChecked($TreeView1, $hParentItem)
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
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?