Quantcast
Channel: AutoIt v3 - General Help and Support
Viewing all articles
Browse latest Browse all 12506

ListView sort problem

$
0
0
Hi guys, i have this script:
[ autoit ]         
  include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiEdit.au3> #include <GuiMenu.au3> #include <WinAPI.au3> Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0, $Number = 0, $hMenu Global Enum $idMoveUp = 1000, $idMoveDown, $idDelete Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT) $hGUI = GUICreate("_GUICtrlListView_Example", 262, 351, -1, -1) $cListview = GUICtrlCreateListView("N°|Test|Test2", 5, 5, 250, 272, $LVS_REPORT) $hListview = GUICtrlGetHandle($cListview) _GUICtrlListView_SetExtendedListViewStyle($hListview, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_BORDERSELECT)) _GUICtrlListView_SetColumnWidth($hListview, 0, 35) _GUICtrlListView_SetColumnWidth($hListview, 1, 107) _GUICtrlListView_SetColumnWidth($hListview, 2, 108) $Label = GUICtrlCreateLabel("Name", 13, 290, 67, 17) $c_Button_Add = GUICtrlCreateButton("Add", 90, 315, 80, 25) $Info = GUICtrlCreateInput("Value", 88, 286, 83, 21) $c_Button_Save = GUICtrlCreateButton("Save", 174, 284, 80, 25) $hMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Move Up", $idMoveUp) _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Move Down", $idMoveDown) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "Delete", $idDelete) $c_Dummy_Down = GUICtrlCreateDummy() $c_Dummy_Up = GUICtrlCreateDummy() $c_Dummy_Delete = GUICtrlCreateDummy() $c_Dummy_Enter = GUICtrlCreateDummy() Local $AccelKeys[4][2] = [["{DELETE}", $c_Dummy_Delete],["{UP}", $c_Dummy_Up],["{DOWN}", $c_Dummy_Down],["{ENTER}", $c_Dummy_Enter]]   GUISetAccelerators($AccelKeys, $hGUI) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListview)] GUISetState(@SW_SHOW) While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE             Exit         Case $c_Button_Add             Add_Item()         Case $c_Button_Save             Save_List()         Case $c_Dummy_Delete             Delete_Item()         Case $c_Dummy_Down             Move_Down()         Case $c_Dummy_Up             Move_Up()         Case $c_Dummy_Enter             If _WinAPI_GetFocus() = $hEdit Then _WinAPI_SetFocus($hListview) ; fires $EN_KILLFOCUS in WM_COMMAND         Case $cListview             _GUICtrlListView_SimpleSort($hListview, $B_DESCENDING, GUICtrlGetState($cListview))     EndSwitch WEnd Func Add_Item()     $Number += 1     _GUICtrlListView_AddItem($hListview, $Number, -1, 9999 + $Number) ; add lparam value, is used for sorting as far as I remember     _GUICtrlListView_AddSubItem($hListview, $Number - 1, GUICtrlRead($Label), 1)     _GUICtrlListView_AddSubItem($hListview, $Number - 1, GUICtrlRead($Info), 2) EndFunc   ;==>Add_Item Func Delete_Item()     _GUICtrlListView_DeleteItemsSelected($hListview)     _Arrange_Numbers() EndFunc   ;==>Delete_Item Func _Arrange_Numbers()     Dim $iCount = 0     $Total_Number = _GUICtrlListView_GetItemCount($hListview) - 1     For $i = 0 To $Total_Number         $iCount += 1         _GUICtrlListView_SetItemText($hListview, $i, $iCount)     Next EndFunc   ;==>_Arrange_Numbers Func Save_List()     Local $Save = FileSaveDialog("Save", @WorkingDir, "Txt Files (*.txt)", 2, "Test_File_" & @MDAY & "-" & @MON & "-" & @YEAR & "_" & @HOUR & "-" & @MIN)     If @error Then         ConsoleWrite("Abort")     Else         $List = FileOpen($Save & ".txt", 2)         $Number_items = _GUICtrlListView_GetItemCount($hListview)         For $i = 0 To $Number_items - 1 Step +1             $output = StringReplace(_GUICtrlListView_GetItemTextString($hListview, $i), "|", " - ")             FileWriteLine($List, $output)         Next         FileClose($List)     EndIf EndFunc   ;==>Save_List Func Move_Up()     Local $Sel, $aArrayListView     $aArrayListView = _GUICtrlListView_CreateArray($hListview)     $Sel = _GUICtrlListView_GetNextItem($hListview)     If $Sel > 0 Then         Local $SelItem, $NxtItem         $SelItem = _GUICtrlListView_GetItemTextArray($hListview, $Sel)         $PrvItem = _GUICtrlListView_GetItemTextArray($hListview, $Sel - 1)         For $i = 1 To $SelItem[0]             $aArrayListView[$Sel][$i - 1] = $PrvItem[$i]             $aArrayListView[$Sel - 1][$i - 1] = $SelItem[$i]             _GUICtrlListView_SetItemText($hListview, $Sel, $PrvItem[$i], $i - 1)             _GUICtrlListView_SetItemText($hListview, $Sel - 1, $SelItem[$i], $i - 1)             _GUICtrlListView_SetItemSelected($hListview, $Sel, 0)             _GUICtrlListView_SetItemSelected($hListview, $Sel - 1)         Next     EndIf     _Arrange_Numbers() EndFunc   ;==>Move_Up Func Move_Down()     Local $Sel, $Lst, $aArrayListView     $aArrayListView = _GUICtrlListView_CreateArray($hListview)     $Sel = _GUICtrlListView_GetNextItem($hListview)     $Lst = _GUICtrlListView_GetItemCount($hListview) - 1     If $Sel < $Lst And $Sel <> -1 Then         Local $SelItem, $NxtItem         $SelItem = _GUICtrlListView_GetItemTextArray($hListview, $Sel)         $NxtItem = _GUICtrlListView_GetItemTextArray($hListview, $Sel + 1)         For $i = 1 To $SelItem[0]             $aArrayListView[$Sel][$i - 1] = $NxtItem[$i]             $aArrayListView[$Sel + 1][$i - 1] = $SelItem[$i]             _GUICtrlListView_SetItemText($hListview, $Sel, $NxtItem[$i], $i - 1)             _GUICtrlListView_SetItemText($hListview, $Sel + 1, $SelItem[$i], $i - 1)             _GUICtrlListView_SetItemSelected($hListview, $Sel, 0)             _GUICtrlListView_SetItemSelected($hListview, $Sel + 1)         Next     EndIf     _Arrange_Numbers() EndFunc   ;==>Move_Down Func _GUICtrlListView_CreateArray($hListview, $sDelimeter = '|')     Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListview), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListview)     If $iColumnCount < 3 Then         $iDim = 3 - $iColumnCount     EndIf     If $sDelimeter = Default Then         $sDelimeter = '|'     EndIf     Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]     For $i = 0 To $iColumnCount - 1         $aColumns = _GUICtrlListView_GetColumn($hListview, $i)         $aReturn[0][2] &= $aColumns[5] & $sDelimeter     Next     $aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))     For $i = 0 To $iItemCount - 1         For $j = 0 To $iColumnCount - 1             $aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListview, $i, $j)         Next     Next     Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn) EndFunc   ;==>_GUICtrlListView_CreateArray Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)     Local $tNMHDR, $hWndFrom, $iCode     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)     $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")     $iCode = DllStructGetData($tNMHDR, "Code")     Switch $hWndFrom         Case $hListview             Switch $iCode                 Case $NM_DBLCLK                     Local $aHit = _GUICtrlListView_SubItemHitTest($hListview)                     If ($aHit[0] <> -1) And ($aHit[1] = 0) Then                         $Item = $aHit[0]                         $SubItem = 0                         Local $aRect = _GUICtrlListView_GetItemRect($hListview, $Item)                     ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then                         $Item = $aHit[0]                         $SubItem = $aHit[1]                         Local $aRect = _GUICtrlListView_GetSubItemRect($hListview, $Item, $SubItem)                     Else                         Return $GUI_RUNDEFMSG                     EndIf                     Local $iItemText = _GUICtrlListView_GetItemText($hListview, $Item, $SubItem)                     Local $iLen = _GUICtrlListView_GetStringWidth($hListview, $iItemText)                     $hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 8, $aRect[1] + 7, $iLen + 10, 17, $Style)                     _GUICtrlEdit_SetSel($hEdit, 0, -1)                     _WinAPI_SetFocus($hEdit)                     $hDC = _WinAPI_GetWindowDC($hEdit)                     $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)                     FrameRect($hDC, 0, 0, $iLen + 10, 17, $hBrush)                 Case $NM_RCLICK                     $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)                     If DllStructGetData($tInfo, "Item") > -1 Then                         _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)                     EndIf             EndSwitch     EndSwitch     Return $GUI_RUNDEFMSG EndFunc   ;==>WM_NOTIFY Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)     Local $stRect = DllStructCreate("int;int;int;int")     DllStructSetData($stRect, 1, $nLeft)     DllStructSetData($stRect, 2, $nTop)     DllStructSetData($stRect, 3, $nRight)     DllStructSetData($stRect, 4, $nBottom)     DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush) EndFunc   ;==>FrameRect Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)     Local $iCode = BitShift($wParam, 16)     Switch $lParam         Case $hEdit             Switch $iCode                 Case $EN_KILLFOCUS                     Local $iText = _GUICtrlEdit_GetText($hEdit)                     _GUICtrlListView_SetItemText($hListview, $Item, $iText, $SubItem)                     _WinAPI_DeleteObject($hBrush)                     _WinAPI_ReleaseDC($hEdit, $hDC)                     _WinAPI_DestroyWindow($hEdit)                     $Item = -1                     $SubItem = 0             EndSwitch     EndSwitch     Switch $wParam         Case $idMoveUp             Move_Up()         Case $idMoveDown             Move_Down()         Case $idDelete             Delete_Item()     EndSwitch     Return $GUI_RUNDEFMSG EndFunc   ;==>WM_COMMAND

I can sort item with ARROW_UP and ARROW_DOWN on the keyboard, move in one position
Work if i select ONE item, not work with multiple items ( CTRL + Click )
How i can manage multiple item selecting and Move_Func?

Thanks for any help

Viewing all articles
Browse latest Browse all 12506

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>