count number of gadgets in a container/gadget list
count number of gadgets in a container/gadget list
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.
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.
Re: count number of gadgets in a container/gadget list
This is my question too, but I need the #Gadget_Number of gadgets in the container. Is there a way?
Re: count number of gadgets in a container/gadget list
You have to count them at creation or deletion.
And that's not a problem, since you are the only one who does this
And that's not a problem, since you are the only one who does this
- netmaestro
- 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
On Windows you would use EnumChildWindows_() but if you're looking for crossplatform that's more involved.
BERESHEIT
Re: count number of gadgets in a container/gadget list
Can we access the list of container controls? and search for it ourselves?netmaestro wrote:On Windows you would use EnumChildWindows_() but if you're looking for crossplatform that's more involved.
like this :
Code: Select all
ForEach ContainerGadget_1()
.
.
.
Next
Re: count number of gadgets in a container/gadget list
You could slightly modify the code from mk-soft
These changes only work on Windows. Linux and Mac you have to figure out on your own
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))
Et cetera is my worst enemy
Re: count number of gadgets in a container/gadget list
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
Re: count number of gadgets in a container/gadget list
Coded by Danilo
Modified by RASHAD
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
Re: count number of gadgets in a container/gadget list
@Danilo & @RASHAD : Thank you very much, this is great.
- VB6_to_PBx
- Enthusiast
- Posts: 625
- Joined: Mon May 09, 2011 9:36 am
Re: count number of gadgets in a container/gadget list
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())
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
Re: count number of gadgets in a container/gadget list
Hi VB6_to_PBx
It is not my code
It's Danilo
Next only for Windows
Edit : Bug fixed
Very simple is not it ?
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
Very simple is not it ?
Last edited by RASHAD on Fri May 29, 2020 10:30 pm, edited 1 time in total.
Egypt my love
- netmaestro
- 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
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
Re: count number of gadgets in a container/gadget list
You created them, so you could just keep track in a variable. Easy and cross-platform.nsstudios wrote:I am wondering if there's a way to get the number of gadgets in a container gadget or any gadget list.
- netmaestro
- 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
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