[已解决]关键字搜索后的字符赋值到iniread函数中无效,谢谢指教!!
本帖最后由 laomeng 于 2014-12-14 00:10 编辑找到论坛上一位大侠的帖子,查找关键字的,觉得很好。但是 在如下代码中查找出来的值赋值到iniread中 不能读值。请兄弟们给看下。直接使用input的值是可以的!
#include <WindowsConstants.au3>
#include <Array.au3>
#include <WinAPI.au3>
#include <GuiListBox.au3>
Global $X = -1
$Text = FileRead(@ScriptDir&"\关键词.txt") ;读取所有关键词
$Form1 = GUICreate("输入框搜索", 466, 343, 192, 124)
$Button1 = GUICtrlCreateButton("读取", 272, 256, 75, 25, 0)
$Input1 = GUICtrlCreateInput("", 8, 16, 185, 21)
$list = GUICtrlCreateList("", 8, 16 + 21, 185, 140, 0x1000)
GUICtrlSetState(-1, $GUI_HIDE)
$wProcNew = DllCallbackRegister("_MyInputProc", "ptr", "hwnd;uint;long;ptr")
$wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($Input1), -4, DllCallbackGetPtr($wProcNew))
GUISetState(@SW_SHOW)
Local $ini=".\set.ini"
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUIDelete($Form1)
Exit
Case $list ;得到$list点击消息
$sel = _GUICtrlListBox_GetCurSel($list)
GUICtrlSetData($Input1,_GUICtrlListBox_GetText($list,$sel))
Case $Button1
$info = GUICtrlRead($Input1)
MsgBox(0,"搜索结果",$info)
$res = IniRead($ini,$info,"工资","")
MsgBox(0,"工资",$res)
EndSwitch
WEnd
Func _MyInputProc($hWnd, $uiMsg, $wParam, $lParam)
Switch $uiMsg
Case $WM_KEYUP
Switch $wParam
Case 0x28 ;$VK_DOWN
$X += 1
_GUICtrlListBox_ClickItem($list, $X)
If $X = 9 Then $X = -1
Case 0x26 ;$VK_UP
$X -= 1
_GUICtrlListBox_ClickItem($list, $X)
If $X = 0 Then $X = 10
Case Else
_GUICtrlListBox_ResetContent($list)
$iText = GUICtrlRead($Input1)
If $iText = "" Then
GUICtrlSetState($list, $GUI_HIDE)
Return 1
EndIf
$sre = StringRegExp($Text, $iText & '.*', 3)
If @error Then
GUICtrlSetState($list, $GUI_HIDE)
Return 1
EndIf
If UBound($sre) > 10 Then ReDim $sre ;最大显示10个
_GUICtrlListBox_BeginUpdate($list)
GUICtrlSetData($list, _ArrayToString($sre))
_GUICtrlListBox_EndUpdate($list)
GUICtrlSetState($list, $GUI_SHOW)
EndSwitch
EndSwitch
;向默认窗口进程传递未处理过的消息
Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc ;==>_MyInputProc
txt中的数据:
张三
张关
李四
王无
李逵
set.ini中的数据
[张三]
工资=1000
[李四]
工资=2000
[王无]
工资=4000
[李逵]
工资=8000
本帖最后由 user3000 于 2014-12-13 23:40 编辑
回复 1# laomeng
不好意思,没仔细看.
解决方法就是去掉那个"隐形"字符.Case $list ;得到$list点击消息
$sel = _GUICtrlListBox_GetCurSel($list)
GUICtrlSetData($Input1,StringTrimRight(_GUICtrlListBox_GetText($list,$sel), 1)) 回复 2# user3000
他这个只支持 首个 汉字 回复 3# laomeng
2楼的方法不适用多关键字的情况,有时会误删关键字.所以还是这个适用.GUICtrlSetData($Input1,StringRegExpReplace($str, '\v', '')) 回复 4# user3000
多谢、!!!! 回复 4# user3000
如果 能实现拼音首字母就能搜索 就好了 、、{:face (411):} 回复 6# laomeng
论坛有汉字转拼音的UDF吧. 自己组合一下就有了. 回复 7# user3000
是这个吗 http://www.autoitx.com/forum.php?mod=viewthread&tid=5261&highlight=%C6%B4%D2%F4
他说返回为空的问题 需要注释 的那一段 。 在win7下面 注释就返回空。 XP下 不注释就返回空. 回复 8# laomeng
你只需要首字母就够了.所以下面这帖更合适.]
http://www.autoitx.com/forum.php?mod=viewthread&tid=24145&highlight=%CA%D7%D7%D6%C4%B8 回复 9# user3000
这个怎么用啊 是不是 要写个中英对照啊
能 在我上面例子 添加吗 请指点谢!!! 回复 10# laomeng #include <WindowsConstants.au3>
#include <Array.au3>
#include <WinAPI.au3>
#include <GuiListBox.au3>
Global $ini = ".\set.ini"
Global $X = -1
Global $sText = FileRead(@ScriptDir & "\key.txt") ;读取所有关键词
$Form1 = GUICreate("输入框搜索", 466, 343, 192, 124)
$Button1 = GUICtrlCreateButton("读取", 272, 256, 75, 25, 0)
$Input1 = GUICtrlCreateInput("", 8, 16, 185, 21)
$list = GUICtrlCreateList("", 8, 16 + 21, 185, 140, 0x1000)
GUICtrlSetState(-1, $GUI_HIDE)
$wProcNew = DllCallbackRegister("_MyInputProc", "ptr", "hwnd;uint;long;ptr")
$wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($Input1), -4, DllCallbackGetPtr($wProcNew))
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUIDelete($Form1)
Exit
Case $list ;得到$list点击消息
$sel = _GUICtrlListBox_GetCurSel($list)
Local $str = _GUICtrlListBox_GetText($list, $sel)
ConsoleWrite($str)
GUICtrlSetData($Input1, StringRegExpReplace($str, '\v', ''))
Case $Button1
$info = GUICtrlRead($Input1)
;MsgBox(0, "搜索结果", $info)
$res = IniRead($ini, $info, "工资", "")
MsgBox(0, $info, $res)
EndSwitch
WEnd
Func _MyInputProc($hWnd, $uiMsg, $wParam, $lParam)
Switch $uiMsg
Case $WM_KEYUP
Switch $wParam
Case 0x28 ;$VK_DOWN
$X += 1
_GUICtrlListBox_ClickItem($list, $X)
If $X = 9 Then $X = -1
Case 0x26 ;$VK_UP
$X -= 1
_GUICtrlListBox_ClickItem($list, $X)
If $X = 0 Then $X = 10
Case Else
_GUICtrlListBox_ResetContent($list)
$sInput= GUICtrlRead($Input1)
If $sInput= "" Then
GUICtrlSetState($list, $GUI_HIDE)
Return 1
EndIf
_set_data($sInput)
EndSwitch
EndSwitch
;向默认窗口进程传递未处理过的消息
Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc ;==>_MyInputProc
Func _set_data($sKey)
$sre = StringRegExp($sText, '.+', 3)
If @error Then Return GUICtrlSetState($list, $GUI_HIDE)
Local $str = '', $C
For $i = 0 To UBound($sre) - 1
$C = StringLeft(StringStripWS($sre[$i], 1 + 2), 1)
If _C($C) = $sKey Then $str &= $sre[$i] & '|'
Next
$str = StringRegExpReplace($str, '\|, '')
_GUICtrlListBox_BeginUpdate($list)
GUICtrlSetData($list, $str)
_GUICtrlListBox_EndUpdate($list)
GUICtrlSetState($list, $GUI_SHOW)
EndFunc ;==>_set_data
Func _C($s, $f = 0, $e = 26) ;改进的中值法 (by 蜘蛛抱蛋)
If StringRegExp($s, '^) Then Return $s
Local Const $key = ['吖', '八', '擦', '耷', '俄', '发', '噶', '哈', '丌', '丌', '卡', '拉', '马', '拿', '哦', '趴', '七', '然', '撒', '他', '挖', '挖', '挖', '西', '丫', '匝', '匝']
Local $mid = Int(($e - $f) / 2) + $f
If $mid = $f Then Return Chr(97 + $f)
If StringCompare($s, $key[$mid]) = 0 Then
Return Chr(97 + $mid)
ElseIf StringCompare($s, $key[$mid]) > 0 Then
Return _C($s, $mid, $e)
ElseIf StringCompare($s, $key[$mid]) < 0 Then
Return _C($s, $f, $mid)
EndIf
EndFunc ;==>_C
回复 11# user3000
$str = StringRegExpReplace($str, '\|,' ')这句有错误。正则符号我 一点也不懂啊 回复 11# user3000
谢谢已经可以搜索了 但是还有两问题 如附件 回复12楼: 本来应该是这样: $str = StringRegExpReplace($str, '\|$',' '),输到代码框里就出错了.
回复 13# laomeng 关键字不是一行一行的吗?我复制到文本后显示是全成一行的.加"回车"换成一行行,测试没问题.
试试这样匹配?
$sre = StringRegExp($sText, '\V+', 3)
;If @error Then Return GUICtrlSetState($list, $GUI_HIDE)
回复 14# user3000
非常感谢你的指点!!已经OK啦!!
页:
[1]