ListView Column Move Topic is solved

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
hasantr
Posts: 933
Joined: 05 Apr 2016, 14:18
Location: İstanbul

ListView Column Move

20 Nov 2019, 17:04

I found such work from the Old Forum. But it does not work as expected. It does not Sort Columns as specified in the new_column_order variable. Is there any way to fix?

https://autohotkey.com/board/topic/11926-can-you-move-a-listview-column-programmatically/

Code: Select all

LVM_FIRST               := 0x1000
LVM_REDRAWITEMS         := 21
LVM_SETCOLUMNORDERARRAY := 58
LVM_GETCOLUMNORDERARRAY := 59

Gui, Add, ListView, grid Checked vTestList, C1|C2|C3|C4|C5
Gui, Add, Button  , gShift                , Shift
Gui, Add, Button  , gGet                  , Get
Gui, Add, Statusbar

Gui Show, Autosize Center +Resize, Column re-order test

LV_Add( "", "r1c1", "r1c2", "r1c3", "r1c4", "r1c5" )
LV_Add( "", "r2c1", "r2c2", "r2c3", "r2c4", "r2c5" )
LV_Add( "", "r3c1", "r3c2", "r3c3", "r3c4", "r3c5" )
LV_ModifyCol()
Return


Shift:
{
    New_Column_Order := "3|5|1|2|4"

    LV_Set_Column_Order( LV_GetCount( "Column" ), New_Column_Order )
}
return


Get:
{
    MsgBox, % LV_Get_Column_Order( LV_GetCount( "Column" ) )
}
Return


LV_Set_Column_Order( _Num_Of_Columns, _New_Column_Order, _lvID="1", Delim="," )
{
    local colOrder, pos
    VarSetCapacity( colOrder, _Num_Of_Columns * 4, 0 )
    
    Loop, Parse, _New_Column_Order, %Delim%
    {
        pos := A_Index - 1
        NumPut( A_LoopField - 1, colOrder, pos * 4, "UInt" )
    }
    
    SendMessage, LVM_FIRST + LVM_SETCOLUMNORDERARRAY
               , _Num_Of_Columns, &colOrder, SysListView32%_lvId%, A   ; LVM_SETCOLUMNORDERARRAY
    
    SendMessage, LVM_FIRST + LVM_REDRAWITEMS        
               , 0, _Num_Of_Columns - 1, SysListView32%_lvId%, A   ; LVM_REDRAWITEMS
    
    VarSetCapacity( colOrder, 0 ) ; Clean up.
}


LV_Get_Column_Order( _Num_Of_Columns, _lvID="1", Delim="," )
{
    local colOrder, pos
    Output := ""
    VarSetCapacity( colOrder, _Num_Of_Columns * 4, 0 )
    
    SendMessage, LVM_FIRST + LVM_GETCOLUMNORDERARRAY
               , _Num_Of_Columns, &colOrder, SysListView32%_lvID%, A   ; LVM_GETCOLUMNORDERARRAY

    Loop, % _Num_Of_Columns
    {
        pos := A_Index - 1
        Col := NumGet( colOrder, pos * 4, "UInt"  ) + 1 ; Array is zero-based so we add one.
        Output .= Col . Delim
    }
    StringTrimRight, Output, Output, 1 ; Trim trailing delimiter.
    VarSetCapacity( colOrder, 0 ) ; Clean up.
    Return, Output
}


GuiEscape:
GuiClose:
{
    ExitApp
}
Return
User avatar
Xtra
Posts: 2750
Joined: 02 Oct 2015, 12:15

Re: ListView Column Move  Topic is solved

20 Nov 2019, 19:14

When not using the default delimiter (comma) you need to specify it in the appropriate parameter.
New_Column_Order := "3|5|1|2|4"
LV_Set_Column_Order( LV_GetCount( "Column" ), New_Column_Order , 1, "|")
hasantr
Posts: 933
Joined: 05 Apr 2016, 14:18
Location: İstanbul

Re: ListView Column Move

21 Nov 2019, 01:31

Xtra wrote:
20 Nov 2019, 19:14
When not using the default delimiter (comma) you need to specify it in the appropriate parameter.
New_Column_Order := "3|5|1|2|4"
LV_Set_Column_Order( LV_GetCount( "Column" ), New_Column_Order , 1, "|")
I'm as careless as I am a novice. Thank you. It works very well now.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Billykid, filipemb, haomingchen1998, mikeyww, Oblomov228, RussF and 255 guests