yohoboy 发表于 2025-11-2 21:15:58

_GUICtrlListView_SimpleSort_這函數排序無法將原始值保留)(已解決)

本帖最后由 yohoboy 于 2025-11-5 00:09 编辑

各位大神您好

   目前嘗試使用_GUICtrlListView_SimpleSort這函數用來排序,發覺使用排序後,如果前面欄位為0都會去掉

例如: 原始值:000001排序後:1 , 而前面的5個0 因排序自動刪除,因此如何能讓排序上,不受影響,讀取原始值再進行排序(保留原始資料格式)?

詳附件資料
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <WinAPI.au3>
#include <GUIEdit.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <ButtonConstants.au3>


Opt("TrayIconHide", 0)               ;0 = 顯示托盤圖標, 1 = 隱藏托盤圖標
Opt('MustDeclareVars', 1)      ;0 = 變量不需預先聲明, 1 = 變量必需預先聲明
Opt("GUICloseOnESC", 1)         ;0 = 點擊 Esc 鍵不關閉1 = 點擊 Esc 鍵關閉,

Global $hEdit, $aHit, $aRect, $aPos, $iHeight = 20
Global $aItem,$nMsg

Local $GUI_Form = GUICreate("ListView_Sort",450,400)
Local $Button_Close = GUICtrlCreateButton("關閉", 310, 370, 85, 25)
Global $Button_Read_WhiteList = GUICtrlCreateButton("讀list", 200, 370, 85, 25)
Local $Button_Export = GUICtrlCreateButton("匯出", 100, 370, 85, 25)
Local $Button_Delete = GUICtrlCreateButton("刪除", 10, 370, 85, 25)
Local $Button_NewList = GUICtrlCreateButton("新增", 10, 340, 85, 25)
Local $Button_Sort = GUICtrlCreateButton("排序", 100, 340, 85, 25)
Global $GUI_ListView_1 = GUICtrlCreateListView("title1|title2|title3|title4", 10, 10, 430, 250)
Global $GUI_ListView = GUICtrlGetHandle($GUI_ListView_1);回傳LISTVIEW
_GUICtrlListView_SetColumnWidth($GUI_ListView, 0, 80)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 1, 120)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 2, 90)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 3, 90)


Global $hFont = _WinAPI_CreateFont($iHeight - 2, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, '新細明體')

GUISetState(@SW_SHOW,$GUI_Form)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')


While 1
      Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $Button_Close
                        Exit
                Case $Button_Read_WhiteList
                        WhiteList()
                Case $Button_Export
                        Button_Export()
                Case $Button_Delete
                        Button_Delete()
                Case $Button_NewList
                        Button_NewList()
                Case $Button_Sort
                        Button_Sort()
      EndSwitch
WEnd

Func Button_Sort()
      Local $vSortSense = False
      _GUICtrlListView_SimpleSort($GUI_ListView, $vSortSense, 3, False) ; 防止下一次插入排序方向切换
EndFunc

Func Button_NewList()
      Local $temp = _GUICtrlListView_GetItemCount($GUI_ListView)
      _GUICtrlListView_AddItem($GUI_ListView, "新增")
      _GUICtrlListView_ClickItem($GUI_ListView, $temp, "left", False, 2)
EndFunc

Func Button_Delete() ;刪除
      Local $temp = _GUICtrlListView_GetSelectedIndices($GUI_ListView)
      ;MsgBox(0,"$temp",$temp)
      If $temp <> "" Then
                Local $temp2 = _GUICtrlListView_GetItem ( $GUI_ListView, $temp, 1 )
                ;MsgBox(0,"$temp",$temp2)
                _GUICtrlListView_DeleteItem($GUI_ListView, $temp)
                MsgBox(0,"資料刪除",$temp2 & "資料已刪除")
      EndIf
EndFunc


Func Button_Export() ;匯出
      Local $stringtemp
      FileDelete("白名單-" & @YEAR & "-" & @MON & "-" & @MDAY & ".txt")
      Sleep(500)
      ;Local $temp = _GUICtrlListView_GetColumnCount($GUI_ListView)
      Local $temp =_GUICtrlListView_GetItemCount ($GUI_ListView)
      ;MsgBox(0,"$temp",$temp)
      Local $hFileOpen = FileOpen("test_listview-" & @YEAR & "-" & @MON & "-" & @MDAY & ".txt",512+1)
      For $i = 0To $temp -1 Step 1
                $aItem = _GUICtrlListView_GetItemTextArray($GUI_ListView, $i)
                ;_ArrayDisplay($aItem)
                $stringtemp = $aItem & "," & $aItem & "," & $aItem & "," & $aItem
                FileWriteLine($hFileOpen, $stringtemp )
      Next
      FileClose($hFileOpen)
      MsgBox(0,"匯出完成","test_listview已匯出完成")
EndFunc



Func WhiteList() ;讀白名單
      Local $WhiteList_File_Open, $hFileOpen, $ListArray, $FileOpen
      $WhiteList_File_Open = FileOpenDialog("選擇文件", @ScriptDir, "選擇文件 (*.txt)", 1)
      ;MsgBox(0,"$WhiteList_File_Open",$WhiteList_File_Open)
      If @error Then
                MsgBox($MB_SYSTEMMODAL, "", "沒有選擇文件")
      Else
                If Not _FileReadToArray($WhiteList_File_Open, $ListArray, $FRTA_COUNT, ",") Then
                        MsgBox($MB_SYSTEMMODAL, "", "读取该文件时出错. @error: " & @error) ; 读取当前文件时出错.
                EndIf
                ;_ArrayDisplay($ListArray, "arrays 数组 - 计数", Default, 8)
                _ArrayDelete($ListArray, 0)
                _GUICtrlListView_AddArray($GUI_ListView,$ListArray)
      EndIf
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      Local $tNMHDR, $hWndFrom, $iCode, $hFont
      $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
      $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
      $iCode = DllStructGetData($tNMHDR, 'Code')
      Switch $iCode
                Case $NM_DBLCLK
                        Global $aHit = _GUICtrlListView_SubItemHitTest($GUI_ListView)
                        If $aHit <> -1 Then
                              Local $aRect = _GUICtrlListView_GetSubItemRect($GUI_ListView, $aHit, $aHit)
                              Local $sItemText = _GUICtrlListView_GetItemText($GUI_ListView, $aHit, $aHit)
                              Local $aPos = ControlGetPos($hWnd, '', $GUI_ListView)
                              Local $iStyle = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
                              $hEdit = _GUICtrlEdit_Create($hWnd, $sItemText, $aPos + $aRect, $aPos + $aRect, _GUICtrlListView_GetColumnWidth($GUI_ListView, $aHit), $iHeight, $iStyle)
                              _WinAPI_BringWindowToTop($hEdit)
                              _WinAPI_SetFont($hEdit, $hFont, True)
                              _GUICtrlEdit_SetMargins($hEdit, $EC_LEFTMARGIN, 4)
                              _WinAPI_SetFocus($hEdit)
                              _GUICtrlEdit_SetSel($hEdit, 0, -1)
                        EndIf
                Case $NM_CLICK
      EndSwitch
EndFunc   ;==>WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
      Local $iCode = BitShift($iwParam, 16)
      Local $nMsgID = BitAND($iwParam, 0x0000FFFF)
      Switch $ilParam
                Case $hEdit
                        Switch $iCode
                              Case $EN_KILLFOCUS
                                        _SetItemText()
                        EndSwitch
      EndSwitch

      If $nMsgID = 1 And $hEdit <> '' Then
                _SetItemText()
      EndIf
      Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _SetItemText()
      Local $sItemText
      $sItemText = _GUICtrlEdit_GetText($hEdit)
      _GUICtrlListView_SetItemText($GUI_ListView, $aHit, $sItemText, $aHit)
      _WinAPI_DestroyWindow($hEdit)
EndFunc   ;==>_SetItemText

邪恶海盗 发表于 2025-11-2 22:03:03

这是数值啊,当然转换后前面就没0了...


二○二五年十一月二日

yohoboy 发表于 2025-11-2 23:42:22

邪恶海盗 发表于 2025-11-2 22:03
这是数值啊,当然转换后前面就没0了...




這倒也想過,目前還無法讓數值轉為文字格式或是其他方式來處理。頭痛

chishingchan 发表于 2025-11-3 19:19:42

以文本方式排序如何?

yohoboy 发表于 2025-11-4 00:07:52

本帖最后由 yohoboy 于 2025-11-4 00:35 编辑

chishingchan 发表于 2025-11-3 19:19
以文本方式排序如何?
目前也只能用文本方式來處理,不過還需要理解一下GUILISTVIEW.AU3 自訂義涵數中的_GUICtrlListView_SimpleSort 這個
怎麼運作的,再從中加入 "[" &%TEMP&"]"使之變成文本,然後排序完再靠 StringLen("字符串") 這個取得長度後再透過
stringmid 函數從("字串符",2,'長度-1')再回填到listview 欄位內,應該可完美保留數字開頭為0 時自動刪除的問題,可惜功力不足
無法立即修改函數達成所需,如果成功的話可再增加這函數功能 _GUICtrlListView_TextSort 給引用
Func _GUICtrlListView_SimpleSort($hWnd, ByRef $vSortSense, $iCol, $bToggleSense = True)
      Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd)
      If $iItemCount Then
                Local $iDescending = 0
                If UBound($vSortSense) Then
                        $iDescending = $vSortSense[$iCol]
                Else
                        $iDescending = $vSortSense
                EndIf
                Local $vSeparatorChar = Opt('GUIDataSeparatorChar')
                Local $iColumnCount = _GUICtrlListView_GetColumnCount($hWnd)
                Local Enum $iIndexValue = $iColumnCount, $iItemParam ; Additional columns for the index value and ItemParam
                Local $aListViewItems[$iItemCount][$iColumnCount + 2]

                Local $aSelectedItems = StringSplit(_GUICtrlListView_GetSelectedIndices($hWnd), $vSeparatorChar)
                Local $aCheckedItems = __GUICtrlListView_GetCheckedIndices($hWnd)
                Local $sItemText, $iFocused = -1
                For $i = 0 To $iItemCount - 1 ; Rows
                        If $iFocused = -1 Then
                              If _GUICtrlListView_GetItemFocused($hWnd, $i) Then $iFocused = $i
                        EndIf
                        _GUICtrlListView_SetItemSelected($hWnd, $i, False)
                        _GUICtrlListView_SetItemChecked($hWnd, $i, False)
                        For $j = 0 To $iColumnCount - 1 ; Columns
                              $sItemText = StringStripWS(_GUICtrlListView_GetItemText($hWnd, $i, $j), $STR_STRIPTRAILING)
                              If (StringIsFloat($sItemText) Or StringIsInt($sItemText)) Then
                                        $aListViewItems[$i][$j] = Number($sItemText)
                              Else
                                        $aListViewItems[$i][$j] = $sItemText
                              EndIf
                        Next
                        $aListViewItems[$i][$iIndexValue] = $i ; Index value
                        $aListViewItems[$i][$iItemParam] = _GUICtrlListView_GetItemParam($hWnd, $i) ; ItemParam
                Next

                ; Sort the ListView array
                _ArraySort($aListViewItems, $iDescending, 0, 0, $iCol)

                For $i = 0 To $iItemCount - 1 ; Rows
                        For $j = 0 To $iColumnCount - 1 ; Columns
                              _GUICtrlListView_SetItemText($hWnd, $i, $aListViewItems[$i][$j], $j)
                        Next

                        _GUICtrlListView_SetItemParam($hWnd, $i, $aListViewItems[$i][$iItemParam]) ; ItemParam

                        For $j = 1 To $aSelectedItems
                              If $aListViewItems[$i][$iIndexValue] = $aSelectedItems[$j] Then
                                        If $aListViewItems[$i][$iIndexValue] = $iFocused Then
                                                _GUICtrlListView_SetItemSelected($hWnd, $i, True, True)
                                        Else
                                                _GUICtrlListView_SetItemSelected($hWnd, $i, True)
                                        EndIf
                                        ExitLoop
                              EndIf
                        Next
                        For $j = 1 To $aCheckedItems
                              If $aListViewItems[$i][$iIndexValue] = $aCheckedItems[$j] Then
                                        _GUICtrlListView_SetItemChecked($hWnd, $i, True)
                                        ExitLoop
                              EndIf
                        Next
                Next
                If $bToggleSense Then ; Automatic sort sense toggle
                        If UBound($vSortSense) Then
                              $vSortSense[$iCol] = Not $iDescending
                        Else
                              $vSortSense = Not $iDescending
                        EndIf
                EndIf
      EndIf
EndFunc   ;==>_GUICtrlListView_SimpleSort

sliqi 发表于 2025-11-4 15:00:24

你的繁体字我看不太懂,我在你的排序处加了两行代码,你看是你要的效果吗?

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <WinAPI.au3>
#include <GUIEdit.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <ButtonConstants.au3>


Opt("TrayIconHide", 0)                 ;0 = 顯示托盤圖標, 1 = 隱藏托盤圖標
Opt('MustDeclareVars', 1)        ;0 = 變量不需預先聲明, 1 = 變量必需預先聲明
Opt("GUICloseOnESC", 1)         ;0 = 點擊 Esc 鍵不關閉1 = 點擊 Esc 鍵關閉,

Global $hEdit, $aHit, $aRect, $aPos, $iHeight = 20
Global $aItem,$nMsg

Local $GUI_Form = GUICreate("ListView_Sort",450,400)
Local $Button_Close = GUICtrlCreateButton("關閉", 310, 370, 85, 25)
Global $Button_Read_WhiteList = GUICtrlCreateButton("讀list", 200, 370, 85, 25)
Local $Button_Export = GUICtrlCreateButton("匯出", 100, 370, 85, 25)
Local $Button_Delete = GUICtrlCreateButton("刪除", 10, 370, 85, 25)
Local $Button_NewList = GUICtrlCreateButton("新增", 10, 340, 85, 25)
Local $Button_Sort = GUICtrlCreateButton("排序", 100, 340, 85, 25)
Global $GUI_ListView_1 = GUICtrlCreateListView("title1|title2|title3|title4", 10, 10, 430, 250)
Global $GUI_ListView = GUICtrlGetHandle($GUI_ListView_1);回傳LISTVIEW
_GUICtrlListView_SetColumnWidth($GUI_ListView, 0, 80)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 1, 120)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 2, 90)
_GUICtrlListView_SetColumnWidth($GUI_ListView, 3, 90)


Global $hFont = _WinAPI_CreateFont($iHeight - 2, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, '新細明體')

GUISetState(@SW_SHOW,$GUI_Form)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')


While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $Button_Close
                        Exit
                Case $Button_Read_WhiteList
                        WhiteList()
                Case $Button_Export
                        Button_Export()
                Case $Button_Delete
                        Button_Delete()
                Case $Button_NewList
                        Button_NewList()
                Case $Button_Sort
                        Button_Sort()
        EndSwitch
WEnd

Func Button_Sort()
        Local $vSortSense = False
_GUICtrlListView_RegisterSortCallBack($GUI_ListView);////////////////新增行
_GUICtrlListView_SortItems($GUI_ListView, GUICtrlGetState($GUI_ListView));////////////////新增行
;        _GUICtrlListView_SimpleSort($GUI_ListView, $vSortSense, 3, False) ; 防止下一次插入排序方向切换

EndFunc

Func Button_NewList()
        Local $temp = _GUICtrlListView_GetItemCount($GUI_ListView)
        _GUICtrlListView_AddItem($GUI_ListView, "新增")
        _GUICtrlListView_ClickItem($GUI_ListView, $temp, "left", False, 2)
EndFunc

Func Button_Delete() ;刪除
        Local $temp = _GUICtrlListView_GetSelectedIndices($GUI_ListView)
        ;MsgBox(0,"$temp",$temp)
        If $temp <> "" Then
                Local $temp2 = _GUICtrlListView_GetItem ( $GUI_ListView, $temp, 1 )
                ;MsgBox(0,"$temp",$temp2)
                _GUICtrlListView_DeleteItem($GUI_ListView, $temp)
                MsgBox(0,"資料刪除",$temp2 & "資料已刪除")
        EndIf
EndFunc


Func Button_Export() ;匯出
        Local $stringtemp
        FileDelete("白名單-" & @YEAR & "-" & @MON & "-" & @MDAY & ".txt")
        Sleep(500)
        ;Local $temp = _GUICtrlListView_GetColumnCount($GUI_ListView)
        Local $temp =_GUICtrlListView_GetItemCount ($GUI_ListView)
        ;MsgBox(0,"$temp",$temp)
        Local $hFileOpen = FileOpen("test_listview-" & @YEAR & "-" & @MON & "-" & @MDAY & ".txt",512+1)
        For $i = 0To $temp -1 Step 1
                $aItem = _GUICtrlListView_GetItemTextArray($GUI_ListView, $i)
                ;_ArrayDisplay($aItem)
                $stringtemp = $aItem & "," & $aItem & "," & $aItem & "," & $aItem
                FileWriteLine($hFileOpen, $stringtemp )
        Next
        FileClose($hFileOpen)
        MsgBox(0,"匯出完成","test_listview已匯出完成")
EndFunc



Func WhiteList() ;讀白名單
        Local $WhiteList_File_Open, $hFileOpen, $ListArray, $FileOpen
        $WhiteList_File_Open = FileOpenDialog("選擇文件", @ScriptDir, "選擇文件 (*.txt)", 1)
        ;MsgBox(0,"$WhiteList_File_Open",$WhiteList_File_Open)
        If @error Then
                MsgBox($MB_SYSTEMMODAL, "", "沒有選擇文件")
        Else
                If Not _FileReadToArray($WhiteList_File_Open, $ListArray, $FRTA_COUNT, ",") Then
                        MsgBox($MB_SYSTEMMODAL, "", "读取该文件时出错. @error: " & @error) ; 读取当前文件时出错.
                EndIf
                ;_ArrayDisplay($ListArray, "arrays 数组 - 计数", Default, 8)
                _ArrayDelete($ListArray, 0)
                _GUICtrlListView_AddArray($GUI_ListView,$ListArray)
        EndIf
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $tNMHDR, $hWndFrom, $iCode, $hFont
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
        $iCode = DllStructGetData($tNMHDR, 'Code')
        Switch $iCode
                Case $NM_DBLCLK
                        Global $aHit = _GUICtrlListView_SubItemHitTest($GUI_ListView)
                        If $aHit <> -1 Then
                                Local $aRect = _GUICtrlListView_GetSubItemRect($GUI_ListView, $aHit, $aHit)
                                Local $sItemText = _GUICtrlListView_GetItemText($GUI_ListView, $aHit, $aHit)
                                Local $aPos = ControlGetPos($hWnd, '', $GUI_ListView)
                                Local $iStyle = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
                                $hEdit = _GUICtrlEdit_Create($hWnd, $sItemText, $aPos + $aRect, $aPos + $aRect, _GUICtrlListView_GetColumnWidth($GUI_ListView, $aHit), $iHeight, $iStyle)
                                _WinAPI_BringWindowToTop($hEdit)
                                _WinAPI_SetFont($hEdit, $hFont, True)
                                _GUICtrlEdit_SetMargins($hEdit, $EC_LEFTMARGIN, 4)
                                _WinAPI_SetFocus($hEdit)
                                _GUICtrlEdit_SetSel($hEdit, 0, -1)
                        EndIf
                Case $NM_CLICK
        EndSwitch
EndFunc   ;==>WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $iCode = BitShift($iwParam, 16)
        Local $nMsgID = BitAND($iwParam, 0x0000FFFF)
        Switch $ilParam
                Case $hEdit
                        Switch $iCode
                                Case $EN_KILLFOCUS
                                        _SetItemText()
                        EndSwitch
        EndSwitch

        If $nMsgID = 1 And $hEdit <> '' Then
                _SetItemText()
        EndIf
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func _SetItemText()
        Local $sItemText
        $sItemText = _GUICtrlEdit_GetText($hEdit)
        _GUICtrlListView_SetItemText($GUI_ListView, $aHit, $sItemText, $aHit)
        _WinAPI_DestroyWindow($hEdit)
EndFunc   ;==>_SetItemText

yohoboy 发表于 2025-11-4 22:07:28

sliqi 发表于 2025-11-4 15:00
你的繁体字我看不太懂,我在你的排序处加了两行代码,你看是你要的效果吗?

#include


有達到我的需求,我也變更以列3 為排序測試也ok, 這兩個函數我再研究研究。感謝大神
Func Button_Sort()
      Local $vSortSense = False
_GUICtrlListView_RegisterSortCallBack($GUI_ListView);////////////////新增行
;_GUICtrlListView_SortItems($GUI_ListView, GUICtrlGetState($GUI_ListView));////////////////新增行
_GUICtrlListView_SortItems($GUI_ListView, 3);////////////////新增行 指定列3 做排列
;      _GUICtrlListView_SimpleSort($GUI_ListView, $vSortSense, 3, False) ; 防止下一次插入排序方向切换

EndFunc

yohoboy 发表于 2025-11-9 12:08:26

自己回自己,追加#include "_GUICtrlListView_TextSort.au3"
把 _GUICtrlListView_SimpleSort 改為 _GUICtrlListView_TextSort(( $hWnd, ByRef $vSortSense, $iCol [, $bToggleSense = True] ))
函數就可以 避免數字前面0值強制清除

Func _GUICtrlListView_TextSort($hWnd, ByRef $vSortSense, $iCol, $bToggleSense = True)
        Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd);取得listview行數量
        If $iItemCount Then ;如果有行數量
                Local $iDescending = 0
                ;MsgBox(0,"$vSortSense",$vSortSense) ;$vSortSense = True - 降序排列,False - 升序排列
                If UBound($vSortSense) Then
                        $iDescending = $vSortSense[$iCol]
                Else
                        $iDescending = $vSortSense
                EndIf
                Local $vSeparatorChar = Opt('GUIDataSeparatorChar')
                Local $iColumnCount = _GUICtrlListView_GetColumnCount($hWnd) ;讀取列表列數
                Local Enum $iIndexValue = $iColumnCount, $iItemParam ; Additional columns for the index value and ItemParam
                Local $aListViewItems[$iItemCount][$iColumnCount + 2]

                Local $aSelectedItems = StringSplit(_GUICtrlListView_GetSelectedIndices($hWnd), $vSeparatorChar)
                Local $aCheckedItems = __GUICtrlListView_GetCheckedIndices($hWnd)
                Local $sItemText, $iFocused = -1
                local $Item_Temp
                For $i = 0 To $iItemCount - 1 ; Rows
                        If $iFocused = -1 Then
                                If _GUICtrlListView_GetItemFocused($hWnd, $i) Then $iFocused = $i
                        EndIf
                        _GUICtrlListView_SetItemSelected($hWnd, $i, False)
                        _GUICtrlListView_SetItemChecked($hWnd, $i, False)
                        For $j = 0 To $iColumnCount - 1 ; Columns
                                $Item_Temp = "[" & _GUICtrlListView_GetItemText($hWnd, $i, $j) & "]"
                                ;MsgBox(0,"$Item_Temp",$Item_Temp)
                                $sItemText = StringStripWS($Item_Temp, $STR_STRIPTRAILING)
                                If (StringIsFloat($sItemText) Or StringIsInt($sItemText)) Then
                                        ;MsgBox(0,"Number($sItemText)",Number($sItemText))
                                        $aListViewItems[$i][$j] = Number($sItemText)
                                Else
                                        $aListViewItems[$i][$j] = $sItemText
                                EndIf
                        Next

                        $aListViewItems[$i][$iIndexValue] = $i ; Index value
                        $aListViewItems[$i][$iItemParam] = _GUICtrlListView_GetItemParam($hWnd, $i) ; ItemParam
                Next

                ; Sort the ListView array
                _ArraySort($aListViewItems, $iDescending, 0, 0, $iCol)
                ;_ArrayDisplay($aListViewItems)

                ;MsgBox(0,"$iItemCount",$iItemCount)
                ;MsgBox(0,"$iColumnCount",$iColumnCount)
                Local $Str_temp,$Str_Len, $Str_Done
                For $i = 0 To $iItemCount - 1 ; Rows
                        For $j = 0 To $iColumnCount - 1 ; Columns
                                $Str_temp = $aListViewItems[$i][$j]
                                ;MsgBox(0,"$str_temp",$str_temp)
                                $Str_Len = StringLen($Str_temp) - 2
                                ;MsgBox(0,"$Str_Len",$Str_Len)
                                $Str_Done =StringMid($Str_temp,2,$Str_Len)
                                ;MsgBox(0,"$Str_Done",$Str_Done)
                                $aListViewItems[$i][$j] = $Str_Done
                        Next
                Next
                ;_ArrayDisplay($aListViewItems)

                For $i = 0 To $iItemCount - 1 ; Rows
                        For $j = 0 To $iColumnCount - 1 ; Columns
                                _GUICtrlListView_SetItemText($hWnd, $i, $aListViewItems[$i][$j], $j)
                        Next
                        ;_ArrayDisplay($aListViewItems)
                        ;MsgBox(0,"$aListViewItems[$i][$iItemParam]",$aListViewItems[$i][$iItemParam])
                        _GUICtrlListView_SetItemParam($hWnd, $i, $aListViewItems[$i][$iItemParam]) ; ItemParam

                        For $j = 1 To $aSelectedItems
                                If $aListViewItems[$i][$iIndexValue] = $aSelectedItems[$j] Then
                                        If $aListViewItems[$i][$iIndexValue] = $iFocused Then
                                                _GUICtrlListView_SetItemSelected($hWnd, $i, True, True)
                                        Else
                                                _GUICtrlListView_SetItemSelected($hWnd, $i, True)
                                        EndIf
                                        ExitLoop
                                EndIf
                        Next
                        For $j = 1 To $aCheckedItems
                                If $aListViewItems[$i][$iIndexValue] = $aCheckedItems[$j] Then
                                        _GUICtrlListView_SetItemChecked($hWnd, $i, True)
                                        ExitLoop
                                EndIf
                        Next
                Next
                If $bToggleSense Then ; Automatic sort sense toggle
                        If UBound($vSortSense) Then
                                $vSortSense[$iCol] = Not $iDescending
                        Else
                                $vSortSense = Not $iDescending
                        EndIf
                EndIf
        EndIf
EndFunc   ;==>_GUICtrlListView_SimpleSo
页: [1]
查看完整版本: _GUICtrlListView_SimpleSort_這函數排序無法將原始值保留)(已解決)