找回密码
 加入
搜索
查看: 1664|回复: 9

[AU3基础] Combo 文本读取异常,寻求原因【已解决】

  [复制链接]
发表于 2017-7-25 15:40:26 | 显示全部楼层 |阅读模式
本帖最后由 fenhanxue 于 2017-7-25 22:53 编辑

先上代码:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#include <GuiComboBoxEx.au3>

$Form1 = GUICreate("Form1", 623, 449)
$Combo1 = GUICtrlCreateCombo("", 88, 72, 329, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))

$bt = GUICtrlCreateButton('',0,300,100,100)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")


While 1
        $nMsg = GUIGetMsg()

        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                                        Case $bt
                                                MsgBox(0,'',GUICtrlRead($Combo1))
        EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam);文本变化
        
        Local $temp_list[5] = [4,'7.4*35.5*600','8.4*35.5*600','22','33']
        
        Local $hWndFrom, $iIDFrom, $iCode, $hWndCombo
        $hWndFrom = $ilParam
        $iIDFrom = BitAND($iwParam, 0xFFFF) 
        $iCode = BitShift($iwParam, 16) 
        
        ;判断是否是 $Combo1 消息
        If $hWndFrom <> GUICtrlGetHandle($Combo1) Then   Return $GUI_RUNDEFMSG
        If $iCode <> $CBN_EDITCHANGE Then Return $GUI_RUNDEFMSG;$CBN_EDITCHANGE        代表 $Combo1 文字发生改变
                

                $temp_hwnd = $Combo1
                Local $last = GUICtrlRead($temp_hwnd)
                                

                                
                                        Do
                                        Until _GUICtrlComboBox_DeleteString($temp_hwnd, 0) = -1

                                        
                                        If $last = '' Then 
                                                For $i = 1 To $temp_list[0]
                                                        _GUICtrlComboBox_AddString($temp_hwnd, $temp_list[$i])
                                                Next
                                                _GUICtrlComboBox_ShowDropDown($temp_hwnd, False)
                                        Else
                                                Local $if_have_item = 0
                                                For $i = 1 To $temp_list[0]
                                                        Local $temp_data = ''
                                                        If StringInStr($temp_list[$i], $last) <> 0 Then 
                                                                _GUICtrlComboBox_AddString($temp_hwnd,$temp_list[$i])
                                                                $if_have_item = 1
                                                        EndIf
                                                Next
                                                
                                                
                                                If $if_have_item = 1 Then
                                                        Sleep(1)
                                                        _GUICtrlComboBox_ShowDropDown($temp_hwnd, True)
                                                        _GUICtrlComboBox_SetEditText($temp_hwnd,$last)
                                                Else
                                                        If _GUICtrlComboBox_GetDroppedState($temp_hwnd) Then _GUICtrlComboBox_ShowDropDown($temp_hwnd, False)
                                                EndIf
                                        EndIf        

        Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_COMMAND
异常表现如下图:


1.启动程序后,鼠标点击combo输入框
2.键盘输入4*
3.鼠标点一下任何灰色的GUI界面(目的是让combo取消下拉)
4.点一下按钮。此时 GUICtrlRead($Combo) 得到的结果不是   4*  ,而是下拉框里的第一行文本,何解?

5:另,根据多次测试,发现,键盘一次只输入一个字符的话,GUICtrlRead($Combo)  得到的结果是正确的。一次性输入多个字符,则得到的结果就不正确。
如,一次性只输入4,那么 GUICtrlRead($Combo)  的结果也会是4
一次性输入  35 GUICtrlRead($Combo)  的结果便不是35,而是Combo 下拉后的第一行文本

本帖子中包含更多资源

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

×
发表于 2017-7-25 15:48:29 | 显示全部楼层
回复 1# fenhanxue

輸入5 有東西   輸入55空白.....
发表于 2017-7-25 15:55:25 | 显示全部楼层
GUICtrlRead 换 _GUICtrlComboBox_GetEditText
 楼主| 发表于 2017-7-25 16:27:33 | 显示全部楼层
回复 2# kk_lee69

注册了一个消息,见:Func WM_COMMAND

大意是combo,内置了一个列表:
7.4*35.5*600
8.4*35.5*600
22
33

输入字符后,自动监控combo,判断里面是否包含有列表的文字,有包含,则删选后选出,不包含则不选。
例如,输入5,则 7.4*35.5*600  和 8.4*35.5*600 都包含5,所以显示这2个。
输入55,则这4个列表都不包含55,所以不显示
 楼主| 发表于 2017-7-25 16:29:06 | 显示全部楼层
回复 3# tubaba


    替换后的确可以,为什么
GUICtrlRead 会异常?
发表于 2017-7-25 16:47:58 | 显示全部楼层
回复 5# fenhanxue

注释掉46和47行试试
发表于 2017-7-25 16:49:20 | 显示全部楼层
不叫异常,说明combo是个组合控件,_GUICtrlComboBox_GetEditText获取的仅是edit的值.GUICtrlRead获取的是整个控件对外告知的值.
发表于 2017-7-25 18:10:22 | 显示全部楼层
回复 5# fenhanxue


    GUICtrlRead 获取的是列表中选中项目的值,而不是你输入的,显示在combo中的内容,如果没选择,默认是第一个。所以输出了列表的第一个
   而
  _GUICtrlComboBox_GetEditText是获取组合控件编辑框的文本
 楼主| 发表于 2017-7-25 22:52:24 | 显示全部楼层
回复 8# yamakawa


    也不尽然,例如,你直接输入4  ,再GUICtrlRead,结果会显示是4的
 楼主| 发表于 2017-7-25 22:53:02 | 显示全部楼层
回复 7# tubaba


    受教啦,这个解释很通俗易懂,感谢指点
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-19 18:05 , Processed in 0.080291 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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