laomeng 发表于 2014-12-13 23:02:05

[已解决]关键字搜索后的字符赋值到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:26:54

本帖最后由 user3000 于 2014-12-13 23:40 编辑

回复 1# laomeng
不好意思,没仔细看.
解决方法就是去掉那个"隐形"字符.Case $list ;得到$list点击消息
                        $sel = _GUICtrlListBox_GetCurSel($list)
                        GUICtrlSetData($Input1,StringTrimRight(_GUICtrlListBox_GetText($list,$sel), 1))

laomeng 发表于 2014-12-13 23:38:11

回复 2# user3000


他这个只支持 首个 汉字

user3000 发表于 2014-12-13 23:58:24

回复 3# laomeng


    2楼的方法不适用多关键字的情况,有时会误删关键字.所以还是这个适用.GUICtrlSetData($Input1,StringRegExpReplace($str, '\v', ''))

laomeng 发表于 2014-12-14 00:09:59

回复 4# user3000


    多谢、!!!!

laomeng 发表于 2014-12-14 00:13:52

回复 4# user3000


    如果 能实现拼音首字母就能搜索 就好了 、、{:face (411):}

user3000 发表于 2014-12-14 00:20:14

回复 6# laomeng

论坛有汉字转拼音的UDF吧. 自己组合一下就有了.

laomeng 发表于 2014-12-14 00:26:11

回复 7# user3000


    是这个吗 http://www.autoitx.com/forum.php?mod=viewthread&tid=5261&highlight=%C6%B4%D2%F4

他说返回为空的问题 需要注释 的那一段 。 在win7下面 注释就返回空。 XP下 不注释就返回空.

user3000 发表于 2014-12-14 00:42:57

回复 8# laomeng

你只需要首字母就够了.所以下面这帖更合适.]
http://www.autoitx.com/forum.php?mod=viewthread&tid=24145&highlight=%CA%D7%D7%D6%C4%B8

laomeng 发表于 2014-12-14 01:07:58

回复 9# user3000


   这个怎么用啊   是不是 要写个中英对照啊


能 在我上面例子 添加吗   请指点谢!!!

user3000 发表于 2014-12-14 01:26:02

回复 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

laomeng 发表于 2014-12-14 11:22:47

回复 11# user3000


          $str = StringRegExpReplace($str, '\|,' ')这句有错误。正则符号我 一点也不懂啊

laomeng 发表于 2014-12-14 11:33:19

回复 11# user3000


    谢谢已经可以搜索了 但是还有两问题 如附件

user3000 发表于 2014-12-14 12:29:27

回复12楼: 本来应该是这样: $str = StringRegExpReplace($str, '\|$',' '),输到代码框里就出错了.

回复 13# laomeng 关键字不是一行一行的吗?我复制到文本后显示是全成一行的.加"回车"换成一行行,测试没问题.
试试这样匹配?
$sre = StringRegExp($sText, '\V+', 3)
        ;If @error Then Return GUICtrlSetState($list, $GUI_HIDE)

laomeng 发表于 2014-12-14 14:50:58

回复 14# user3000


    非常感谢你的指点!!已经OK啦!!
页: [1]
查看完整版本: [已解决]关键字搜索后的字符赋值到iniread函数中无效,谢谢指教!!