PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » TreeGadget с параметром #PB_Tree_CheckBoxes


TreeGadget с параметром #PB_Tree_CheckBoxes

Сообщений 1 страница 10 из 10

1

Вопрос стоит в следующем: "Как сделать так, чтобы при выделении галочкой элемента дерева выделялись все его "подкатегории", как будто бы при инсталляции какой-нибудь программы?

Отредактировано Тигрёнок (31.07.2011 20:04:09)

0

2

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

0

3

Не совсем. Этот способ подходит только для конкретного случая, когда заранее известно какой 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)

0

4

Код:
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

0

5

mirashic
Похоже на правду. Но недостатки указал Тигрёнок
Тигрёнок
У тебя глючит - выбор всех подкатегорий работает, а отмена нет.
Тем более, что при отмене все подкатегории должны стать "не активны"( ну если как в инсталяторах)
Пётр
По ходу ты вообще не понял, что надо - у тебя вообще не работает ни выбор ни отмена.

Как сделать - не знаю. Лень сегодня напрягаться. Просто тестирую... :rolleyes:

Отредактировано ВиниПур (01.08.2011 13:30:47)

0

6

Пётр выложил отличную идею - сканировать только часть дерева. за счёт того, что заранее известен выделенный item и цикл прерывается в нужном месте)

0

7

ВиниПур написал(а):

у тебя вообще не работает ни выбор ни отмена.

Работает, только нужно сначала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.

0

8

Пётр написал(а):

Работает, только нужно скачала щелкнуть по пункту, а потом ставить или убирать галочку.
Иначе GetGadgetState() возвращает номер не того пункта, в котором установили или убрали галочку.

О точно, если щелкнуть, то работает! :tomato:

0

9

Эх.. Не объяснять же эту истину каждому юзеру...
Можно попробовать написать процедуру которая отслеживала бы появление новой галочки. Например, создать массив в который записывалась бы информация про поставленные отметки, а в последствии сравнивалась с текущим состоянием дерева, но это сильно сказалось бы на производительности(

0

10

А на лине ненадо щелкать, и так работает(косяк винды?)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » TreeGadget с параметром #PB_Tree_CheckBoxes