找回密码
 加入
搜索
查看: 145|回复: 7

[AU3基础] _GUICtrlListView_SimpleSort_這函數排序無法將原始值保留)(已解決)

[复制链接]
发表于 2025-11-2 21:15:58 | 显示全部楼层 |阅读模式
本帖最后由 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[3])
                _GUICtrlListView_DeleteItem($GUI_ListView, $temp)
                MsgBox(0,"資料刪除",$temp2[3] & "資料已刪除")
        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 = 0  To $temp -1 Step 1
                $aItem = _GUICtrlListView_GetItemTextArray($GUI_ListView, $i)
                ;_ArrayDisplay($aItem)
                $stringtemp = $aItem[1] & "," & $aItem[2] & "," & $aItem[3] & "," & $aItem[4]
                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[0] <> -1 Then
                                Local $aRect = _GUICtrlListView_GetSubItemRect($GUI_ListView, $aHit[0], $aHit[1])
                                Local $sItemText = _GUICtrlListView_GetItemText($GUI_ListView, $aHit[0], $aHit[1])
                                Local $aPos = ControlGetPos($hWnd, '', $GUI_ListView)
                                Local $iStyle = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
                                $hEdit = _GUICtrlEdit_Create($hWnd, $sItemText, $aPos[0] + $aRect[0], $aPos[1] + $aRect[1], _GUICtrlListView_GetColumnWidth($GUI_ListView, $aHit[1]), $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[0], $sItemText, $aHit[1])
        _WinAPI_DestroyWindow($hEdit)
EndFunc   ;==>_SetItemText

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2025-11-2 22:03:03 | 显示全部楼层
这是数值啊,当然转换后前面就没0了...


二○二五年十一月二日
 楼主| 发表于 2025-11-2 23:42:22 | 显示全部楼层
邪恶海盗 发表于 2025-11-2 22:03
这是数值啊,当然转换后前面就没0了...

這倒也想過,目前還無法讓數值轉為文字格式或是其他方式來處理。頭痛
发表于 2025-11-3 19:19:42 | 显示全部楼层
以文本方式排序如何?
 楼主| 发表于 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[0]
                                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[0]
                                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

发表于 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[3])
                _GUICtrlListView_DeleteItem($GUI_ListView, $temp)
                MsgBox(0,"資料刪除",$temp2[3] & "資料已刪除")
        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 = 0  To $temp -1 Step 1
                $aItem = _GUICtrlListView_GetItemTextArray($GUI_ListView, $i)
                ;_ArrayDisplay($aItem)
                $stringtemp = $aItem[1] & "," & $aItem[2] & "," & $aItem[3] & "," & $aItem[4]
                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[0] <> -1 Then
                                Local $aRect = _GUICtrlListView_GetSubItemRect($GUI_ListView, $aHit[0], $aHit[1])
                                Local $sItemText = _GUICtrlListView_GetItemText($GUI_ListView, $aHit[0], $aHit[1])
                                Local $aPos = ControlGetPos($hWnd, '', $GUI_ListView)
                                Local $iStyle = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
                                $hEdit = _GUICtrlEdit_Create($hWnd, $sItemText, $aPos[0] + $aRect[0], $aPos[1] + $aRect[1], _GUICtrlListView_GetColumnWidth($GUI_ListView, $aHit[1]), $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[0], $sItemText, $aHit[1])
        _WinAPI_DestroyWindow($hEdit)
EndFunc   ;==>_SetItemText

评分

参与人数 1金钱 +20 收起 理由
yohoboy + 20 赞一个!

查看全部评分

 楼主| 发表于 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
 楼主| 发表于 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[0]
                                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[0]
                                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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-11-26 09:40 , Processed in 0.206950 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表