找回密码
 加入
搜索
查看: 5669|回复: 14

[AU3基础] [已解决]关键字搜索后的字符赋值到iniread函数中无效,谢谢指教!!

  [复制链接]
发表于 2014-12-13 23:02:05 | 显示全部楼层 |阅读模式
本帖最后由 laomeng 于 2014-12-14 00:10 编辑

找到论坛上一位大侠的帖子,查找关键字的,觉得很好。但是 在如下代码中查找出来的值赋值到iniread中 不能读值。请兄弟们给看下。直接使用input的值是可以的!

  1. #include <WindowsConstants.au3>
  2. #include <Array.au3>
  3. #include <WinAPI.au3>
  4. #include <GuiListBox.au3>

  5. Global $X = -1
  6. $Text = FileRead(@ScriptDir&"\关键词.txt") ;读取所有关键词
  7. $Form1 = GUICreate("输入框搜索", 466, 343, 192, 124)
  8. $Button1 = GUICtrlCreateButton("读取", 272, 256, 75, 25, 0)
  9. $Input1 = GUICtrlCreateInput("", 8, 16, 185, 21)
  10. $list = GUICtrlCreateList("", 8, 16 + 21, 185, 140, 0x1000)
  11. GUICtrlSetState(-1, $GUI_HIDE)
  12. $wProcNew = DllCallbackRegister("_MyInputProc", "ptr", "hwnd;uint;long;ptr")
  13. $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($Input1), -4, DllCallbackGetPtr($wProcNew))
  14. GUISetState(@SW_SHOW)
  15. Local $ini=".\set.ini"

  16. While 1
  17.         $nMsg = GUIGetMsg()
  18.         Switch $nMsg
  19.                 Case $GUI_EVENT_CLOSE
  20.                         GUIDelete($Form1)
  21.                         Exit
  22.                 Case $list ;得到$list点击消息
  23.                         $sel = _GUICtrlListBox_GetCurSel($list)
  24.                         GUICtrlSetData($Input1,_GUICtrlListBox_GetText($list,$sel))
  25.                 Case $Button1
  26.                         $info = GUICtrlRead($Input1)
  27.                         MsgBox(0,"搜索结果",$info)
  28.                         $res = IniRead($ini,$info,"工资","")
  29.                         MsgBox(0,"工资",$res)
  30.         EndSwitch

  31. WEnd

  32. Func _MyInputProc($hWnd, $uiMsg, $wParam, $lParam)
  33.         Switch $uiMsg
  34.                 Case $WM_KEYUP
  35.                         Switch $wParam
  36.                                 Case 0x28 ;$VK_DOWN
  37.                                         $X += 1
  38.                                         _GUICtrlListBox_ClickItem($list, $X)
  39.                                         If $X = 9 Then $X = -1
  40.                                 Case 0x26 ;$VK_UP
  41.                                         $X -= 1
  42.                                         _GUICtrlListBox_ClickItem($list, $X)
  43.                                         If $X = 0 Then $X = 10
  44.                                 Case Else
  45.                                         _GUICtrlListBox_ResetContent($list)
  46.                                         $iText = GUICtrlRead($Input1)
  47.                                         If $iText = "" Then
  48.                                                 GUICtrlSetState($list, $GUI_HIDE)
  49.                                                 Return 1
  50.                                         EndIf
  51.                                         $sre = StringRegExp($Text, $iText & '.*', 3)
  52.                                         If @error Then
  53.                                                 GUICtrlSetState($list, $GUI_HIDE)
  54.                                                 Return 1
  55.                                         EndIf
  56.                                         If UBound($sre) > 10 Then ReDim $sre[10] ;最大显示10个
  57.                                          _GUICtrlListBox_BeginUpdate($list)
  58.                                         GUICtrlSetData($list, _ArrayToString($sre))
  59.                                         _GUICtrlListBox_EndUpdate($list)
  60.                                         GUICtrlSetState($list, $GUI_SHOW)
  61.                         EndSwitch
  62.         EndSwitch
  63.         ;向默认窗口进程传递未处理过的消息
  64.         Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
  65. EndFunc   ;==>_MyInputProc
复制代码
txt中的数据:

  1. 张三
  2. 张关
  3. 李四
  4. 王无
  5. 李逵
复制代码
set.ini中的数据

  1. [张三]
  2. 工资=1000
  3. [李四]
  4. 工资=2000
  5. [王无]
  6. 工资=4000
  7. [李逵]
  8. 工资=8000
复制代码
发表于 2014-12-13 23:26:54 | 显示全部楼层
本帖最后由 user3000 于 2014-12-13 23:40 编辑

回复 1# laomeng
不好意思,没仔细看.
解决方法就是去掉那个"隐形"字符.
  1. Case $list ;得到$list点击消息
  2.                         $sel = _GUICtrlListBox_GetCurSel($list)
  3.                         GUICtrlSetData($Input1,StringTrimRight(_GUICtrlListBox_GetText($list,$sel), 1))
复制代码
 楼主| 发表于 2014-12-13 23:38:11 | 显示全部楼层
回复 2# user3000


  他这个只支持 首个 汉字
发表于 2014-12-13 23:58:24 | 显示全部楼层
回复 3# laomeng


    2楼的方法不适用多关键字的情况,有时会误删关键字.所以还是这个适用.
  1. GUICtrlSetData($Input1,StringRegExpReplace($str, '\v', ''))
复制代码
 楼主| 发表于 2014-12-14 00:09:59 | 显示全部楼层
回复 4# user3000


    多谢、!!!!
 楼主| 发表于 2014-12-14 00:13:52 | 显示全部楼层
回复 4# user3000


    如果 能实现拼音首字母就能搜索 就好了 、、
发表于 2014-12-14 00:20:14 | 显示全部楼层
回复 6# laomeng

论坛有汉字转拼音的UDF吧. 自己组合一下就有了.
 楼主| 发表于 2014-12-14 00:26:11 | 显示全部楼层
回复 7# user3000


    是这个吗 http://www.autoitx.com/forum.php ... hlight=%C6%B4%D2%F4

他说返回为空的问题 需要注释 的那一段 。 在win7下面 注释就返回空。 XP下 不注释就返回空.
发表于 2014-12-14 00:42:57 | 显示全部楼层
回复 8# laomeng

你只需要首字母就够了.所以下面这帖更合适.]
http://www.autoitx.com/forum.php ... =%CA%D7%D7%D6%C4%B8
 楼主| 发表于 2014-12-14 01:07:58 | 显示全部楼层
回复 9# user3000


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


能 在我上面例子 添加吗   请指点  谢!!!
发表于 2014-12-14 01:26:02 | 显示全部楼层
回复 10# laomeng
  1. #include <WindowsConstants.au3>
  2. #include <Array.au3>
  3. #include <WinAPI.au3>
  4. #include <GuiListBox.au3>
  5. Global $ini = ".\set.ini"
  6. Global $X = -1
  7. Global $sText = FileRead(@ScriptDir & "\key.txt") ;读取所有关键词
  8. $Form1 = GUICreate("输入框搜索", 466, 343, 192, 124)
  9. $Button1 = GUICtrlCreateButton("读取", 272, 256, 75, 25, 0)
  10. $Input1 = GUICtrlCreateInput("", 8, 16, 185, 21)
  11. $list = GUICtrlCreateList("", 8, 16 + 21, 185, 140, 0x1000)
  12. GUICtrlSetState(-1, $GUI_HIDE)
  13. $wProcNew = DllCallbackRegister("_MyInputProc", "ptr", "hwnd;uint;long;ptr")
  14. $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($Input1), -4, DllCallbackGetPtr($wProcNew))
  15. GUISetState(@SW_SHOW)
  16. While 1
  17.         $nMsg = GUIGetMsg()
  18.         Switch $nMsg
  19.                 Case $GUI_EVENT_CLOSE
  20.                         GUIDelete($Form1)
  21.                         Exit
  22.                 Case $list ;得到$list点击消息
  23.                         $sel = _GUICtrlListBox_GetCurSel($list)
  24.                         Local $str = _GUICtrlListBox_GetText($list, $sel)
  25.                         ConsoleWrite($str)
  26.                         GUICtrlSetData($Input1, StringRegExpReplace($str, '\v', ''))
  27.                 Case $Button1
  28.                         $info = GUICtrlRead($Input1)
  29.                         ;MsgBox(0, "搜索结果", $info)
  30.                         $res = IniRead($ini, $info, "工资", "")
  31.                         MsgBox(0, $info, $res)
  32.         EndSwitch

  33. WEnd

  34. Func _MyInputProc($hWnd, $uiMsg, $wParam, $lParam)
  35.         Switch $uiMsg
  36.                 Case $WM_KEYUP
  37.                         Switch $wParam
  38.                                 Case 0x28 ;$VK_DOWN
  39.                                         $X += 1
  40.                                         _GUICtrlListBox_ClickItem($list, $X)
  41.                                         If $X = 9 Then $X = -1
  42.                                 Case 0x26 ;$VK_UP
  43.                                         $X -= 1
  44.                                         _GUICtrlListBox_ClickItem($list, $X)
  45.                                         If $X = 0 Then $X = 10
  46.                                 Case Else
  47.                                         _GUICtrlListBox_ResetContent($list)
  48.                                         $sInput= GUICtrlRead($Input1)
  49.                                         If $sInput= "" Then
  50.                                                 GUICtrlSetState($list, $GUI_HIDE)
  51.                                                 Return 1
  52.                                         EndIf
  53.                                         _set_data($sInput)
  54.                                        
  55.                         EndSwitch
  56.         EndSwitch
  57.         ;向默认窗口进程传递未处理过的消息
  58.         Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
  59. EndFunc   ;==>_MyInputProc

  60. Func _set_data($sKey)
  61.         $sre = StringRegExp($sText, '.+', 3)
  62.         If @error Then Return GUICtrlSetState($list, $GUI_HIDE)
  63.         Local $str = '', $C
  64.         For $i = 0 To UBound($sre) - 1
  65.                 $C = StringLeft(StringStripWS($sre[$i], 1 + 2), 1)
  66.                 If _C($C) = $sKey Then $str &= $sre[$i] & '|'
  67.         Next
  68.         $str = StringRegExpReplace($str, '\|, '')
  69.         _GUICtrlListBox_BeginUpdate($list)
  70.         GUICtrlSetData($list, $str)
  71.         _GUICtrlListBox_EndUpdate($list)
  72.         GUICtrlSetState($list, $GUI_SHOW)
  73. EndFunc   ;==>_set_data

  74. Func _C($s, $f = 0, $e = 26) ;改进的中值法 (by 蜘蛛抱蛋)
  75.         If StringRegExp($s, '^[A-Za-Z]) Then Return $s
  76.         Local Const $key[27] = ['吖', '八', '擦', '耷', '俄', '发', '噶', '哈', '丌', '丌', '卡', '拉', '马', '拿', '哦', '趴', '七', '然', '撒', '他', '挖', '挖', '挖', '西', '丫', '匝', '匝']
  77.         Local $mid = Int(($e - $f) / 2) + $f
  78.         If $mid = $f Then Return Chr(97 + $f)
  79.         If StringCompare($s, $key[$mid]) = 0 Then
  80.                 Return Chr(97 + $mid)
  81.         ElseIf StringCompare($s, $key[$mid]) > 0 Then
  82.                 Return _C($s, $mid, $e)
  83.         ElseIf StringCompare($s, $key[$mid]) < 0 Then
  84.                 Return _C($s, $f, $mid)
  85.         EndIf
  86. EndFunc   ;==>_C
复制代码
 楼主| 发表于 2014-12-14 11:22:47 | 显示全部楼层
回复 11# user3000


          $str = StringRegExpReplace($str, '\|,' ')  这句有错误。正则符号我 一点也不懂啊
 楼主| 发表于 2014-12-14 11:33:19 | 显示全部楼层
回复 11# 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)

 楼主| 发表于 2014-12-14 14:50:58 | 显示全部楼层
回复 14# user3000


    非常感谢你的指点!!已经OK啦!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2026-9-20 23:51 , Processed in 0.092427 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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