Вопрос стоит в следующем: "Как сделать так, чтобы при выделении галочкой элемента дерева выделялись все его "подкатегории", как будто бы при инсталляции какой-нибудь программы?
Отредактировано Тигрёнок (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 EndIf
mirashic
Похоже на правду. Но недостатки указал Тигрёнок
Тигрёнок
У тебя глючит - выбор всех подкатегорий работает, а отмена нет.
Тем более, что при отмене все подкатегории должны стать "не активны"( ну если как в инсталяторах)
Пётр
По ходу ты вообще не понял, что надо - у тебя вообще не работает ни выбор ни отмена.
Как сделать - не знаю. Лень сегодня напрягаться. Просто тестирую...
Отредактировано ВиниПур (01.08.2011 13:30:47)
Пётр выложил отличную идею - сканировать только часть дерева. за счёт того, что заранее известен выделенный item и цикл прерывается в нужном месте)
у тебя вообще не работает ни выбор ни отмена.
Работает, только нужно сначала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.
Работает, только нужно скачала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.
О точно, если щелкнуть, то работает!
Эх.. Не объяснять же эту истину каждому юзеру...
Можно попробовать написать процедуру которая отслеживала бы появление новой галочки. Например, создать массив в который записывалась бы информация про поставленные отметки, а в последствии сравнивалась с текущим состоянием дерева, но это сильно сказалось бы на производительности(
А на лине ненадо щелкать, и так работает(косяк винды?)
Вы здесь » PureBasic - форум » Вопросы по PureBasic » TreeGadget с параметром #PB_Tree_CheckBoxes