- Very flexible
- All data types are supported
Have fun
Code: Select all
#ItemCount = 350000
#LVSICF_NOINVALIDATEALL = 1
#LVN_ODCACHEHINT = #LVN_FIRST - 13
Structure Licon
index.i
item1.s
item2.f
item3.s
EndStructure
Global Dim myItems.licon(#ItemCount),sort
sort = 1
For i = 0 To #ItemCount
myItems(i)\index = i
myItems(i)\item1 = "PureBasic " + Str(i)
myItems(i)\item2 = Random(#ItemCount)/14
myItems(i)\item3 = "TEST3 " + Str(i)
Next
Procedure SetHeaderImage(Gadget, Column, TextAlign, Arrow)
Header = SendMessage_(GadgetID(Gadget), #LVM_GETHEADER, 0, 0)
Columntxt.s = GetGadgetItemText(Gadget,-1,Column)
Hdr.HDITEM\mask = #HDI_BITMAP | #HDI_FORMAT | #HDI_TEXT
Hdr\fmt = #HDF_BITMAP | TextAlign | #HDF_STRING | Arrow
Hdr\hbm = 0
Hdr\pszText = @Columntxt
Hdr\cchTextMax = #MAX_PATH
SendMessage_(Header, #HDM_SETITEM, Column, @Hdr)
EndProcedure
Procedure winCB(hWnd, uMsg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_NOTIFY
*pnmh.NMHDR = lParam
Select *pnmh\code
Case #LVN_ODCACHEHINT
result = 0
Case #LVN_ODFINDITEM
result = -1
Case #LVN_GETDISPINFO ;
*pnmlvdi.NMLVDISPINFO = lParam
If *pnmlvdi\item\mask & #LVIF_TEXT
If *pnmlvdi\item\iSubItem = 0
PokeS(*pnmlvdi\item\pszText ,Str(PeekL(@myItems(*pnmlvdi\item\iItem)\index)))
ElseIf *pnmlvdi\item\iSubItem = 1
PokeS(*pnmlvdi\item\pszText , PeekS(@myItems(*pnmlvdi\item\iItem)\item1),-1,#PB_Unicode)
ElseIf *pnmlvdi\item\iSubItem = 2
PokeS(*pnmlvdi\item\pszText ,StrF(PeekF(@myItems(*pnmlvdi\item\iItem)\item2)))
ElseIf *pnmlvdi\item\iSubItem = 3
PokeS(*pnmlvdi\item\pszText , PeekS(@myItems(*pnmlvdi\item\iItem)\item3),-1,#PB_Unicode)
EndIf
EndIf
Case #LVN_COLUMNCLICK
*nmlv.NM_LISTVIEW = lParam
col = *nmlv\iSubItem
If col = 0
SortStructuredArray(myItems(),sort, OffsetOf(Licon\index), TypeOf(Licon\index))
ElseIf col = 1
SortStructuredArray(myItems(),sort, OffsetOf(Licon\item1), TypeOf(Licon\item1))
ElseIf col = 2
SortStructuredArray(myItems(),sort, OffsetOf(Licon\item2), TypeOf(Licon\item2))
ElseIf col = 3
SortStructuredArray(myItems(),sort, OffsetOf(Licon\item3), TypeOf(Licon\item3))
EndIf
InvalidateRect_(WindowID(0),0,1)
sort ! 1
For index = 0 To 3
SetHeaderImage(0, index, #LVCFMT_LEFT|#LVCFMT_BITMAP_ON_RIGHT, #HDF_STRING)
Next
If sort = 0
SetHeaderImage(0, col, #LVCFMT_LEFT|#LVCFMT_BITMAP_ON_RIGHT, #HDF_SORTUP)
Else
SetHeaderImage(0, col, #LVCFMT_LEFT|#LVCFMT_BITMAP_ON_RIGHT, #HDF_SORTDOWN)
EndIf
;
EndSelect
Case #WM_SIZE
MoveWindow_(GadgetID(0),10,10,WindowWidth(0)-20,WindowHeight(0)-20,1)
EndSelect
ProcedureReturn result
EndProcedure
LoadFont(0,"Tahoma",12)
;
If OpenWindow(0, 0, 0, 600, 410, "Virtual ListIconGadget", #PB_Window_SystemMenu | #PB_Window_Invisible | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
Licon = ListIconGadget(0,10,10,580,390,"Name",100,#LVS_OWNERDATA| #PB_ListIcon_GridLines)
SetGadgetFont(0,FontID(0))
SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
AddGadgetColumn(0,1,"PureBasic",150)
AddGadgetColumn(0,2,"TEST2",150)
AddGadgetColumn(0,3,"TEST3",150)
SetWindowCallback(@winCB())
HideWindow(0,0)
SendMessage_(Licon, #LVM_SETITEMCOUNT, #ItemCount, #LVSICF_NOINVALIDATEALL)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
Edit 2 : Speed optimization