One of my customers contacted me couple of days ago to ask if it was possible to sort items in a drop button, when the items are created at runtime. Since the items are stored in a queue I figured it would be fairly easy.
Toolbar1.DeleteItems(ID1_Name)
Toolbar1.AddDropItem(ID1_Name,'Arnor','ok_16.ico',1)
Toolbar1.AddDropItem(ID1_Name,'Robert','ok_16.ico',2)
Toolbar1.AddDropItem(ID1_Name,'Monica','ok_16.ico',3)
Toolbar1.AddDropItem(ID1_Name,'Ana Maria','ok_16.ico',4)
Toolbar1.AddDropItem(ID1_Name,'Ivan','ok_16.ico',5)
Sort(Toolbar1.BandQ.ControlQ.pDropButton.ItemQ,|
Toolbar1.BandQ.ControlQ.pDropButton.ItemQ.szTxt)
!! Reset the ItemIDs after sorting the queue.
Loop I# = 1 To Records(Toolbar1.BandQ.ControlQ.pDropButton.ItemQ)
Get(Toolbar1.BandQ.ControlQ.pDropButton.ItemQ,I#)
Toolbar1.BandQ.ControlQ.pDropButton.ItemQ.ItemID = I#
Put(Toolbar1.BandQ.ControlQ.pDropButton.ItemQ)
End
Display()
Note that this will not work properly if you have separators in the drop items. If you want to do that, I would suggest to add the item text entries to a queue and sort them before you add them to the drop button. Something like this might work:
AddDropButtonItems ROUTINE
Data
Q Queue
T CString(256) !! Item text
SF Byte !! Separator Follows
End
Code
Q.T = 'Arnor' ; Q.SF = False; Add(Q)
Q.T = 'Robert' ; Q.SF = True; Add(Q)
Q.T = 'Monica' ; Q.SF = False; Add(Q)
Q.T = 'Ana Maria' ; Q.SF = False; Add(Q)
Q.T = 'Ivan' ; Q.SF = False; Add(Q)
Sort(Q,Q.T)
Toolbar1.DeleteItems(ID1_Name)
Loop X# = 1 To Records(Q)
Get(Q,X#)
Toolbar1.AddDropItem(ID1_Name,Q.T,'ok_16.ico',1)
If Q.SF = True !! Add Separator
Toolbar1.AddDropItem(ID1_Name,'-','ok_16.ico',1)
End
End
Display()
This should be able to handle sorted list with separators. I'm planning to add a method to sort the items alphabetically and I think I can make it handle the separators correctly too. The method I describe here is a bit more flexible as it gives you full control over how the items are arranged.
Arnor Baldvinsson