Hi guys, i have this script:
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
[ 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