Page 1 sur 1

[V4] Trie d'une listICon

Publié : lun. 17/avr./2006 7:56
par olivier
A que COUCOU

J'ai besoins de trier une listIcon, j'ai repris un code de CodeArchiv, qui marche tres bien avec la V3, mais qui ne marche plus avec la V4 !
Je cherche, je cherche mais je ne trouve pas pourquoi !

Alors si vous avez un autre code ou si quelqu'un sait corriger celui ci ....Et bien merci Beaucoup ! :D

Code : Tout sélectionner

; English forum:
; Author:
; Date:


#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55
Global ListIconGadget.l, Buffer1.l, Buffer2.l, lvi.LV_ITEM, updown.l, lastcol.l
Buffer1 = AllocateMemory( 128)
Buffer2 = AllocateMemory( 128)

Procedure CompareFunc(item1, item2, lParamSort)
  result = 0
  lvi\iSubItem = lParamSort
  lvi\pszText = Buffer1
  lvi\cchTextMax = 128
  lvi\mask = #LVIF_TEXT
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, item1, @lvi)
  lvi\pszText = Buffer2
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, item2, @lvi)
  Seeker1 = Buffer1
  Seeker2 = Buffer2
  done = 0
  While done=0
    char1 = Asc(UCase(Chr(PeekB(Seeker1))))
    char2 = Asc(UCase(Chr(PeekB(Seeker2))))
    result = (char1-char2)*updown
    If result<>0 Or (Seeker1-Buffer1)>127
      done = 1
    EndIf
    Seeker1+1
    Seeker2+1
  Wend
  ProcedureReturn result
EndProcedure

Procedure UpdatelParam()
  ItemCount = SendMessage_(ListIconGadget, #LVM_GETITEMCOUNT, 0, 0)
  lvi\mask = #LVIF_PARAM
  lvi\iItem = 0
  While ItemCount>0
    lvi\lParam = lvi\iItem
    For SubItem = 0 To 3
      lvi\iSubItem = SubItem 
      SendMessage_(ListIconGadget, #LVM_SETITEM, 0, @lvi)
    Next SubItem
    lvi\iItem = lvi\iItem+1
    ItemCount = ItemCount-1
  Wend
EndProcedure

Procedure ColumnClickCallback(hWnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *msg.NMHDR = lParam
      If *msg\hwndFrom = ListIconGadget And *msg\code = #LVN_COLUMNCLICK
        *pnmv.NM_LISTVIEW = lParam
        If lastcol<>*pnmv\iSubItem
          updown = 1
        EndIf
        SendMessage_(ListIconGadget, #LVM_SORTITEMS, *pnmv\iSubItem, @CompareFunc())
        UpdatelParam()
        UpdateWindow_(ListIconGadget)
        lastcol = *pnmv\iSubItem
        updown = -updown
      EndIf
    Case #WM_SIZE
      If hWnd = WindowID(0) And IsIconic_(hWnd)=0
        WindowWidth = lParam & $FFFF
        WindowHeight = lParam>>16
        ResizeGadget(0, 0, 0, WindowWidth, WindowHeight)
        result = 1
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 384, 288, 640, 480, "ListIconGadget sort example", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
  LVWidth = WindowWidth(0)
  LVCWidth = Int(LVWidth/4)-1
  If CreateGadgetList(WindowID(0))
    ListIconGadget = ListIconGadget(0, 0, 0, LVWidth, WindowHeight(0), "Column 0", LVCWidth, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
    AddGadgetColumn(0, 1, "Column 1", LVCWidth)
    AddGadgetColumn(0, 2, "Column 2", LVCWidth)
    AddGadgetColumn(0, 3, "Column 3", LVCWidth)
  EndIf
  AddGadgetItem(0, 0, "Aaa 1"+Chr(10)+"Bcc 3"+Chr(10)+"Cdd 2"+Chr(10)+"Eee 3"+Chr(10), 0)
  AddGadgetItem(0, 1, "Aab 2"+Chr(10)+"Bbc 2"+Chr(10)+"Ddd 3"+Chr(10)+"Dde 1"+Chr(10), 0)
  AddGadgetItem(0, 2, "Abb 3"+Chr(10)+"Baa 1"+Chr(10)+"Ccd 1"+Chr(10)+"Dee 2"+Chr(10), 0)
  updown = 1
  lastcol = 0
  UpdatelParam()
  SetWindowCallback(@ColumnClickCallback())

  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #WM_CLOSE
EndIf
End

Publié : lun. 17/avr./2006 10:19
par gnozal

Publié : lun. 17/avr./2006 10:40
par olivier
MERCI MERCI MERCI :D

Je met le code final ici, Bravo Gnozal !

Code : Tout sélectionner

Procedure CreateListIconArrows(StartImage)
   For img = 0 To 1
      CreateImage(StartImage+img,16,16)
      StartDrawing(ImageOutput(StartImage+img))
      background = GetSysColor_(#COLOR_BTNFACE)
      FrontColor(RGB(Red(background),Green(background),Blue(background)))
      Box(0,0,16,16)
      If img = 0 : Start=7 : Else : Start = 2 : EndIf
      For a = 6 To 10
         Line(Start,a,13-Start*2,0,0)
         Start+1
      Next a
      StopDrawing()
   Next
EndProcedure


Procedure AddListIconColumn(gadget,pos,width,align,text$,hImage)
   #LVCF_IMAGE = $10
   #LVCFMT_COL_HAS_IMAGES = $8000
   #LI_CENTERED = #LVCFMT_CENTER
   #LI_LEFT     = #LVCFMT_LEFT
   #LI_RIGHT    = #LVCFMT_RIGHT
   Structure LVCOLUMN
      lv.LV_COLUMN
      iImage.l
      iOrder.l
   EndStructure
   If GetObjectType_(hImage)=#OBJ_BITMAP
      hImgL = SendMessage_(GadgetID(gadget),#LVM_GETIMAGELIST,#LVSIL_SMALL,0)
      If hImgL=0
         hImgL = ImageList_Create_(16,16,#ILC_COLOR32,1,1)
         SendMessage_(GadgetID(gadget),#LVM_SETIMAGELIST,#LVSIL_SMALL,hImgL)
      EndIf
      idx = ImageList_Add_(hImgL,hImage,0)
   Else
      idx = hImage
   EndIf
   LVC.LVCOLUMN
   LVC\lv\mask = #LVCF_IMAGE|#LVCF_TEXT|#LVCF_WIDTH|#LVCF_FMT
   LVC\lv\fmt     = align|#LVCFMT_COL_HAS_IMAGES
   LVC\lv\pszText = @text$
   LVC\lv\cchTextMax = Len(text$)
   LVC\lv\iSubItem = pos
   LVC\lv\cx   = width
   LVC\iImage  = idx
   LVC\iOrder  = pos
   SendMessage_(GadgetID(gadget),#LVM_INSERTCOLUMN,pos,@LVC)
EndProcedure

Procedure GetListIconColumnImage(gadget,column)
   LVC.LVCOLUMN
   LVC\lv\mask = #LVCF_IMAGE
   SendMessage_(GadgetID(gadget),#LVM_GETCOLUMN,column,@LVC)
   ProcedureReturn LVC\iImage
EndProcedure

Procedure ChangeListIconColumnImage(gadget,column,Image_Index)
   LVC.LVCOLUMN
   LVC\lv\mask = #LVCF_IMAGE
   LVC\iImage  = Image_Index
   ProcedureReturn SendMessage_(GadgetID(gadget),#LVM_SETCOLUMN,column,@LVC)
EndProcedure

Procedure SetListIconColumnText(gadget,index,text$)
   LVC.LV_COLUMN
   LVC\mask    = #LVCF_TEXT
   LVC\pszText = @text$
   SendMessage_(GadgetID(gadget),#LVM_SETCOLUMN,index,@LVC)
EndProcedure

Procedure SetListIconColumnWidth(gadget,index,new_width)
   SendMessage_(GadgetID(gadget),#LVM_SETCOLUMNWIDTH,index,new_width)
EndProcedure

Procedure SetListIconColumnFormat(gadget,index,format)
   LVC.LV_COLUMN
   LVC\mask = #LVCF_FMT
   Select format
      Case 0: LVC\fmt = #LVCFMT_LEFT
      Case 1: LVC\fmt = #LVCFMT_CENTER
      Case 2: LVC\fmt = #LVCFMT_RIGHT
   EndSelect
   SendMessage_(GadgetID(gadget),#LVM_SETCOLUMN,index,@LVC)
EndProcedure


Procedure UpdatelParam(ListHandle.l) ; don't need columns [#LVM_GETITEMCOUNT]
   Protected i.l, lTmp.l, lRecs.l, GadgetID.l
   GadgetID = GetDlgCtrlID_(ListHandle)
   lRecs = SendMessage_(ListHandle, #LVM_GETITEMCOUNT, 0, 0)
   For i = 0 To lRecs - 1
      SetGadgetItemData(GadgetID, i, i)
   Next
EndProcedure 
Structure PB_ListIconItem ; undocumented PB stuff
   UserData.l
EndStructure 
Procedure ListIconSortFunction(*item1.PB_ListIconItem, *item2.PB_ListIconItem, lParamSort) 
   A$ = Space(200)
   B$ = Space(200)
   result = 0
   lvi.LV_ITEM
   lvi\iSubItem = lParamSort&$FFFF
   lvi\pszText = @A$
   lvi\cchTextMax = 200
   SendMessage_(GadgetID(0), #LVM_GETITEMTEXT,*item1\UserData,@lvi)
   lvi\pszText = @B$
   SendMessage_(GadgetID(0), #LVM_GETITEMTEXT,*item2\UserData,@lvi) 
   If A$ = B$
      ProcedureReturn 0 ; equal
   EndIf
   x = (lParamSort>>16)&$FFFF
   If x
      If A$ > B$
         ProcedureReturn  1
      Else
         ProcedureReturn -1
      EndIf
   Else
      If A$ > B$
         ProcedureReturn -1
      Else
         ProcedureReturn  1
      EndIf
   EndIf
   ProcedureReturn result
EndProcedure

Procedure.l WinProc(hWnd,Msg,wParam,lParam)
   result = #PB_ProcessPureBasicEvents
   Select Msg
      Case #WM_NOTIFY
         *NMHDR.NMHDR = lParam
         If *NMHDR\hWndFrom = GadgetID(0)
            If *NMHDR\code = #LVN_COLUMNCLICK
               *NMLV.NMLISTVIEW = lParam
               column = *NMLV\iSubItem
               index  = GetListIconColumnImage(0,column)
               ChangeListIconColumnImage(0,column,index!1)
               SendMessage_(GadgetID(0),#LVM_SORTITEMS,column|((index)<<16),@ListIconSortFunction())
               UpdatelParam(GadgetID(0));,5)
            EndIf
         EndIf
   EndSelect
   ProcedureReturn result  ; **************** Invalid Memory Access **************
EndProcedure

CreateListIconArrows(0)

OpenWindow(0,0,0,500,200,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowCallback(@WinProc(),0)
CreateGadgetList(WindowID(0))
ListIconGadget(0,0,0,500,200,"",0,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddListIconColumn(0,1,150,#LI_LEFT    ,"Column 1",ImageID(0)) ; add Image 0
AddListIconColumn(0,2,120,#LI_CENTERED,"Column 2",ImageID(1)) ; add Image 1
AddListIconColumn(0,3, 90,#LI_CENTERED,"Column 3",0)           ; use Image index 0
AddListIconColumn(0,4,105,#LI_RIGHT   ,"Column 4",1)           ; use Image index 1
For a = 0 To 100
   A$ = "COLUMN 1, Row "+RSet(Str(  a  ),3,"0")+Chr(10)
   x = Random($FFFF)
   B$ =                  RSet(Str(  x  ),5,"0")+Chr(10)
   x = Random($7FFFFFFF)
   C$ =              "$"+RSet(Hex(  x  ),8,"0")+Chr(10)
   D$ = "COL 4, Row "   +RSet(Str(100-a),3,"0")
   AddGadgetItem(0,-1,Chr(10)+A$+B$+C$+D$)
Next
UpdatelParam(GadgetID(0));,5)
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow