Sign in to follow this  
Followers 0
Wooltown

GUICtrlRegisterListViewSort

6 posts in this topic

I tried to use GUICtrlRegisterListViewSort when having set GUIOnEventMode to 1, but, I can't get it to work, is there anyone who can guide me in the right direction?

Opt("GUIOnEventMode", 1)

Share this post


Link to post
Share on other sites



I did the same thing (used GUICtrlRegisterListViewSort and Opt('GuiOnEventMode',1) ) without any problems could you post an example of your script; maybe I can give you a good nudge in the right direction. Although, I'm having some problems too, so maybe we can help eachother.


A decision is a powerful thing

Share this post


Link to post
Share on other sites

I did the same thing (used GUICtrlRegisterListViewSort and Opt('GuiOnEventMode',1) ) without any problems could you post an example of your script; maybe I can give you a good nudge in the right direction. Although, I'm having some problems too, so maybe we can help eachother.

Hello !

Glad to help you if I can, we can try with my problem, we can take a look at the Help File Example 1 and you can explain how to do it with Opt('GuiOnEventMode',1)

; *******************************************************
; Example 1 - sorting 3 column's different
; *******************************************************

#include <GUIConstants.au3>

;Global Const $LVFI_PARAM          = 0x0001
;Global Const $LVIF_TEXT                = 0x0001
;Global Const $LVM_FIRST                = 0x1000
Global Const $LVM_GETITEM          = $LVM_FIRST + 5
;Global Const $LVM_FINDITEM      = $LVM_FIRST + 13
;Global Const $LVM_SETSELECTEDCOLUMN    = $LVM_FIRST + 140

Dim $nCurCol    = -1
Dim $nSortDir   = 1
Dim $bSet      = 0
Dim $nCol      = -1

$hGUI   = GUICreate("Test", 300, 200)

$lv  = GUICtrlCreateListView("Column1|Col2|Col3", 10, 10, 280, 180)
GUICtrlRegisterListViewSort(-1, "LVSort"); Register the function "SortLV" for the sorting callback

$lvi1   = GUICtrlCreateListViewItem("ABC|666|10.05.2004", $lv)
GUICtrlSetImage(-1, "shell32.dll", 7)
$lvi2   = GUICtrlCreateListViewItem("DEF|444|11.05.2005", $lv)
GUICtrlSetImage(-1, "shell32.dll", 12)
$lvi3   = GUICtrlCreateListViewItem("CDE|444|12.05.2004", $lv)
GUICtrlSetImage(-1, "shell32.dll", 3)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
            
        Case $lv
            $bSet = 0
            $nCurCol = $nCol
            GUICtrlSendMsg($lv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($lv), 0)
            DllCall("user32.dll", "int", "InvalidateRect", "hwnd", GUICtrlGetHandle($lv), "int", 0, "int", 1)
    EndSwitch
WEnd

Exit


; Our sorting callback funtion
Func LVSort($hWnd, $nItem1, $nItem2, $nColumn)
    Local $nSort
    
   ; Switch the sorting direction
    If $nColumn = $nCurCol Then
        If Not $bSet Then
            $nSortDir = $nSortDir * -1
            $bSet = 1
        EndIf
    Else
        $nSortDir = 1
    EndIf
    $nCol = $nColumn
        
    $val1   = GetSubItemText($lv, $nItem1, $nColumn)
    $val2   = GetSubItemText($lv, $nItem2, $nColumn)
    
   ; If it is the 3rd colum (column starts with 0) then compare the dates
    If $nColumn = 2 Then
        $val1 = StringRight($val1, 4) & StringMid($val1, 4, 2) & StringLeft($val1, 2)
        $val2 = StringRight($val2, 4) & StringMid($val2, 4, 2) & StringLeft($val2, 2)
    EndIf
        
    $nResult = 0       ; No change of item1 and item2 positions
    
    If $val1 < $val2 Then
        $nResult = -1  ; Put item2 before item1
    ElseIf  $val1 > $val2 Then
        $nResult = 1   ; Put item2 behind item1
    EndIf

    $nResult = $nResult * $nSortDir
    
    Return $nResult
EndFunc

; Retrieve the text of a listview item in a specified column
Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
    Local $stLvfi      = DllStructCreate("uint;ptr;int;int[2];int")
    DllStructSetData($stLvfi, 1, $LVFI_PARAM)
    DllStructSetData($stLvfi, 3, $nItemID)

    Local $stBuffer  = DllStructCreate("char[260]")
    
    $nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
    
    Local $stLvi        = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
    
    DllStructSetData($stLvi, 1, $LVIF_TEXT)
    DllStructSetData($stLvi, 2, $nIndex)
    DllStructSetData($stLvi, 3, $nColumn)
    DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
    DllStructSetData($stLvi, 7, 260)

    GUICtrlSendMsg($nCtrlID, $LVM_GETITEM, 0, DllStructGetPtr($stLvi));

    $sItemText  = DllStructGetData($stBuffer, 1)

    $stLvi    = 0
    $stLvfi  = 0
    $stBuffer   = 0
    
    Return $sItemText
EndFunc

Share this post


Link to post
Share on other sites

Solved it myself, it works but I don't know how the sort works, I just accept it, can I help you ?

Share this post


Link to post
Share on other sites

Solved it myself, it works but I don't know how the sort works, I just accept it, can I help you ?

My original post was confusing. My bad. Yeah, I do have GUICtrlRegisterListViewSort and Opt('GuiOnEventMode',1) working together. My issue is sorting without having to click the column. This would allow sorting onenter and sorting after events.

Check out: #330349


A decision is a powerful thing

Share this post


Link to post
Share on other sites

I will take a look at it later, could be fun to solve it, in a week or two I think I will have time, but you never now sometimes the work you have goes quicker and you have some spare time.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0