Combo 文本读取异常,寻求原因【已解决】
本帖最后由 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 =
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
_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
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 下拉后的第一行文本 回复 1# fenhanxue
輸入5 有東西 輸入55空白..... GUICtrlRead 换 _GUICtrlComboBox_GetEditText 回复 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,所以不显示 回复 3# tubaba
替换后的确可以,为什么
GUICtrlRead 会异常? 回复 5# fenhanxue
注释掉46和47行试试 不叫异常,说明combo是个组合控件,_GUICtrlComboBox_GetEditText获取的仅是edit的值.GUICtrlRead获取的是整个控件对外告知的值. 回复 5# fenhanxue
GUICtrlRead 获取的是列表中选中项目的值,而不是你输入的,显示在combo中的内容,如果没选择,默认是第一个。所以输出了列表的第一个
而
_GUICtrlComboBox_GetEditText是获取组合控件编辑框的文本 回复 8# yamakawa
也不尽然,例如,你直接输入4,再GUICtrlRead,结果会显示是4的 回复 7# tubaba
受教啦,这个解释很通俗易懂,感谢指点
页:
[1]