|
本帖最后由 txm888 于 2014-4-1 07:28 编辑
近期问题多多,又发现_GUICtrlListView_FindText搜索中文有个严重问题,如果搜索关键字含中文,而控件里又没找到的话,是返回的0,而帮助文里说搜索不到返回-1
其次,搜索关键字若包含中文,搜索只能模糊匹配第一项,不能完全匹配,不管$fPartialOK = True是设置False还是True都不行,相反,搜索英文和数字是很好精确的,支持模糊和完全匹配
有没有哪位遇到这问题的啊?
_GUICtrlListView_FindText
--------------------------------------------------------------------------------
用指定文本搜索项目
#Include <GuiListView.au3>
_GUICtrlListView_FindText($hWnd, $sText[, $iStart = -1[, $fPartialOK = True[, $fWrapOK = True]]])
参数
$hWnd 控件句柄
$sText 匹配的文本
$iStart 开始搜索的基于 0 的项目索引 或设置为 -1, 从开始进行. 指定项目自身排除在外.
$fPartialOK 如果为真, 且项目文本已搜索文本开始,视为匹配
$fWrapOK 如果为真, 且未找到匹配项, 搜索将从第一项继续
返回值
成功: 基于 0 的项目索引失败: -1
备注
搜索大小写不敏感. 搜索仅对项目进行. 如果想搜索子项使用 _GUICtrlListView_FindInText.#AutoIt3Wrapper_au3check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
Opt('MustDeclareVars', 1)
$Debug_LV = False ; 检查传递给函数的类名, 设置为真并使用另一控件句柄观察其工作
_Main()
Func _Main()
Global $iI, $hListView
; 创建界面
GUICreate("ListView Find Text", 400, 300)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 268)
GUISetState()
; 添加列
_GUICtrlListView_AddColumn($hListView, "Items", 100)
; 添加项
_GUICtrlListView_BeginUpdate($hListView)
_GUICtrlListView_AddItem($hListView, "我爱你123" & 1)
_GUICtrlListView_AddItem($hListView, "123我爱你" & 2)
_GUICtrlListView_AddItem($hListView, "你爱我abc" & 3)
For $iI = 4 To 49
_GUICtrlListView_AddItem($hListView, "你爱我" & $iI)
Next
_GUICtrlListView_AddItem($hListView, "Target item")
For $iI = 51 To 100
_GUICtrlListView_AddItem($hListView, "Item " & $iI)
Next
_GUICtrlListView_EndUpdate($hListView)
; 搜索目标项目
$iI = _GUICtrlListView_FindText($hListView, "你爱我", true)
MsgBox(4160, "Information", "Target Item Index: " & $iI)
_GUICtrlListView_EnsureVisible($hListView, $iI)
; 循环至用户退出
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>_Main
;如上代码搜“你爱我”,结果索引为2,事实上我用了false,应该是找不到结果。我换成true后,结果索引还是为2
;真搞不懂了
解决如下:;2014-03-31 修复项目文本包含中文无法完全匹配的BUG by Afan
Func _GUICtrlListView_FindItem($hWnd, $iStart, ByRef $tFindInfo, $sText = '')
Local $aSR = StringRegExp($sText, '[^\x00-\xff]', 3), $iL = UBound($aSR), $i
Local $iBuffer = StringLen($sText) + 1 + $iL
Local $tBuffer = DllStructCreate('char Text[' & $iBuffer & ']')
Local $pBuffer = DllStructGetPtr($tBuffer)
For $i = 0 To $iL - 2
$sText &= ' '
Next
DllStructSetData($tBuffer, 'Text', $sText)
Local $iRet
If IsHWnd($hWnd) Then
If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
DllStructSetData($tFindInfo, 'Text', $pBuffer)
$iRet = _SendMessage($hWnd, $LVM_FINDITEM, $iStart, $tFindInfo, 0, 'wparam', 'struct*')
Else
Local $iFindInfo = DllStructGetSize($tFindInfo)
Local $tMemMap
Local $pMemory = _MemInit($hWnd, $iFindInfo + $iBuffer, $tMemMap)
Local $pText = $pMemory + $iFindInfo
DllStructSetData($tFindInfo, 'Text', $pText)
_MemWrite($tMemMap, $tFindInfo, $pMemory, $iFindInfo)
_MemWrite($tMemMap, $tBuffer, $pText, $iBuffer)
$iRet = _SendMessage($hWnd, $LVM_FINDITEM, $iStart, $pMemory, 0, 'wparam', 'ptr')
_MemFree($tMemMap)
EndIf
Else
DllStructSetData($tFindInfo, 'Text', $pBuffer)
$iRet = GUICtrlSendMsg($hWnd, $LVM_FINDITEM, $iStart, DllStructGetPtr($tFindInfo))
EndIf
Return $iRet
EndFunc ;==>_GUICtrlListView_FindItem
下载文件直接用即可
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入
×
|