Just Another ListIcon Question...
Just Another ListIcon Question...
New question - if I have a listicon with draggable headers, how would I rearrange them from the program? The reason is I want the user to be able to rearrange them, but I need to save and restore the custom positions...
For Windows OS, you can save the column order in an Array() and then send the #LVM_SETCOLUMNORDERARRAY message.
Code: Select all
#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58
SendMessage_(GadgetID(#YourListIcon), #LVM_SETCOLUMNORDERARRAY, numberOfArrayItems, columnOrderArray())
What goes around comes around.
PB 5.21 LTS (x86) - Windows 8.1
PB 5.21 LTS (x86) - Windows 8.1
My method
I don't know if it's the best, but... :roll:
I don't know if it's the best, but... :roll:
Code: Select all
#MyWindow = 0
#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58
#LVM_GETHEADER = #LVM_FIRST + 31
#HDM_ORDERTOINDEX = #HDM_FIRST + 15
Enumeration
#MyGadget
#MyButton1
#MyButton2
#MyButton3
#MyButton4
#MyButton5
EndEnumeration
Structure MyList
Column.l
Text.s
EndStructure
NewList List.MyList()
Procedure SaveContent()
Handle = SendMessage_(GadgetID(#MyGadget), #LVM_GETHEADER, 0, 0)
CountColumns = SendMessage_(Handle, #HDM_GETITEMCOUNT, 0, 0)
ClearList(List())
For col = 0 To CountColumns -1
For Line = 0 To CountGadgetItems(#MyGadget) -1
AddElement(List())
List()\Column = col
List()\Text = GetGadgetItemText(#MyGadget, Line, col)
Next
Next
ProcedureReturn
EndProcedure
Procedure ReloadContent()
Handle = SendMessage_(GadgetID(#MyGadget), #LVM_GETHEADER, 0, 0)
CountColumns = SendMessage_(Handle, #HDM_GETITEMCOUNT, 0, 0)
For i = 0 To CountColumns -1
col = SendMessage_(Handle, #HDM_ORDERTOINDEX, i, 0)
ForEach List()
If List()\Column = col
SetGadgetItemText(#MyGadget, Line, List()\Text, col) : Line +1
EndIf
Next
Line = 0
Next
ProcedureReturn
EndProcedure
If OpenWindow(#MyWindow,100,100,400,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIcon")
If CreateGadgetList(WindowID())
ButtonGadget(#MyButton1, 10, 300, 60, 20, "0-1-2-3")
ButtonGadget(#MyButton2, 80, 300, 60, 20, "1-3-2-0")
ButtonGadget(#MyButton3, 150, 300, 60, 20, "3-0-2-1")
ButtonGadget(#MyButton4, 220, 300, 60, 20, "1-3-0-2")
ButtonGadget(#MyButton5, 290, 300, 60, 20, "2-0-1-3")
ListIconGadget(#MyGadget,5,5,390,290,"Colonne 0",100,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_HeaderDragDrop)
For i = 1 To 3
AddGadgetColumn(#MyGadget, i, "Colonne "+Str(i), 100)
Next
For i = 0 To 10
AddGadgetItem(#MyGadget, -1, "Ligne "+Str(i)+Chr(10)+"Dans"+Chr(10)+"toutes"+Chr(10)+"les colonnes")
Next
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_EventGadget
Select EventGadgetID()
Case #MyButton1
SaveContent()
SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order0)
ReloadContent()
Case #MyButton2
SaveContent()
SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order1)
ReloadContent()
Case #MyButton3
SaveContent()
SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order2)
ReloadContent()
Case #MyButton4
SaveContent()
SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order3)
ReloadContent()
Case #MyButton5
SaveContent()
SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order4)
ReloadContent()
EndSelect
Case #PB_EventCloseWindow
Quit = #True
EndSelect
Until Quit
EndIf
DataSection
Order0:
Data.l 0, 1, 2, 3
Order1 :
Data.l 1, 3, 2, 0
Order2 :
Data.l 3, 0, 2, 1
Order3 :
Data.l 1, 3, 0, 2
Order4 :
Data.l 2, 0, 1, 3
EndDataSection
My english is bad !!!... It's normal, i'm french 
My english is not really the English.
It's the FrogLish (Froggy's English)

My english is not really the English.
It's the FrogLish (Froggy's English)

Another solution which saves the current column order to disk and loads it after the program is started a second time to rebuild the saved column order:
For the information to read the actual column order with LVM_GETCOLUMNORDERARRAY, take a look in the MSDN:
http://msdn.microsoft.com/library/defau ... rarray.asp
Code: Select all
#LVM_GETCOLUMNORDERARRAY = #LVM_FIRST + 59
#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58
#Filename = "C:\ColumnOrder.Dat"
#NumColumns = 3
#WindowID = 0
#WindowHeight = 200
#WindowWidth = 202
Enumeration
#ListIconID
#SaveButtonID
#CancelButtonID
EndEnumeration
ArrayBufferPtr.L
i.W
WindowEvent.L
ArrayBufferPtr = AllocateMemory(#NumColumns * 4)
If OpenWindow(#WindowID, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "ListIcon HeaderDrag-Demo")
If CreateGadgetList(WindowID())
ListIconGadget(#ListIconID, 9, 12, 184, 149, "Column 1", 60, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_HeaderDragDrop)
ButtonGadget(#SaveButtonID, 10, #WindowHeight - 30, 110, 20, "Save Column Order")
ButtonGadget(#CancelButtonID, #WindowWidth - 70, #WindowHeight - 30, 60, 20, "Cancel")
For i = 2 To #NumColumns
AddGadgetColumn(#ListIconID, i - 1, "Column " + Str(i), 60)
Next i
For i = 1 To 9
AddGadgetItem(#ListIconID, -1, "R" + Str(i) + " + C1" + #LF$ + "R" + Str(i) + " + C2" + #LF$ + "R" + Str(i) + " + C3")
Next i
If ReadFile(1, #Filename)
For i = 0 To #NumColumns - 1
PokeL(ArrayBufferPtr + i * 4, ReadLong())
Next i
CloseFile(1)
SendMessage_(GadgetID(#ListIconID), #LVM_SETCOLUMNORDERARRAY, #NumColumns, ArrayBufferPtr)
EndIf
Repeat
WindowEvent = WaitWindowEvent()
If WindowEvent = #PB_Event_Gadget
Select EventGadgetID()
Case #SaveButtonID
If CreateFile(1, #Filename)
If SendMessage_(GadgetID(#ListIconID), #LVM_GETCOLUMNORDERARRAY, 3, ArrayBufferPtr) <> #False
For i = 0 To #NumColumns - 1
WriteLong(PeekL(ArrayBufferPtr + i * 4))
Next i
CloseFile(1)
EndIf
EndIf
Break
Case #CancelButtonID
Break
EndSelect
EndIf
Until WindowEvent = #PB_Event_CloseWindow
EndIf
EndIf
http://msdn.microsoft.com/library/defau ... rarray.asp