Was lange währt, wird endlich gut:Ghosty1967 hat geschrieben:- [x] Kalibriersoftware
......[x] Dokumentvorlagen
......[x] Gerätedaten
......[x] Beispiele
+[x] Prüfsystem
- [ ] Auswertung
......[ ] Tabellenvorlagen
......[ ] Referenzdaten
......[ ] Beispiele
usw...
Nun möchte ich gerne, das z.B. beim wählen/abwählen eines Nodes alle zugehörigen SubNodes mit gewählt/abgewählt werden.
Außerdem frage ich mich, wieso der Focus bei einem Klick auf irgendeine Checkbox immer wieder
zu vorherigen Node/SubNode zurückkehrt und nicht auf dem gewählten bleibt. Wenn ich auf den Nodetext klicke, geht es doch auch?
Kann mir vielleicht jemand praktisch weiterhelfen![]()

Code: Alles auswählen
Declare.L CheckForChildItems(ItemHandle.L)
Declare TreeCallback(WindowHandle.L, Msg.L, wParam.L, lParam.L)
Define SelectionState.L
If OpenWindow(0, 0, 0, 220, 230, "Alle Subnodes aus-/abwählen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
TreeGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, #PB_Tree_CheckBoxes)
AddGadgetItem(0, -1, "Kalibriersoftware", 0, 0)
AddGadgetItem(0, -1, "Dokumentvorlagen", 0, 1)
AddGadgetItem(0, -1, "Gerätedaten", 0, 1)
AddGadgetItem(0, -1, "Beispiele", 0, 1)
SetGadgetItemState(0, 0, #PB_Tree_Expanded)
AddGadgetItem(0, -1, "Prüfsystem", 0, 0)
AddGadgetItem(0, -1, "Auswertung", 0, 0)
AddGadgetItem(0, -1, "Tabellenvorlagen", 0, 1)
AddGadgetItem(0, -1, "Referenzdaten", 0, 1)
AddGadgetItem(0, -1, "Beispiele", 0, 1)
SetGadgetItemState(0, 5, #PB_Tree_Expanded)
SetWindowCallback(@TreeCallback())
Repeat
WindowEvent = WaitWindowEvent()
Until WindowEvent = #PB_Event_CloseWindow
EndIf
EndIf
End
Procedure TreeCallback(WindowHandle.L, Msg.L, wParam.L, lParam.L)
Shared SelectionState.L
Protected ItemHandle.L
Protected *NMTV.NM_TREEVIEW
Protected TVHitTest.TV_HITTESTINFO
Protected TVItem.TV_ITEM
Protected WantedSelectionState.L
If Msg = #WM_NOTIFY
*NMTV = lParam
If *NMTV\Hdr\hwndFrom = GadgetID(0)
If *NMTV\Hdr\Code = #NM_CLICK
TVHitTest\Pt\x = WindowMouseX(0) - GadgetX(0)
TVHitTest\Pt\y = WindowMouseY(0) - GadgetY(0)
ItemHandle = SendMessage_(GadgetID(0), #TVM_HITTEST, 0, @TVHitTest)
If ItemHandle <> 0
If TVHitTest\Flags = #TVHT_ONITEMSTATEICON
SendMessage_(GadgetID(0), #TVM_SELECTITEM, #TVGN_CARET, TVHitTest\hItem)
If CheckForChildItems(ItemHandle)
WantedSelectionState = SelectionState
SendMessage_(GadgetID(0), #TVM_EXPAND, #TVE_EXPAND, ItemHandle)
ItemHandle = SendMessage_(GadgetID(0), #TVM_GETNEXTITEM, #TVGN_CHILD, ItemHandle)
While ItemHandle <> 0
If CheckForChildItems(ItemHandle) = #False
TVItem\Mask = #TVIF_HANDLE | #TVIF_STATE
TVItem\hItem = ItemHandle
TVItem\StateMask = #TVIS_STATEIMAGEMASK
TVItem\State = WantedSelectionState
SendMessage_(GadgetID(0), #TVM_SETITEM, 0, @TVItem)
EndIf
ItemHandle = SendMessage_(GadgetID(0), #TVM_GETNEXTITEM, #TVGN_NEXT, ItemHandle)
Wend
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure.L CheckForChildItems(ItemHandle.L)
Shared SelectionState.L
Protected TVItem.TV_ITEM
TVItem\Mask = #TVIF_CHILDREN | #TVIF_HANDLE | #TVIF_STATE
TVItem\hItem = ItemHandle
TVItem\StateMask = #TVIS_STATEIMAGEMASK
SendMessage_(GadgetID(0), #TVM_GETITEM, 0, @TVItem)
; Checkbox vor Item
; 4096 = ohne Häkchen, 8192 = mit Häkchen
If (TVItem\State >> 12) - 1
SelectionState = 4096
Else
SelectionState = 8192
EndIf
If TVItem\cChildren = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure