count number of gadgets in a container/gadget list

Just starting out? Need help? Post your questions and find answers here.
nsstudios
Enthusiast
Enthusiast
Posts: 274
Joined: Wed Aug 28, 2019 1:01 pm
Location: Serbia
Contact:

count number of gadgets in a container/gadget list

Post by nsstudios »

Hi all,

I am wondering if there's a way to get the number of gadgets in a container gadget or any gadget list.
I tried CountGadgetItems(#container), but that didn't work.

Any help would be greatly appreciated. :)
FlatEarth

Re: count number of gadgets in a container/gadget list

Post by FlatEarth »

This is my question too, but I need the #Gadget_Number of gadgets in the container. Is there a way?
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: count number of gadgets in a container/gadget list

Post by infratec »

You have to count them at creation or deletion.

And that's not a problem, since you are the only one who does this :wink:
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8433
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: count number of gadgets in a container/gadget list

Post by netmaestro »

On Windows you would use EnumChildWindows_() but if you're looking for crossplatform that's more involved.
BERESHEIT
FlatEarth

Re: count number of gadgets in a container/gadget list

Post by FlatEarth »

netmaestro wrote:On Windows you would use EnumChildWindows_() but if you're looking for crossplatform that's more involved.
Can we access the list of container controls? and search for it ourselves?
like this :

Code: Select all

ForEach ContainerGadget_1()
   .
   .
   .
Next
User avatar
chi
Addict
Addict
Posts: 1034
Joined: Sat May 05, 2007 5:31 pm
Location: Linz, Austria

Re: count number of gadgets in a container/gadget list

Post by chi »

You could slightly modify the code from mk-soft

Code: Select all

GadgetWindowID = GetAncestor_(GadgetID, #GA_ROOT) --> GadgetWindowID = GetAncestor_(GadgetID, #GA_PARENT)

ContainerGadget(99, 0, 0, 222, 200, #PB_Container_BorderLess) ... CloseGadgetList()

cnt = GetGadgetList(Gadgets()) --> cnt = GetGadgetList(Gadgets(), GadgetID(99))
These changes only work on Windows. Linux and Mac you have to figure out on your own ;)
Et cetera is my worst enemy
FlatEarth

Re: count number of gadgets in a container/gadget list

Post by FlatEarth »

@chi : Thanks, I will test it. :D
User avatar
Danilo
Addict
Addict
Posts: 3037
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: count number of gadgets in a container/gadget list

Post by Danilo »

On macOS it could/would look like this:

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import ""
CompilerElse
  ImportC ""
CompilerEndIf
    PB_Object_EnumerateStart(Object)
    PB_Object_EnumerateNext(Object,*ID.Integer)
    PB_Object_EnumerateAbort(Object)
    PB_Object_Count( Objects )
    
    PB_Object_FreeID           (*Object, DynamicOrArrayID)
    PB_Object_GetObject.i      (*Object, DynamicOrArrayID)
    PB_Object_GetObjectDirect  (*Object, DynamicOrArrayID)
    PB_Object_IsObject.i       (*Object, DynamicOrArrayID)
    PB_Object_GetOrAllocateID.i(*Object, ID)
    PB_Gadget_Objects.i
  EndImport

Structure PB_Gadget
    *Gadget
    *Container
    *Functions
    UserData.i
    WindowID.i
    Type.l
    Flags.l
EndStructure

EnableExplicit

Procedure.i GetGadgetChilds(gadget, List childs.i())
    Protected gadgetID = -1, *theGadget.PB_Gadget
    Protected count, containerID = GadgetID(gadget)
    ClearList( childs() )
    If PB_Gadget_Objects And containerID
        PB_Object_EnumerateStart(PB_Gadget_Objects)
        While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadgetID)
            If gadgetID <> -1 And IsGadget(gadgetID)
                *theGadget = PB_Object_GetObject(PB_Gadget_Objects,gadgetID)
                If *theGadget And *theGadget\Gadget <> containerID
                    If CocoaMessage(0, *theGadget\Gadget, "isDescendantOf:", containerID)
                        count + 1
                        If AddElement( childs() )
                            childs() = gadgetID
                        EndIf
                    EndIf
                EndIf
            EndIf
            gadgetID = -1
        Wend
        PB_Object_EnumerateAbort(PB_Gadget_Objects)
    EndIf
    ProcedureReturn count
EndProcedure

NewList childGadgets.i()

If OpenWindow(0, 0, 0, 322, 250, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
          ButtonGadget(3, 10, 15, 80, 24, "Button 1")
          ButtonGadget(5, 95, 15, 80, 24, "Button 2")
          ListViewGadget(9, 10,50,286,70)
      CloseGadgetList()
      ListViewGadget(11, 10, 150,302,70)
          
      If GetGadgetChilds(0, childGadgets())
          ForEach childGadgets()
              Debug "Found child gadget: " + childGadgets() ; found gadgets 3, 5, 9
          Next
      EndIf
      
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: count number of gadgets in a container/gadget list

Post by RASHAD »

Coded by Danilo
Modified by RASHAD

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import ""
CompilerElse
  ImportC ""
CompilerEndIf
  PB_Object_EnumerateStart(Object)
  PB_Object_EnumerateNext(Object,*ID.Integer)
  PB_Object_EnumerateAbort(Object)
  PB_Object_Count( Objects )
 
  PB_Object_FreeID           (*Object, DynamicOrArrayID)
  PB_Object_GetObject.i      (*Object, DynamicOrArrayID)
  PB_Object_GetObjectDirect  (*Object, DynamicOrArrayID)
  PB_Object_IsObject.i       (*Object, DynamicOrArrayID)
  PB_Object_GetOrAllocateID.i(*Object, ID)
  PB_Gadget_Objects.i
EndImport

Structure PB_Gadget
    *Gadget
    *Container
    *Functions
    UserData.i
    WindowID.i
    Type.l
    Flags.l
EndStructure

EnableExplicit

Procedure.i GetGadgetChilds(gadget, List childs.i())
    Protected gadgetID = -1, *theGadget.PB_Gadget
    Protected count, containerID = GadgetID(gadget)
    ClearList( childs() )
    If PB_Gadget_Objects And containerID
      PB_Object_EnumerateStart(PB_Gadget_Objects)
      While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadgetID)
        If gadgetID <> -1 And IsGadget(gadgetID)
          *theGadget = PB_Object_GetObject(PB_Gadget_Objects,gadgetID)
            If *theGadget And *theGadget\Gadget <> containerID
              CompilerIf #PB_Compiler_OS = #PB_OS_Windows
                If GetAncestor_(*theGadget\Gadget, #GA_PARENT) = containerID
              CompilerElse 
                If CocoaMessage(0, *theGadget\Gadget, "isDescendantOf:", containerID)
              CompilerEndIf
                count + 1
                If AddElement( childs() )
                    childs() = gadgetID
                EndIf
            EndIf
          EndIf
        EndIf
        gadgetID = -1
      Wend
      PB_Object_EnumerateAbort(PB_Gadget_Objects)
    EndIf  
    ProcedureReturn count
EndProcedure

NewList childGadgets.i()

If OpenWindow(0, 0, 0, 322, 250, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
          ButtonGadget(3, 10, 15, 80, 24, "Button 1")
          ButtonGadget(5, 95, 15, 80, 24, "Button 2")
          ListViewGadget(9, 10,50,286,70)
      CloseGadgetList()
      ListViewGadget(11, 10, 150,302,70)
         
      If GetGadgetChilds(0, childGadgets())
        ForEach childGadgets()
          Debug "Found child gadget: " + childGadgets() ; found gadgets 3, 5, 9
        Next
        Debug "No. of founded child gadget: " + ListSize(childGadgets.i())
      EndIf
      ClearList(childGadgets())
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Egypt my love
FlatEarth

Re: count number of gadgets in a container/gadget list

Post by FlatEarth »

@Danilo & @RASHAD : Thank you very much, this is great. :)
User avatar
VB6_to_PBx
Enthusiast
Enthusiast
Posts: 625
Joined: Mon May 09, 2011 9:36 am

Re: count number of gadgets in a container/gadget list

Post by VB6_to_PBx »

thank you RASHAD , for your Code
i modified your Code a little :

Global.i containerID
and
Debug "Found child gadget: " + childGadgets() + Space(3) + "in containerID = " + containerID ; found gadgets 3, 5, 9
and
Debug "No. of found child gadgets = " + ListSize(childGadgets.i())

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import ""
CompilerElse
  ImportC ""
CompilerEndIf
  PB_Object_EnumerateStart(Object)
  PB_Object_EnumerateNext(Object,*ID.Integer)
  PB_Object_EnumerateAbort(Object)
  PB_Object_Count( Objects )
 
  PB_Object_FreeID           (*Object, DynamicOrArrayID)
  PB_Object_GetObject.i      (*Object, DynamicOrArrayID)
  PB_Object_GetObjectDirect  (*Object, DynamicOrArrayID)
  PB_Object_IsObject.i       (*Object, DynamicOrArrayID)
  PB_Object_GetOrAllocateID.i(*Object, ID)
  PB_Gadget_Objects.i
EndImport

Structure PB_Gadget
    *Gadget
    *Container
    *Functions
    UserData.i
    WindowID.i
    Type.l
    Flags.l
EndStructure

EnableExplicit

Global.i containerID

Procedure.i GetGadgetChilds(gadget, List childs.i())
    Protected gadgetID = -1, *theGadget.PB_Gadget
    Protected count
    containerID = GadgetID(gadget)
    ClearList( childs() )
    If PB_Gadget_Objects And containerID
      PB_Object_EnumerateStart(PB_Gadget_Objects)
      While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadgetID)
        If gadgetID <> -1 And IsGadget(gadgetID)
          *theGadget = PB_Object_GetObject(PB_Gadget_Objects,gadgetID)
            If *theGadget And *theGadget\Gadget <> containerID
              CompilerIf #PB_Compiler_OS = #PB_OS_Windows
                If GetAncestor_(*theGadget\Gadget, #GA_PARENT) = containerID
              CompilerElse
                If CocoaMessage(0, *theGadget\Gadget, "isDescendantOf:", containerID)
              CompilerEndIf
                count + 1
                If AddElement( childs() )
                    childs() = gadgetID
                EndIf
            EndIf
          EndIf
        EndIf
        gadgetID = -1
      Wend
      PB_Object_EnumerateAbort(PB_Gadget_Objects)
    EndIf 
    ProcedureReturn count
EndProcedure

NewList childGadgets.i()

If OpenWindow(0, 0, 0, 322, 250, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
          ButtonGadget(3, 10, 15, 80, 24, "Button 1")
          ButtonGadget(5, 95, 15, 80, 24, "Button 2")
          ListViewGadget(9, 10,50,286,70)
      CloseGadgetList()
      ListViewGadget(11, 10, 150,302,70)
         
      If GetGadgetChilds(0, childGadgets())
        ForEach childGadgets()
         Debug "Found child gadget: " + childGadgets() + Space(3) + "in containerID = " + containerID ; found gadgets 3, 5, 9
        Next
        Debug "No. of found child gadgets = " + ListSize(childGadgets.i())
      EndIf
      ClearList(childGadgets())
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


 
PureBasic .... making tiny electrons do what you want !

"With every mistake we must surely be learning" - George Harrison
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: count number of gadgets in a container/gadget list

Post by RASHAD »

Hi VB6_to_PBx
It is not my code
It's Danilo :)
Next only for Windows

Code: Select all

Global count ,containerID

Procedure Enum(hWnd, lParam)
  gad = GetDlgCtrlID_(hWnd)
  If gad <> containerID And GetAncestor_(GadgetID(gad), #GA_PARENT) = GadgetID(containerID)
    count+1
  EndIf
  ProcedureReturn 1
EndProcedure

If OpenWindow(0, 0, 0, 322, 250, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
    ButtonGadget(3, 10, 15, 80, 24, "Button 1")
    ButtonGadget(5, 95, 15, 80, 24, "Button 2")
    ListViewGadget(9, 10,50,286,70)
  CloseGadgetList()
  ListViewGadget(11, 10, 150,302,70)
  containerID = 0
  EnumChildWindows_(WindowID(0), @Enum(), 0)
  Debug count

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Edit : Bug fixed

Very simple is not it ? :P
Last edited by RASHAD on Fri May 29, 2020 10:30 pm, edited 1 time in total.
Egypt my love
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8433
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: count number of gadgets in a container/gadget list

Post by netmaestro »

Once you get your #gadget(s) from the Danilo/Rashad code you might want to know what they are. Use GadgetTypeString( Str( GadgetType( #gadget ) ) ) to get a string representation of the type of gadget it is. Here's a windows-only example, though the GadgetTypeString code is cross-platform:

Code: Select all

Global NewMap GadgetTypeString.s()

GadgetTypeString(Str(#PB_GadgetType_Button))        = "Button"
GadgetTypeString(Str(#PB_GadgetType_ButtonImage))   = "ButtonImage"
GadgetTypeString(Str(#PB_GadgetType_Calendar))      = "Calendar" 
GadgetTypeString(Str(#PB_GadgetType_Canvas))        = "Canvas" 
GadgetTypeString(Str(#PB_GadgetType_CheckBox))      = "CheckBox" 
GadgetTypeString(Str(#PB_GadgetType_ComboBox))      = "ComboBox" 
GadgetTypeString(Str(#PB_GadgetType_Container))     = "Container" 
GadgetTypeString(Str(#PB_GadgetType_Date))          = "Date" 
GadgetTypeString(Str(#PB_GadgetType_Editor))        = "Editor" 
GadgetTypeString(Str(#PB_GadgetType_ExplorerCombo)) = "ExplorerCombo" 
GadgetTypeString(Str(#PB_GadgetType_ExplorerList))  = "ExplorerList" 
GadgetTypeString(Str(#PB_GadgetType_ExplorerTree))  = "ExplorerTree" 
GadgetTypeString(Str(#PB_GadgetType_Frame))         = "Frame" 
GadgetTypeString(Str(#PB_GadgetType_HyperLink))     = "HyperLink" 
GadgetTypeString(Str(#PB_GadgetType_Image))         = "Image" 
GadgetTypeString(Str(#PB_GadgetType_IPAddress))     = "IPAddress" 
GadgetTypeString(Str(#PB_GadgetType_ListIcon))      = "ListIcon " 
GadgetTypeString(Str(#PB_GadgetType_ListView))      = "ListView " 
GadgetTypeString(Str(#PB_GadgetType_MDI))           = "MDI" 
GadgetTypeString(Str(#PB_GadgetType_Option))        = "Option" 
GadgetTypeString(Str(#PB_GadgetType_Panel))         = "Panel" 
GadgetTypeString(Str(#PB_GadgetType_ProgressBar))   = "ProgressBar" 
GadgetTypeString(Str(#PB_GadgetType_Scintilla))     = "Scintilla" 
GadgetTypeString(Str(#PB_GadgetType_ScrollArea))    = "ScrollArea" 
GadgetTypeString(Str(#PB_GadgetType_ScrollBar))     = "ScrollBar" 
GadgetTypeString(Str(#PB_GadgetType_Shortcut))      = "Shortcut" 
GadgetTypeString(Str(#PB_GadgetType_Spin))          = "Spin" 
GadgetTypeString(Str(#PB_GadgetType_Splitter))      = "Splitter" 
GadgetTypeString(Str(#PB_GadgetType_String))       = "String" 
GadgetTypeString(Str(#PB_GadgetType_Text))         = "Text" 
GadgetTypeString(Str(#PB_GadgetType_TrackBar))     = "TrackBar" 
GadgetTypeString(Str(#PB_GadgetType_Tree))         = "Tree"         
GadgetTypeString(Str(#PB_GadgetType_Web))          = "Web"          
GadgetTypeString(Str(#PB_GadgetType_Unknown))      = "Unknown"      

Procedure ListContainerChildren(hwnd, lparam)
  Debug Str(GetDlgCtrlID_(hwnd))+" "+GadgetTypeString(Str(GadgetType(GetDlgCtrlID_(hwnd))))
  ProcedureReturn #True
EndProcedure

Procedure ButtonHandler()
  EnumChildWindows_(GadgetID(0), @ListContainerChildren(), 0)
EndProcedure

OpenWindow(0,0,0,800,600,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ContainerGadget(0,0,0,800,600)
TextGadget(#PB_Any,8,14,100,20,"Show Gadgets:")
BUTTON=ButtonGadget(#PB_Any,102,10,100,25,"Go!")
EditorGadget(#PB_Any,10,40,400,300) 
ComboBoxGadget(#PB_Any,420,40,200,20)
ID=TreeGadget(#PB_Any,420,100,160,160)
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
CloseGadgetList()
BindGadgetEvent(BUTTON, @ButtonHandler())

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
BERESHEIT
BarryG
Addict
Addict
Posts: 3324
Joined: Thu Apr 18, 2019 8:17 am

Re: count number of gadgets in a container/gadget list

Post by BarryG »

nsstudios wrote:I am wondering if there's a way to get the number of gadgets in a container gadget or any gadget list.
You created them, so you could just keep track in a variable. Easy and cross-platform.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8433
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: count number of gadgets in a container/gadget list

Post by netmaestro »

Sure BarryG, that's true. But reading and listing them by type comes in very handy when you're doing say, a visual designer.
BERESHEIT
Post Reply