如何判断A按钮按下还是B按钮按下的??共享一个CASE语法判断两个按钮!![已解决]
本帖最后由 kk_lee69 于 2015-2-28 14:07 编辑本来这个问题 是要问
再 共享一个 CASE语法判断下如何判断A按钮按下还是B按钮按下的???
程序 语法如下:
$WinSYSsub = GuiCreate('',640,480,-1,-1,-1,-1)
$A1 = GuiCtrlCreateButton('A', 50, 45, 80, 80);
$B1 = GuiCtrlCreateButton('B', 270, 45, 80, 80);
GUISetState()
While 1
Switch guigetmsg()
Case -3
Exit
Case $A1 or $B1
MsgBox(0,"PUSH","PUSH")
EndSwitch
WEnd
再写这个例子的时候 却发现了 另外一个不解的 问题
请看附图
范例中 我并没有按下任何的按钮但是 讯息一直弹出来 这是为何呢??
求高手 解说
问题一:为何 上面那段范例没有按下任何按钮 却会造成 MSGBOX 一直弹出?? 如何避免??
问题二:如上范例 使用 CASE$A1or$B1的方法 如何判断是 A按钮按下 还是 B按钮按下 Case $A1
MsgBox(0,"PUSH","$A1 PUSH")
Case $B1
MsgBox(0,"PUSH","$B1 PUSH") 回复 2# netegg
這個方法我知道
但是 如果我就是不要分成兩個??
一定要用
CASE$A1 OR $B1的方法去判斷呢??
因為
CASE$A1 OR $B1底下 有幾千行的程式A按鈕 與 B按鈕 要出叫出 同一個GUI ,但是我需要判定 是 A呼叫的 還是 B 呼叫的 回复 3# kk_lee69
$WinSYSsub = GuiCreate('',640,480,-1,-1,-1,-1)
$A1 = GuiCtrlCreateButton('A', 50, 45, 80, 80);
$B1 = GuiCtrlCreateButton('B', 270, 45, 80, 80);
GUISetState()
While 1
$msg = guigetmsg()
Switch $msg
Case -3
Exit
Case $A1
push($msg)
Case $B1
push($msg)
EndSwitch
WEnd
Func push($msg)
MsgBox(0,0,$msg)
endfunc 本帖最后由 netegg 于 2015-2-28 00:19 编辑
要是用一个可能也行,case or底下还有加一行guictrlread,不行,只有b按得到,估计换个建立顺序,就是一直a先按倒了 回复 5# netegg
剛剛自己拿範例 上面的方式改了一下 有改到一個 看起來是OK 的 但是 不知道原理有何不同??
為什麼採用這樣的方式就會一切 OK 而且也不會自動彈出
$WinSYSsub = GuiCreate('',640,480,-1,-1,-1,-1)
$A1 = GuiCtrlCreateButton('A', 50, 45, 80, 80);
$B1 = GuiCtrlCreateButton('B', 270, 45, 80, 80);
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = -3
ExitLoop
Case $msg = $A1 or $msg = $B1
If $msg = $A1 Then
MsgBox(0,"","")
EndIf
EndSelect
WEnd
為何使用 SWITCH 語法 有問題 但是用 SELECT就不會有問題?? $WinSYSsub = GuiCreate('',640,480,-1,-1,-1,-1)
$A1 = GuiCtrlCreateButton('A', 50, 45, 80, 80);
$B1 = GuiCtrlCreateButton('B', 270, 45, 80, 80);
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case-3
ExitLoop
Case $A1, $B1
MsgBox(0,"",GUICtrlRead($msg))
EndSwitch
WEnd
蛋神威武~~case or 这个用法,我用也是不行,既然是用or了,那么就不如用蛋蛋说的这种方法
case $a1, $b1 这个是正解~ 回复 6# kk_lee69
If no cases match the Switch value, then the Case Else section, if present, is executed. If no cases match and Case Else is not defined, then none of the code inside the Switch structure will be executed.
使用switch 最好加一个case else ,因为无匹配会执行case所有代码 select 即使多个满足条件 也是执行第一个 回复 7# netegg
原來 可以這樣用呀了解了 感謝!!
另外 再提供一個 想到的解法
$Check=0
$WinSYSsub = GuiCreate('',640,480,-1,-1,-1,-1)
$A1 = GuiCtrlCreateButton('A', 50, 45, 80, 80);
$B1 = GuiCtrlCreateButton('B', 270, 45, 80, 80);
GUISetState()
While 1
Switch GUIGetMsg()
Case-3
ExitLoop
Case$A1
IF $Check=1 Then
MsgBox(0,"","B")
Else
MsgBox(0,"","A")
EndIf
$Check=0
CASE$B1
$Check=1
ControlClick("","",$A1)
EndSwitch
WEnd
感謝各位的幫忙!! 本帖最后由 netegg 于 2015-2-28 15:52 编辑
回复 9# ap112
错,case是顺序执行的,即使没有匹配项也会从头到尾执行一遍,只是在第一个符合条件的时候执行完退出switch/select,加了case else等于画蛇添足,除非在所有前面的case都不符合时候有具体别的操作,否则switch/select是自动结束的
其实更明确点说,switch和select是两个东西,一个是判断语句,一个是条件语句 回复 12# netegg
蛋大,这个帮助文档里面的
If no cases match the Switch value, then the Case Else section, if present, is executed. If no cases match and Case Else is not defined, then none of the code inside the Switch structure will be executed.
什么意思呀? 如果没有匹配switch的值,且提供case else选项时执行其下的,如果没有case匹配且未定义case else那么不执行switch结构中的任何代码 $A1 or $B1这个表达式会返回TRUE,改成$A1, $B1试试(把or改为逗号)。
页:
[1]
2