Вопрос стоит в следующем: "Как сделать так, чтобы при выделении галочкой элемента дерева выделялись все его "подкатегории", как будто бы при инсталляции какой-нибудь программы?
Отредактировано Тигрёнок (31.07.2011 20:04:09)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » TreeGadget с параметром #PB_Tree_CheckBoxes
Вопрос стоит в следующем: "Как сделать так, чтобы при выделении галочкой элемента дерева выделялись все его "подкатегории", как будто бы при инсталляции какой-нибудь программы?
Отредактировано Тигрёнок (31.07.2011 20:04:09)
CodeArchiv.
Это?
; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3367&highlight=
; Author: nicolaus (updated for PB4.00 by blbltheworm)
; Date: 08. January 2004
; OS: Windows
; Demo: Yes
#File_TreeGadget = 0
OpenWindow(0,100,100,160,550, "Treegadget-test",#PB_Window_TitleBar | #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
TreeGadget(#File_TreeGadget,5,5,150,540,#PB_Tree_CheckBoxes)
AddGadgetItem(#File_TreeGadget,0,"Audio")
AddGadgetItem(#File_TreeGadget,1,"mp3",0,1)
AddGadgetItem(#File_TreeGadget,2,"mp2",0,1)
AddGadgetItem(#File_TreeGadget,3,"wav",0,1)
AddGadgetItem(#File_TreeGadget,4,"wma",0,1)
AddGadgetItem(#File_TreeGadget,5,"asf",0,1)
AddGadgetItem(#File_TreeGadget,6,"ogg",0,1)
AddGadgetItem(#File_TreeGadget,7,"mid",0,1)
AddGadgetItem(#File_TreeGadget,8,"rmi",0,1)
AddGadgetItem(#File_TreeGadget,9,"sgt",0,1)
AddGadgetItem(#File_TreeGadget,10,"it",0,1)
AddGadgetItem(#File_TreeGadget,11,"xm",0,1)
AddGadgetItem(#File_TreeGadget,12,"s3m",0,1)
AddGadgetItem(#File_TreeGadget,13,"mod",0,1)
AddGadgetItem(#File_TreeGadget,14,"Video")
AddGadgetItem(#File_TreeGadget,15,"avi",0,1)
AddGadgetItem(#File_TreeGadget,16,"mpg",0,1)
AddGadgetItem(#File_TreeGadget,17,"mpeg",0,1)
AddGadgetItem(#File_TreeGadget,18,"wmv",0,1)
AddGadgetItem(#File_TreeGadget,19,"qt",0,1)
AddGadgetItem(#File_TreeGadget,20,"dat",0,1)
AddGadgetItem(#File_TreeGadget,21,"m2p",0,1)
AddGadgetItem(#File_TreeGadget,22,"Picures")
AddGadgetItem(#File_TreeGadget,23,"bmp",0,1)
AddGadgetItem(#File_TreeGadget,24,"jpg",0,1)
AddGadgetItem(#File_TreeGadget,25,"jpeg",0,1)
AddGadgetItem(#File_TreeGadget,26,"png",0,1)
AddGadgetItem(#File_TreeGadget,27,"tga",0,1)
AddGadgetItem(#File_TreeGadget,28,"tiff",0,1)
AddGadgetItem(#File_TreeGadget,29,"ico",0,1)
SetGadgetItemState(#File_TreeGadget,0,#PB_Tree_Expanded)
SetGadgetItemState(#File_TreeGadget,14,#PB_Tree_Expanded)
SetGadgetItemState(#File_TreeGadget,22,#PB_Tree_Expanded)
Repeat
Delay(1)
Event = WindowEvent()
If Event = #PB_Event_Gadget
GadgetID = EventGadget()
If GadgetID = #File_TreeGadget
If GetGadgetItemState(#File_TreeGadget,0) & #PB_Tree_Checked
For i = 1 To 13
SetGadgetItemState(#File_TreeGadget,i,#PB_Tree_Checked)
Next
Else
For i = 1 To 13
SetGadgetItemState(#File_TreeGadget,i,0)
Next
EndIf
If GetGadgetItemState(#File_TreeGadget,14) & #PB_Tree_Checked
For i = 15 To 21
SetGadgetItemState(#File_TreeGadget,i,#PB_Tree_Checked)
Next
Else
For i = 15 To 21
SetGadgetItemState(#File_TreeGadget,i,0)
Next
EndIf
If GetGadgetItemState(#File_TreeGadget,22) & #PB_Tree_Checked
For i = 23 To 29
SetGadgetItemState(#File_TreeGadget,i,#PB_Tree_Checked)
Next
Else
For i = 23 To 29
SetGadgetItemState(#File_TreeGadget,i,0)
Next
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndНе совсем. Этот способ подходит только для конкретного случая, когда заранее известно какой item является "подкатегорией".
Нужно что-то вроде этого
Procedure ScanTree(TreeID)
GI_Pos=CountGadgetItems(TreeID)
;{ сканирует и отмечает галочкой подкатегории
For mn=1 To GI_Pos
SL_Iiem_G=GetGadgetItemAttribute(TreeID, mn, #PB_Tree_SubLevel, 0)
SL_Iiem_L=GetGadgetItemAttribute(TreeID, mn+1, #PB_Tree_SubLevel, 0)
n=mn
If GetGadgetItemState(TreeID,mn) & #PB_Tree_Checked
While SL_Iiem_G < SL_Iiem_L
SetGadgetItemState(TreeID,n,#PB_Tree_Checked)
n=n+1
SL_Iiem_L=GetGadgetItemAttribute(TreeID, n, #PB_Tree_SubLevel, 0)
Wend
EndIf
;mn+n ; Эта строчка нужна чтобы не сканировать по много раз одно и тоже
Next
;}
EndProcedure
#File_TreeGadget = 0
OpenWindow(0,100,100,160,550, "Treegadget-test",#PB_Window_TitleBar | #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
TreeGadget(#File_TreeGadget,5,5,150,540,#PB_Tree_CheckBoxes)
AddGadgetItem(#File_TreeGadget,0,"Audio", 0,0)
AddGadgetItem(#File_TreeGadget,1,"mp3",0,0)
AddGadgetItem(#File_TreeGadget,2,"mp2",0,2)
AddGadgetItem(#File_TreeGadget,3,"wav",0,2)
AddGadgetItem(#File_TreeGadget,4,"wma",0,2)
AddGadgetItem(#File_TreeGadget,5,"asf",0,2)
AddGadgetItem(#File_TreeGadget,6,"ogg",0,3)
AddGadgetItem(#File_TreeGadget,7,"mid",0,3)
AddGadgetItem(#File_TreeGadget,8,"rmi",0,3)
AddGadgetItem(#File_TreeGadget,9,"sgt",0,4)
AddGadgetItem(#File_TreeGadget,10,"it",0,4)
AddGadgetItem(#File_TreeGadget,11,"xm",0,4)
AddGadgetItem(#File_TreeGadget,12,"s3m",0,5)
AddGadgetItem(#File_TreeGadget,13,"mod",0,5)
AddGadgetItem(#File_TreeGadget,14,"Video", 0,5)
AddGadgetItem(#File_TreeGadget,15,"avi",0,1)
AddGadgetItem(#File_TreeGadget,16,"mpg",0,1)
AddGadgetItem(#File_TreeGadget,17,"mpeg",0,1)
AddGadgetItem(#File_TreeGadget,18,"wmv",0,2)
AddGadgetItem(#File_TreeGadget,19,"qt",0,2)
AddGadgetItem(#File_TreeGadget,20,"dat",0,2)
AddGadgetItem(#File_TreeGadget,21,"m2p",0,3)
AddGadgetItem(#File_TreeGadget,22,"Picures", 0,3)
AddGadgetItem(#File_TreeGadget,23,"bmp",0,3)
AddGadgetItem(#File_TreeGadget,24,"jpg",0,4)
AddGadgetItem(#File_TreeGadget,25,"jpeg",0,4)
AddGadgetItem(#File_TreeGadget,26,"png",0,4)
AddGadgetItem(#File_TreeGadget,27,"tga",0,5)
AddGadgetItem(#File_TreeGadget,28,"tiff",0,5)
AddGadgetItem(#File_TreeGadget,29,"ico",0,5)
SetGadgetItemState(#File_TreeGadget,0,#PB_Tree_Expanded)
SetGadgetItemState(#File_TreeGadget,14,#PB_Tree_Expanded)
SetGadgetItemState(#File_TreeGadget,22,#PB_Tree_Expanded)
Repeat
Event = WindowEvent()
If Event = #PB_Event_Gadget
ScanTree(#File_TreeGadget)
EndIf
Until Event = #PB_Event_CloseWindow
EndЗдесь главную роль выполняет процедура, которая подходит для любых "деревьев". Например, если дерево загружается из файла.
Только, вот, мой вариант пока далёк от идеала.. Нужен новый взгляд на эту задачу, чтобы исключить ошибки )
Отредактировано Тигрёнок (01.08.2011 09:49:41)
If OpenWindow(0, 0, 0, 185, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TreeGadget(1, 18, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines) ; TreeGadget with Checkboxes + NoLines
ID = 1
For a = 0 To 10
AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0) ; ImageID(x) as 4th parameter
AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1) ; These are on the 1st sublevel
AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
Next
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 1
If EventType() = #PB_EventType_LeftClick
Count = CountGadgetItems(1)
Pos = GetGadgetState(1)
If Pos>=0
x = GetGadgetItemAttribute(1, Pos, #PB_Tree_SubLevel)
State = GetGadgetItemState(1, Pos) & #PB_Tree_Checked
For i=Pos+1 To Count
If GetGadgetItemAttribute(1, i, #PB_Tree_SubLevel) > x
If State
SetGadgetItemState(1,i, GetGadgetItemState(1, Pos) | #PB_Tree_Checked)
Else
SetGadgetItemState(1,i, GetGadgetItemState(1, Pos) & ~#PB_Tree_Checked)
EndIf
Else
Break
EndIf
Next i
EndIf
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIfmirashic
Похоже на правду. Но недостатки указал Тигрёнок
Тигрёнок
У тебя глючит - выбор всех подкатегорий работает, а отмена нет.
Тем более, что при отмене все подкатегории должны стать "не активны"( ну если как в инсталяторах)
Пётр
По ходу ты вообще не понял, что надо - у тебя вообще не работает ни выбор ни отмена.
Как сделать - не знаю. Лень сегодня напрягаться. Просто тестирую... 
Отредактировано ВиниПур (01.08.2011 13:30:47)
Пётр выложил отличную идею - сканировать только часть дерева. за счёт того, что заранее известен выделенный item и цикл прерывается в нужном месте)
у тебя вообще не работает ни выбор ни отмена.
Работает, только нужно сначала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.
Работает, только нужно скачала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.
О точно, если щелкнуть, то работает! 
Эх.. Не объяснять же эту истину каждому юзеру...
Можно попробовать написать процедуру которая отслеживала бы появление новой галочки. Например, создать массив в который записывалась бы информация про поставленные отметки, а в последствии сравнивалась с текущим состоянием дерева, но это сильно сказалось бы на производительности(
А на лине ненадо щелкать, и так работает(косяк винды?)
Вы здесь » PureBasic - форум » Вопросы по PureBasic » TreeGadget с параметром #PB_Tree_CheckBoxes