Page 11 of 30

Posted: Sun Mar 25, 2007 2:11 am
by klaver
Please, change the PureLVSORT_SetUserIcons func so not only [bitmap handles] are accepted but also icons.

Posted: Mon Mar 26, 2007 7:47 am
by gnozal
klaver wrote:Please, change the PureLVSORT_SetUserIcons func so not only [bitmap handles] are accepted but also icons.
Well, apparently windows only accepts bitmaps for HDM_SETITEM, so you have to transform your .ico into a .bmp. Your favorite graphic app should do it without problems.

http://msdn2.microsoft.com/en-us/library/ms671802.aspx

Posted: Mon Mar 26, 2007 3:55 pm
by klaver
I'm pretty sure it's possible. You should use the LVCOLUMN structure and the #LVM_SETITEM / #LVM_SETCOLUMN.
Some example:
http://rapidshare.com/files/22878983/hico.zip.html

Thanks in advance

Posted: Mon Mar 26, 2007 4:28 pm
by gnozal
klaver wrote:I'm pretty sure it's possible. You should use the LVCOLUMN structure and the #LVM_SETCOLUMN.
I can't download from Rabidshare (corporate firewall).
But I think you are talking about something like this ?

Code: Select all

  ; using ImageLists
  LVC.LVCOLUMN 
  LVC\lv\mask = #LVCF_IMAGE 
  LVC\iImage  = Image_Index 
  SendMessage_(GadgetID(#ListIcon),#LVM_SETCOLUMN,column,@LVC) 
MSDN mentions images but also bitmaps in this case http://msdn.microsoft.com/library/defau ... column.asp , and I never tried with icons.
Anyway, I am using HDM_SETITEM in PureLVSORT and I will not change this for the moment. What is so difficult about using bitmaps ?

Posted: Tue Mar 27, 2007 12:36 am
by klaver
gnozal wrote:What is so difficult about using bitmaps ?
Transparency.
Have no idea what OS you have, but on XP i like to have alpha-transparent icons.
Image
Tell me - which one loks better in your opinion?

Posted: Tue Mar 27, 2007 7:51 am
by gnozal
klaver wrote:
gnozal wrote:What is so difficult about using bitmaps ?
Transparency.
I don't have XP, but you got a point.
I will see what I can do, but all the examples I have seen use LVM_INSERTCOLUMN, i.e. replace PB's AddGadgetColumn() with a custom function, and this I want to avoid, so I am not sure it is possible.

Posted: Tue Mar 27, 2007 3:17 pm
by klaver

Code: Select all

Global Win.l, hWin.l, List.l, hList.l

#LVM_GETHEADER     = 4127
#LVM_GETCOLUMN     = 4121
#LVM_GETIMAGELIST  = 4098
#LVM_SETIMAGELIST  = 4099
#LVSIL_SMALL       = 1
#LVCF_TEXT         = 4

#ILC_MASK          = 1
#ILC_COLOR32       = 32

#HDF_BITMAP_ON_RIGHT = 4096
#HDF_IMAGE           = 2048
#HDF_STRING          = 16384
#HDI_TEXT            = 2
#HDI_IMAGE           = 32
#HDI_FORMAT          = 4
#HDM_SETITEM       = 4612
#HDM_GETITEM       = 4611

Structure HDITEM
  Mask.l
  cxy.l
  pszText.l
  hbm.l
  cchTextMax.l
  fmt.l
  lParam.l
  iImage.l
  iOrder.l
  type.l
  pvFilter.l
EndStructure

Structure LVCOLUMN
  Mask.l
  fmt.l
  cx.l
  pszText.l
  cchTextMax.l
  iSubItem.l
  iImage.l
  iOrder.l
EndStructure

Procedure.l GetHeaderID(hGadget)
  ProcedureReturn SendMessage_(hGadget, #LVM_GETHEADER, 0, 0)
EndProcedure
Procedure SetHeaderImage(hGadget.l, ImageIndex.l, Column.l, Align.l)
  TextColumn.s = Space(255)
  Var.LVCOLUMN\Mask = #LVCF_TEXT
  Var\pszText = @TextColumn
  Var\cchTextMax = 255
  SendMessage_(hGadget, #LVM_GETCOLUMN, Column, @Var)

  VarHeader.HDITEM\Mask = #HDI_IMAGE | #HDI_FORMAT | #HDI_TEXT
  VarHeader\fmt = #HDF_IMAGE | Align | #HDF_STRING
  VarHeader\iImage = ImageIndex
  VarHeader\pszText = @TextColumn
  VarHeader\cchTextMax = Len(TextColumn)
  SendMessage_(GetHeaderID(hGadget), #HDM_SETITEM, Column, @VarHeader)
EndProcedure
Procedure.l GetHeaderImageIndexID(hGadget.l, Column.l)
  VarHeader.HDITEM\Mask = #HDI_IMAGE | #HDI_FORMAT
  VarHeader\fmt = #HDF_IMAGE
  VarHeader\iImage = -1 ; to be sure that this value is not an image list icon index
  SendMessage_(GetHeaderID(hGadget), #HDM_GETITEM, Column, @VarHeader)
  ProcedureReturn VarHeader\iImage
EndProcedure

Procedure WinProc(hWnd,Msg,wParam,lParam)
  result = #PB_ProcessPureBasicEvents
  Select Msg
    Case #WM_NOTIFY
      *NMHDR.NMHDR = lParam
      If *NMHDR\hWndFrom = hList ; comes from our ListIconGadget
        If *NMHDR\code = #LVN_COLUMNCLICK
          *NMLV.NMLISTVIEW = lParam
          If GetHeaderImageIndexID(hList, *NMLV\iSubItem) = 0
            SetHeaderImage(hList, 1, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT)
          Else
            SetHeaderImage(hList, 0, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) ; #HDF_BITMAP_ON_LEFT = 0
          EndIf
        EndIf
      EndIf
      Result=0
  EndSelect
  ProcedureReturn result
EndProcedure

Win = OpenWindow(#PB_Any, 0, 0, 500, 300, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : hWin = WindowID(Win)
SetWindowCallback(@WinProc()) : CreateGadgetList(hWin)
List = ListIconGadget(#PB_Any, 0, 0, 500, 300, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) : hList = GadgetID(List)
AddGadgetColumn(List, 1, "Surname", 150)
AddGadgetColumn(List, 2, "Address", 200)

hImgList = ImageList_Create_(16, 16, #ILC_MASK | #ILC_COLOR32, 1, 1)
ImageList_ReplaceIcon_(hImgList, -1, LoadImage_(GetModuleHandle_(0), 1, #IMAGE_ICON, 0,0,0)) ; ImageList_AddIcon
ImageList_ReplaceIcon_(hImgList, -1, LoadImage_(GetModuleHandle_(0), 2, #IMAGE_ICON, 0,0,0)) ; ImageList_AddIcon
SendMessage_(hList, #LVM_SETIMAGELIST, #LVSIL_SMALL, hImgList)
SetHeaderImage(hList, 0, 0, #HDF_BITMAP_ON_RIGHT)
SetHeaderImage(hList, 1, 1, #HDF_BITMAP_ON_RIGHT)
SetHeaderImage(hList, 0, 2, #HDF_BITMAP_ON_RIGHT)


Repeat : Delay(1) : Until WindowEvent() = #PB_Event_CloseWindow

; jaPBe Version=3.6.12.595
; ResourceType3=9
; ResourceName=1
; ResourceLanguage=0
; ResourceFile=SORT_ASC.ico
; ResourceType3=9
; ResourceName=2
; ResourceLanguage=0
; ResourceFile=SORT_DESC.ico
; Build=0
; Language=0x0000 Language Neutral
; FirstLine=54
; CursorPosition=82
; EnableXP
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF
Here's an example. Icons: http://www.kakan.ovh.org/hico.zip

Posted: Tue Mar 27, 2007 3:40 pm
by gnozal
klaver wrote:code
Here's an example. Icons: http://www.kakan.ovh.org/hico.zip
So transparency cannot be done without an imagelist ?

Posted: Tue Mar 27, 2007 3:48 pm
by AND51
gnozal wrote:
klaver wrote:
gnozal wrote:What is so difficult about using bitmaps ?
Transparency.
I don't have XP, but you got a point.
Hey, gnozal, is TRANSPERANCY the reason, why yu're using squared standard icons? :wink: Then you don't need transperancy... (#PureLVSORT_ShowClickedHeader_IconRight)

Nice idea!

Posted: Tue Mar 27, 2007 4:19 pm
by klaver
gnozal wrote:So transparency cannot be done without an imagelist ?
I think so... I don't know other way... but you can always try with ownerdrawning :lol:

You asked why bitmaps are a problem, now I ask - why ImageList's so big problem? You only have to create an imagelist, assign it to the ListIconGadget and that's all. The image indexes - 0 for arrow up, 1 for arrow down?

Posted: Tue Mar 27, 2007 4:22 pm
by gnozal
klaver wrote:
gnozal wrote:So transparency cannot be done without an imagelist ?
I think so... I don't know other way... but you can always try with ownerdrawning :lol:
Does your code also work for bmp's or only for ico's ?
And there is an interesting side effect : the icons are displayed in the first column :lol: !

Code: Select all

Global Win.l, hWin.l, List.l, hList.l 

#LVM_GETHEADER     = 4127 
#LVM_GETCOLUMN     = 4121 
#LVM_GETIMAGELIST  = 4098 
#LVM_SETIMAGELIST  = 4099 
#LVSIL_SMALL       = 1 
#LVCF_TEXT         = 4 

#ILC_MASK          = 1 
#ILC_COLOR32       = 32 

#HDF_BITMAP_ON_RIGHT = 4096 
#HDF_IMAGE           = 2048 
#HDF_STRING          = 16384 
#HDI_TEXT            = 2 
#HDI_IMAGE           = 32 
#HDI_FORMAT          = 4 
#HDM_SETITEM       = 4612 
#HDM_GETITEM       = 4611 

Structure HDITEM 
  mask.l 
  cxy.l 
  pszText.l 
  hbm.l 
  cchTextMax.l 
  fmt.l 
  lParam.l 
  iImage.l 
  iOrder.l 
  type.l 
  pvFilter.l 
EndStructure 

Structure LVCOLUMN 
  mask.l 
  fmt.l 
  cx.l 
  pszText.l 
  cchTextMax.l 
  iSubItem.l 
  iImage.l 
  iOrder.l 
EndStructure 

Procedure.l GetHeaderID(hGadget) 
  ProcedureReturn SendMessage_(hGadget, #LVM_GETHEADER, 0, 0) 
EndProcedure 
Procedure SetHeaderImage(hGadget.l, ImageIndex.l, column.l, align.l) 
  TextColumn.s = Space(255) 
  Var.LVCOLUMN\mask = #LVCF_TEXT 
  Var\pszText = @TextColumn 
  Var\cchTextMax = 255 
  SendMessage_(hGadget, #LVM_GETCOLUMN, column, @Var) 
  
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT | #HDI_TEXT 
  VarHeader\fmt = #HDF_IMAGE | align | #HDF_STRING 
  VarHeader\iImage = ImageIndex 
  VarHeader\pszText = @TextColumn 
  VarHeader\cchTextMax = Len(TextColumn) 
  SendMessage_(GetHeaderID(hGadget), #HDM_SETITEM, column, @VarHeader) 
EndProcedure 
Procedure.l GetHeaderImageIndexID(hGadget.l, column.l) 
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT 
  VarHeader\fmt = #HDF_IMAGE 
  VarHeader\iImage = -1 ; to be sure that this value is not an image list icon index 
  SendMessage_(GetHeaderID(hGadget), #HDM_GETITEM, column, @VarHeader) 
  ProcedureReturn VarHeader\iImage 
EndProcedure 

Procedure WinProc(hwnd,msg,wParam,lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY 
      *NMHDR.NMHDR = lParam 
      If *NMHDR\hwndFrom = hList ; comes from our ListIconGadget 
        If *NMHDR\code = #LVN_COLUMNCLICK 
          *NMLV.NMLISTVIEW = lParam 
          If GetHeaderImageIndexID(hList, *NMLV\iSubItem) = 0 
            SetHeaderImage(hList, 1, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) 
          Else 
            SetHeaderImage(hList, 0, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) ; #HDF_BITMAP_ON_LEFT = 0 
          EndIf 
        EndIf 
      EndIf 
      result=0 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

hImgList = ImageList_Create_(16, 16, #ILC_MASK | #ILC_COLOR32, 1, 1) 
ImageList_ReplaceIcon_(hImgList, -1, LoadImage_(GetModuleHandle_(0), 1, #IMAGE_ICON, 0,0,0)) ; ImageList_AddIcon 
ImageList_ReplaceIcon_(hImgList, -1, LoadImage_(GetModuleHandle_(0), 2, #IMAGE_ICON, 0,0,0)) ; ImageList_AddIcon 


Win = OpenWindow(#PB_Any, 0, 0, 500, 300, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : hWin = WindowID(Win) 
SetWindowCallback(@WinProc()) : CreateGadgetList(hWin) 
List = ListIconGadget(#PB_Any, 0, 0, 500, 300, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) : hList = GadgetID(List) 
AddGadgetColumn(List, 1, "Surname", 150) 
AddGadgetColumn(List, 2, "Address", 200) 

SendMessage_(hList, #LVM_SETIMAGELIST, #LVSIL_SMALL, hImgList) 
;SetHeaderImage(hList, 0, 0, #HDF_BITMAP_ON_RIGHT) 
;SetHeaderImage(hList, 1, 1, #HDF_BITMAP_ON_RIGHT) 
;SetHeaderImage(hList, 0, 2, #HDF_BITMAP_ON_RIGHT) 

AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")

Repeat : Delay(1) : Until WindowEvent() = #PB_Event_CloseWindow

Posted: Tue Mar 27, 2007 7:48 pm
by klaver
gnozal wrote:Does your code also work for bmp's or only for ico's ?
I modifed the code so you can use bitmaps too. Simply the ImageList_AddIcon_ function must be replaced with ImageList_Add_.
gnozal wrote:And there is an interesting side effect : the icons are displayed in the first column :lol: !
Oops :) Fixed.

http://www.kakan.ovh.org/hico.zip

Image

Code: Select all

Global Win.l, hWin.l, List.l, hList.l

#LVM_GETHEADER     = 4127
#LVM_GETCOLUMN     = 4121
#LVM_GETIMAGELIST  = 4098
#LVSIL_SMALL       = 1
#LVCF_TEXT         = 4

#ILC_MASK          = 1
#ILC_COLOR32       = 32

#HDF_BITMAP_ON_RIGHT = 4096
#HDF_IMAGE           = 2048
#HDF_STRING          = 16384
#HDI_TEXT            = 2
#HDI_IMAGE           = 32
#HDI_FORMAT          = 4
#HDM_SETITEM         = 4612
#HDM_GETITEM         = 4611
#HDM_SETIMAGELIST    = 4616

Structure HDITEM
  mask.l
  cxy.l
  pszText.l
  hbm.l
  cchTextMax.l
  fmt.l
  lParam.l
  iImage.l
  iOrder.l
  type.l
  pvFilter.l
EndStructure

Structure LVCOLUMN
  mask.l
  fmt.l
  cx.l
  pszText.l
  cchTextMax.l
  iSubItem.l
  iImage.l
  iOrder.l
EndStructure

Procedure.l GetHeaderID(hGadget)
  ProcedureReturn SendMessage_(hGadget, #LVM_GETHEADER, 0, 0)
EndProcedure
Procedure SetHeaderImage(hGadget.l, ImageIndex.l, column.l, align.l)
  TextColumn.s = Space(255)
  Var.LVCOLUMN\mask = #LVCF_TEXT
  Var\pszText = @TextColumn
  Var\cchTextMax = 255
  SendMessage_(hGadget, #LVM_GETCOLUMN, column, @Var)
  
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT | #HDI_TEXT
  VarHeader\fmt = #HDF_IMAGE | align | #HDF_STRING
  VarHeader\iImage = ImageIndex
  VarHeader\pszText = @TextColumn
  VarHeader\cchTextMax = Len(TextColumn)
  SendMessage_(GetHeaderID(hGadget), #HDM_SETITEM, column, @VarHeader)
EndProcedure
Procedure.l GetHeaderImageIndexID(hGadget.l, column.l)
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT
  VarHeader\fmt = #HDF_IMAGE
  VarHeader\iImage = -1 ; to be sure that this value is not an image list icon index
  SendMessage_(GetHeaderID(hGadget), #HDM_GETITEM, column, @VarHeader)
  ProcedureReturn VarHeader\iImage
EndProcedure

Procedure WinProc(hwnd,msg,wParam,lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *NMHDR.NMHDR = lParam
      If *NMHDR\hwndFrom = hList ; comes from our ListIconGadget
        If *NMHDR\code = #LVN_COLUMNCLICK
          *NMLV.NMLISTVIEW = lParam
          If GetHeaderImageIndexID(hList, *NMLV\iSubItem) = 0
            SetHeaderImage(hList, 1, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT)
          Else
            SetHeaderImage(hList, 0, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) ; #HDF_BITMAP_ON_LEFT = 0
          EndIf
        EndIf
      EndIf
      result=0
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure AddToImageList(hList.l, hImg.l)
  If GetObjectType_(hImg) = #OBJ_BITMAP
    result = ImageList_Add_(hList, hImg, 0)
  Else
    result = ImageList_ReplaceIcon_(hList, -1, hImg) ; ImageList_AddIcon
  EndIf
  ProcedureReturn result
EndProcedure

hImgList = ImageList_Create_(16, 16, #ILC_MASK | #ILC_COLOR32, 1, 1)
AddToImageList(hImgList, LoadImage_(GetModuleHandle_(0), 3, #IMAGE_BITMAP, 0, 0, 0))
AddToImageList(hImgList, LoadImage_(GetModuleHandle_(0), 4, #IMAGE_BITMAP, 0, 0, 0))
AddToImageList(hImgList, LoadImage_(GetModuleHandle_(0), 1, #IMAGE_ICON, 0, 0, 0))
AddToImageList(hImgList, LoadImage_(GetModuleHandle_(0), 2, #IMAGE_ICON, 0, 0, 0))


Win = OpenWindow(#PB_Any, 0, 0, 500, 300, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : hWin = WindowID(Win)
SetWindowCallback(@WinProc()) : CreateGadgetList(hWin)
List = ListIconGadget(#PB_Any, 0, 0, 500, 300, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) : hList = GadgetID(List)
AddGadgetColumn(List, 1, "Surname", 150)
AddGadgetColumn(List, 2, "Address", 200)

SendMessage_(GetHeaderID(hList), #HDM_SETIMAGELIST, 0, hImgList)

SetHeaderImage(hList, 0, 0, #HDF_BITMAP_ON_RIGHT)
SetHeaderImage(hList, 1, 1, #HDF_BITMAP_ON_RIGHT)
SetHeaderImage(hList, 2, 2, #HDF_BITMAP_ON_RIGHT)

AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3")

Repeat : Delay(1) : Until WindowEvent() = #PB_Event_CloseWindow 
; jaPBe Version=3.6.12.595
; ResourceType3=3
; ResourceName=3
; ResourceLanguage=0
; ResourceFile=sm1.bmp
; ResourceType3=3
; ResourceName=4
; ResourceLanguage=0
; ResourceFile=sm2.bmp
; ResourceType3=9
; ResourceName=1
; ResourceLanguage=0
; ResourceFile=SORT_ASC.ico
; ResourceType3=9
; ResourceName=2
; ResourceLanguage=0
; ResourceFile=SORT_DESC.ico
; Build=0
; Language=0x0000 Language Neutral
; FirstLine=71
; CursorPosition=101
; EnableXP
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF

Posted: Tue Mar 27, 2007 10:24 pm
by ABBKlaus
Hi Gnozal,

i have a little problem with your great PureLVSort Library :roll:

When i run this example code the second time, it performs really slow :

Code: Select all

Enumeration
  #Window_Durchlaufzeiten
EndEnumeration

Enumeration
  #StatusBar_1
EndEnumeration

Enumeration
  #Durchlaufzeiten_List1
  #Durchlaufzeiten_Suchen
  #Durchlaufzeiten_Loeschen
EndEnumeration

Procedure ColorCallBack(GadgetNumber.l, CellRow.l, CellColumn.l, *TextColor.LONG, *BackColor.LONG, *FontID.LONG)
  If IsGadget(GadgetNumber)
    *FontID\l=GetGadgetFont(GadgetNumber)
  EndIf
  
  Select GadgetNumber
    Case #Durchlaufzeiten_List1
      CellText.s=GetGadgetItemText(GadgetNumber,CellRow,2)
      Select LCase(CellText)
        Case "ok"
          Col=#Green
        Case "scrapped" 
          Col=RGB(255,0,255)
        Case "rework"
          Col=RGB(0,255,255)
        Default
          Col=#White
      EndSelect
      If Col<>#Green
        *BackColor\l=Col
      EndIf
  EndSelect
EndProcedure

Procedure.l ListIconSort_Durchlaufzeiten1(ListIconNumber.l, ListIconColumn.l, Item1.s, Item2.s)
  Protected ReturnValue.l
  
  Item1=ReplaceString(Item1,sDecimal$,".")
  Item2=ReplaceString(Item2,sDecimal$,".")
  
  If ValD(Item1) > ValD(Item2)
    ReturnValue = 1
  ElseIf ValD(Item1) < ValD(Item2)
    ReturnValue = -1
  Else
    ReturnValue = 0
  EndIf
  
  ProcedureReturn ReturnValue
EndProcedure

Procedure Open_Window_Durchlaufzeiten()
  If OpenWindow(#Window_Durchlaufzeiten, 0, 0, 1024, 240, "PureLVSort Performance Bug")
    If CreateGadgetList(WindowID(#Window_Durchlaufzeiten))
      ListIconGadget(#Durchlaufzeiten_List1, 5, 40, 1005, 170, "Index", 50, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
      AddGadgetColumn(#Durchlaufzeiten_List1, 1,"ID",90)
      AddGadgetColumn(#Durchlaufzeiten_List1, 2,"Status",50)
      AddGadgetColumn(#Durchlaufzeiten_List1, 3,"Date 1",100)
      AddGadgetColumn(#Durchlaufzeiten_List1, 4,"Date 2",100)
      AddGadgetColumn(#Durchlaufzeiten_List1, 5,"Days",50)
      AddGadgetColumn(#Durchlaufzeiten_List1, 6,"Date 3",100)
      AddGadgetColumn(#Durchlaufzeiten_List1, 7,"Days",50)
      AddGadgetColumn(#Durchlaufzeiten_List1, 8,"Date 4",100)
      AddGadgetColumn(#Durchlaufzeiten_List1, 9,"Days",50)
      AddGadgetColumn(#Durchlaufzeiten_List1,10,"Date 5",100)
      AddGadgetColumn(#Durchlaufzeiten_List1,11,"Days",50)
      AddGadgetColumn(#Durchlaufzeiten_List1,12,"Total",50)
      ButtonGadget(#Durchlaufzeiten_Suchen, 5, 5, 100, 30, "Search")
      ButtonGadget(#Durchlaufzeiten_Loeschen, 120, 5, 100, 30, "Delete")
      
      CreateStatusBar(#StatusBar_1,WindowID(#Window_Durchlaufzeiten))
      AddStatusBarField(1024)
      AddKeyboardShortcut(#Window_Durchlaufzeiten, #PB_Shortcut_Return , 100)
      AddKeyboardShortcut(#Window_Durchlaufzeiten, #PB_Shortcut_Escape , 101)
      
      PureCOLOR_SetCellColorCallback(#Window_Durchlaufzeiten,@ColorCallBack())
    EndIf
  EndIf
EndProcedure

Procedure Button_SucheDurchlaufzeiten()
  PureLVSORT_ClearGadget(#Durchlaufzeiten_List1)
  ClearGadgetItemList(#Durchlaufzeiten_List1)
  StatusBarText(#StatusBar_1,0,"Bitte warten !")
  
  While WindowEvent():Wend
  
  StatusBarText(#StatusBar_1,0,"Please wait ! (ESC=Break)")
  
  time1=ElapsedMilliseconds()
  
  max=15000
  
  Index=0
  Quit=0
  
  For i=1 To max
    Index+1
    EPNR$="AA12345678"
    Select Random(10)
      Case 9
        Status$="REWORK"
      Case 10
        Status$="SCRAPPED"
      Default
        Status$="OK"
    EndSelect
    Date1$="1.1.2006 11:21:00"
    Date2$="1.1.2006 11:21:00"
    Days1$=Str(Random(999))
    Date3$="1.1.2006 11:21:00"
    Days2$=Str(Random(999))
    Date4$="1.1.2006 11:21:00"
    Days3$=Str(Random(999))
    Date5$="1.1.2006 11:21:00"
    Days4$=Str(Random(999))
    Days$=Str(Random(999))
    
    AddGadgetItem(#Durchlaufzeiten_List1,-1,Str(Index)+Chr(10)+EPNR$+Chr(10)+Status$+Chr(10)+Date1$+Chr(10)+Date2$+Chr(10)+Days1$+Chr(10)+Date3$+Chr(10)+Days2$+Chr(10)+Date4$+Chr(10)+Days3$+Chr(10)+Date5$+Chr(10)+Days4$+Chr(10)+Days$)
    time2=ElapsedMilliseconds()
    
    Repeat
      Event=WindowEvent()
      Select Event
        Case #PB_Event_Menu
          If EventMenu()=101
            Quit=1
            Break 2
          EndIf
        Case #PB_Event_CloseWindow
          Quit=1
          Break 2
      EndSelect
    Until Event=0
    
  Next
  
  If Quit
    StatusBarText(#StatusBar_1,0,"Process terminated")
  Else
    timediff$=ReplaceString(StrF((time2-time1)/1000,3),".",",")
    StatusBarText(#StatusBar_1,0,"TIME: "+timediff$+" sec.")
  EndIf
  
  PureLVSORT_ClearGadget(#Durchlaufzeiten_List1)
  PureLVSORT_DefineUserCallback(@ListIconSort_Durchlaufzeiten1())
  If PureLVSORT_SelectGadgetToSort(#Durchlaufzeiten_List1,#PureLVSORT_ShowClickedHeader_IconLeft) = #PureLVSORT_Ok
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 0,#PureLVSORT_Numeric)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 1,#PureLVSORT_String)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 2,#PureLVSORT_String)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 3,#PureLVSORT_DateDDMMYYYYHHMMSS)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 4,#PureLVSORT_DateDDMMYYYYHHMMSS)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 5,#PureLVSORT_UserCallback)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 6,#PureLVSORT_DateDDMMYYYYHHMMSS)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 7,#PureLVSORT_UserCallback)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 8,#PureLVSORT_DateDDMMYYYYHHMMSS)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1, 9,#PureLVSORT_UserCallback)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1,10,#PureLVSORT_DateDDMMYYYYHHMMSS)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1,11,#PureLVSORT_UserCallback)
    PureLVSORT_SetColumnType(#Durchlaufzeiten_List1,12,#PureLVSORT_UserCallback)
  EndIf
EndProcedure

Open_Window_Durchlaufzeiten()

Repeat
  WindowEvent   = WaitWindowEvent()
  Eventtype     = EventType()
  EventGadgetID = EventGadget()
  EventwParam   = EventwParam()
  EventFocus    = GetFocus_()
  
  Select WindowEvent
    Case #PB_Event_Gadget
      Select Eventtype
        Case #PB_EventType_LeftClick
          Select EventGadgetID
            Case #Durchlaufzeiten_Suchen
              Button_SucheDurchlaufzeiten()
            Case #Durchlaufzeiten_Loeschen
              ClearGadgetItemList(#Durchlaufzeiten_List1)
          EndSelect
      EndSelect
  EndSelect
Until WindowEvent = #PB_Event_CloseWindow
1. Run
Image
2. Run
Image

With disapled PureLVSort the speed is the same as in screenshot 1 every run.

Regards Klaus

Posted: Wed Mar 28, 2007 7:55 am
by gnozal
klaver wrote:
gnozal wrote:Does your code also work for bmp's or only for ico's ?
I modifed the code so you can use bitmaps too. Simply the ImageList_AddIcon_ function must be replaced with ImageList_Add_.
Thanks.
I came to the same conclusion but my code doesn't work with bitmaps, your code also doesn't work if the bitmap is loaded with CatchImage().
Or am I missing something ?

Code: Select all

Global Win.l, hWin.l, List.l, hList.l 

#LVM_GETHEADER     = 4127 
#LVM_GETCOLUMN     = 4121 
#LVM_GETIMAGELIST  = 4098 
#LVSIL_SMALL       = 1 
#LVCF_TEXT         = 4 

#ILC_MASK          = 1 
#ILC_COLOR32       = 32 

#HDF_BITMAP_ON_RIGHT = 4096 
#HDF_IMAGE           = 2048 
#HDF_STRING          = 16384 
#HDI_TEXT            = 2 
#HDI_IMAGE           = 32 
#HDI_FORMAT          = 4 
#HDM_SETITEM         = 4612 
#HDM_GETITEM         = 4611 
#HDM_SETIMAGELIST    = 4616 

;  IncludeBinary "PureLVSORT_FlecheHaut.bmp"
;{ Size = 1222 bytes
DataSection
IconArrowUp:
Data.l $04C64D42,$00000000,$04360000,$00280000,$000C0000,$000C0000,$00010000,$00000008,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$C6C60000,$C8C800C6,$CECE00C8,$DEDE00CE,$EFEF00DE,$FFFF00EF,$000000FF,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$06000000,$06060606,$06060606,$06000006
Data.l $00060606,$06060600,$06000006,$00060606,$06060600,$06000006,$00060606,$06060600,$06000006,$00060606,$06060600,$06000006
Data.l $00000000,$00000000,$06000006,$00000006,$06000000,$06000006,$00000606,$06060000,$06000006,$00060606,$06060600,$06000006
Data.l $06060606,$06060606,$00000006,$00000000,$00000000
Data.b $00,$00
EndDataSection ;}
;  IncludeBinary "PureLVSORT_FlecheBas.bmp"
;{ Size = 1222 bytes
DataSection
IconArrowDown:
Data.l $04C64D42,$00000000,$04360000,$00280000,$000C0000,$000C0000,$00010000,$00000008,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$C6C60000,$C8C800C6,$CECE00C8,$DEDE00CE,$EFEF00DE,$FFFF00EF,$000000FF,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
Data.l $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$06000000,$06060606,$06060606,$06000006
Data.l $00060606,$06060600,$06000006,$00000606,$06060000,$06000006,$00000006,$06000000,$06000006,$00000000,$00000000,$06000006
Data.l $00060606,$06060600,$06000006,$00060606,$06060600,$06000006,$00060606,$06060600,$06000006,$00060606,$06060600,$06000006
Data.l $06060606,$06060606,$00000006,$00000000,$00000000
Data.b $00,$00
EndDataSection ;}



Structure HDITEM 
  mask.l 
  cxy.l 
  pszText.l 
  hbm.l 
  cchTextMax.l 
  fmt.l 
  lParam.l 
  iImage.l 
  iOrder.l 
  type.l 
  pvFilter.l 
EndStructure 

Structure LVCOLUMN 
  mask.l 
  fmt.l 
  cx.l 
  pszText.l 
  cchTextMax.l 
  iSubItem.l 
  iImage.l 
  iOrder.l 
EndStructure 

Procedure.l GetHeaderID(hGadget) 
  ProcedureReturn SendMessage_(hGadget, #LVM_GETHEADER, 0, 0) 
EndProcedure 
Procedure SetHeaderImage(hGadget.l, ImageIndex.l, column.l, align.l) 
  TextColumn.s = Space(255) 
  Var.LVCOLUMN\mask = #LVCF_TEXT 
  Var\pszText = @TextColumn 
  Var\cchTextMax = 255 
  SendMessage_(hGadget, #LVM_GETCOLUMN, column, @Var) 
  
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT | #HDI_TEXT 
  VarHeader\fmt = #HDF_IMAGE | align | #HDF_STRING 
  VarHeader\iImage = ImageIndex 
  VarHeader\pszText = @TextColumn 
  VarHeader\cchTextMax = Len(TextColumn) 
  SendMessage_(GetHeaderID(hGadget), #HDM_SETITEM, column, @VarHeader) 
EndProcedure 
Procedure.l GetHeaderImageIndexID(hGadget.l, column.l) 
  VarHeader.HDITEM\mask = #HDI_IMAGE | #HDI_FORMAT 
  VarHeader\fmt = #HDF_IMAGE 
  VarHeader\iImage = -1 ; to be sure that this value is not an image list icon index 
  SendMessage_(GetHeaderID(hGadget), #HDM_GETITEM, column, @VarHeader) 
  ProcedureReturn VarHeader\iImage 
EndProcedure 

Procedure WinProc(hwnd,msg,wParam,lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY 
      *NMHDR.NMHDR = lParam 
      If *NMHDR\hwndFrom = hList ; comes from our ListIconGadget 
        If *NMHDR\code = #LVN_COLUMNCLICK 
          *NMLV.NMLISTVIEW = lParam 
          If GetHeaderImageIndexID(hList, *NMLV\iSubItem) = 0 
            SetHeaderImage(hList, 1, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) 
          Else 
            SetHeaderImage(hList, 0, *NMLV\iSubItem, #HDF_BITMAP_ON_RIGHT) ; #HDF_BITMAP_ON_LEFT = 0 
          EndIf 
        EndIf 
      EndIf 
      result=0 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

Procedure AddToImageList(hList.l, hImg.l) 
  If GetObjectType_(hImg) = #OBJ_BITMAP 
    result = ImageList_Add_(hList, hImg, 0) 
  Else 
    result = ImageList_ReplaceIcon_(hList, -1, hImg) ; ImageList_AddIcon 
  EndIf 
  ProcedureReturn result 
EndProcedure 

hImgList = ImageList_Create_(16, 16, #ILC_MASK | #ILC_COLOR32, 1, 1) 
AddToImageList(hImgList, ImageID(CatchImage(#PB_Any, ?IconArrowUp))) 
AddToImageList(hImgList, ImageID(CatchImage(#PB_Any, ?IconArrowDown))) 
AddToImageList(hImgList, ImageID(CatchImage(#PB_Any, ?IconArrowUp))) 
AddToImageList(hImgList, ImageID(CatchImage(#PB_Any, ?IconArrowDown))) 


Win = OpenWindow(#PB_Any, 0, 0, 500, 300, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : hWin = WindowID(Win) 
SetWindowCallback(@WinProc()) : CreateGadgetList(hWin) 
List = ListIconGadget(#PB_Any, 0, 0, 500, 300, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) : hList = GadgetID(List) 
AddGadgetColumn(List, 1, "Surname", 150) 
AddGadgetColumn(List, 2, "Address", 200) 

SendMessage_(GetHeaderID(hList), #HDM_SETIMAGELIST, 0, hImgList) 

SetHeaderImage(hList, 0, 0, #HDF_BITMAP_ON_RIGHT) 
SetHeaderImage(hList, 1, 1, #HDF_BITMAP_ON_RIGHT) 
SetHeaderImage(hList, 2, 2, #HDF_BITMAP_ON_RIGHT) 

AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3") 
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3") 
AddGadgetItem(List, -1, "1" + Chr(10) + "2" + Chr(10) + "3") 

Repeat : Delay(1) : Until WindowEvent() = #PB_Event_CloseWindow

Posted: Wed Mar 28, 2007 8:45 am
by gnozal
ABBKlaus wrote:Hi Gnozal,
i have a little problem with your great PureLVSort Library :roll:
With disapled PureLVSort the speed is the same as in screenshot 1 every run.
Regards Klaus
I have found the problem. After PureLVSORT_ClearGadget(), the ListIcon is still subclassed, and PureLVSORT is monitoring the #LVM_INSERTITEM / #LVM_DELETEITEM messages, so this explains the delay. Now, PureLVSORT_ClearGadget() also resets the subclassing.
Please test http://freenet-homepage.de/gnozal/PureLVSORT_BETA.zip