cashiba 发表于 2017-4-19 12:42:40

如何顺序逐步检测输入无误后才进行下一步[已解决]

本帖最后由 cashiba 于 2017-4-19 21:56 编辑

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
Global $str,$str1,$str2
GUICreate("GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1)
Local $idinput1 = GUICtrlCreateInput("", 10, 5, 300, 20)
Local $idinput2 = GUICtrlCreateInput("", 10, 35, 300, 20)
Local $idBtn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
      ExitLoop
        Case $idBtn
                ;第一步
                ifGUICtrlRead($idinput1)=0 orGUICtrlRead($idinput1)="" Then
                        msgbox("","","input1值不能为空")
                Else
                        $str1=GUICtrlRead($idinput1)
                EndIf
                ;第二步
                ifGUICtrlRead($idinput2)=0 orGUICtrlRead($idinput2)=""Then
                        msgbox("","","input2值不能为空")
                Else
                        $str2=GUICtrlRead($idinput2)
                EndIf
      ;第三步
                $str= $str1&"||"&$str2
      MsgBox($MB_SYSTEMMODAL, "输入值",$str)
EndSwitch
WEnd
如上代码及界面。
有若干个输入框,这里以两个为例,程序运行过程中有三步操作。
问题或现象:输入框不填(或填写不符要求)的话,会出现最后的错误结果或程序错误。也就是说即使有错误也会继续下一步。
欲实现效果:如何写代码做到每一步无错误才会往下进行,或者有错误就暂停于原界面等待再次输入?
-----------------------------------------------------------------------------------------------------
下面这种写法,好像又欠缺点什么,输入框输入后无法自动触发错误检测(需要GUIRegisterMsg?)#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
Global $str,$str1,$str2
GUICreate("GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1)
Local $idinput1 = GUICtrlCreateInput("", 10, 5, 300, 20)
Local $idinput2 = GUICtrlCreateInput("", 10, 35, 300, 20)
Local $idBtn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
                ExitLoop
   Case $idinput1
                ifGUICtrlRead($idinput1)=0 orGUICtrlRead($idinput1)=""Then
                        msgbox("","","input1值不能为空")
                Else
                        $str1=GUICtrlRead($idinput1)
                EndIf
   Case $idinput2
                ifGUICtrlRead($idinput2)=0 orGUICtrlRead($idinput2)=""Then
                        msgbox("","","input2值不能为空")
                Else
                        $str2=GUICtrlRead($idinput2)
                EndIf
   Case $idBtn
                $str= $str1&"||"&$str2
      MsgBox($MB_SYSTEMMODAL, "输入值",$str)
EndSwitch
WEnd

chzj589 发表于 2017-4-19 12:55:37

回复 1# cashiba
没有全局变量
Global $str1, $str2

xzf680 发表于 2017-4-19 14:26:05

看看是不是这样呢?#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

GUICreate("GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1)
Local $idinput1 = GUICtrlCreateInput("", 10, 5, 300, 20)
Local $idinput2 = GUICtrlCreateInput("", 10, 35, 300, 20)
Local $idBtn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
                ExitLoop
        Case $idBtn
                ifGUICtrlRead($idinput1)= "" Then
                                        msgbox("","","input1值不能为空")
                ElseIfGUICtrlRead($idinput2)= "" Then
                                        msgbox("","","input2值不能为空")
                Else
                        $str1=GUICtrlRead($idinput1)
                        $str2=GUICtrlRead($idinput2)
                        $str= $str1&"||"&$str2            
                MsgBox($MB_SYSTEMMODAL, "输入值",$str)
                EndIf
EndSwitch
WEnd

229989799 发表于 2017-4-19 15:27:49

空就直接用""表示,if判断是不是""。就知道是不是空了

cashiba 发表于 2017-4-19 16:51:59

回复cashiba
没有全局变量
Global $str1, $str2
chzj589 发表于 2017-4-19 12:55 http://www.autoitx.com/images/common/back.gif
加上变量声明也没什么改变阿.....;第一步
If GUICtrlRead($idinput1) = 0 Then
   MsgBox("", "", "input1值不能为空")
Else
   $str1 = GUICtrlRead($idinput1)
EndIf
;第二步
If GUICtrlRead($idinput2) = 0 Then
   MsgBox("", "", "input2值不能为空")
   ExitLoop
Else
   $str2 = GUICtrlRead($idinput2)
EndIf
;第三步
$str = $str1 & "||" & $str2
MsgBox($MB_SYSTEMMODAL, "输入值", $str)这段怎么写才会有错误就暂停等待呢,用exitloop一下就退出脚本了,return也不能用,goto也不能用.....
while里再套若干个do....until代替goto吗?
记得有的程序语言有halt之类的。

cashiba 发表于 2017-4-19 17:01:43

看看是不是这样呢?
xzf680 发表于 2017-4-19 14:26 http://www.autoitx.com/images/common/back.gif
问题不在于判断输入是不是空值或不符合要求,而是有错误了如何停止等待纠正,而不是一下就运行到脚本结束......

kk_lee69 发表于 2017-4-19 17:15:17

回复 6# cashiba

你原本的範例 腳本 根本不會自己結束呀

這樣有啥問題

cashiba 发表于 2017-4-19 17:44:18

回复cashiba
你原本的範例 腳本 根本不會自己結束呀
這樣有啥問題
kk_lee69 发表于 2017-4-19 17:15 http://www.autoitx.com/images/common/back.gif
第一个例子什么都不填,点确定后界面就没了
第二个例子不点关闭按钮,界面是一直在,但是有错会返回最终的错误结果
我的目的是,有错误就不往下运行了,更不会退出界面
在错误后加sleep延时倒是可以,但是等于是限时了,不好。

kk_lee69 发表于 2017-4-19 17:52:47

回复 8# cashiba

第一個例子 為何要 加入 ExitLoop

不加入不就不會退出了嗎???

kk_lee69 发表于 2017-4-19 17:57:12

回复 1# cashiba

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
Global $str,$str1,$str2
GUICreate("GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1)
Local $idinput1 = GUICtrlCreateInput("", 10, 5, 300, 20)
Local $idinput2 = GUICtrlCreateInput("", 10, 35, 300, 20)
Local $idBtn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
                ExitLoop
   Case $idinput1
                ifGUICtrlRead($idinput1)=0 orGUICtrlRead($idinput1)=""Then
                        msgbox("","","input1值不能?空")
                Else
                        $str1=GUICtrlRead($idinput1)
                EndIf
   Case $idinput2
                ifGUICtrlRead($idinput2)=0 orGUICtrlRead($idinput2)=""Then
                        msgbox("","","input2值不能?空")
                Else
                        $str2=GUICtrlRead($idinput2)
                EndIf
   Case $idBtn
                        IF $str1="" or $str2="" Then
                          MsgBox($MB_SYSTEMMODAL, "有錯誤喔 請重新輸入","有錯誤喔 請重新輸入")
                        Else
                        $str= $str1&"||"&$str2
                        MsgBox($MB_SYSTEMMODAL, "?入值",$str)
                        EndIf
EndSwitch
WEnd

cashiba 发表于 2017-4-19 18:04:42

回复cashiba
kk_lee69 发表于 2017-4-19 17:57 http://www.autoitx.com/images/common/back.gif
这样写呢,还是达不到即时检错的效果,还要点确定后才报告错误。
而且Case $idinput1
                ifGUICtrlRead($idinput1)=0 orGUICtrlRead($idinput1)=""Then
                        msgbox("","","input1值不能?空")
                Else
                        $str1=GUICtrlRead($idinput1)
                EndIf
   Case $idinput2
                ifGUICtrlRead($idinput2)=0 orGUICtrlRead($idinput2)=""Then
                        msgbox("","","input2值不能?空")
                Else
                        $str2=GUICtrlRead($idinput2)
                EndIf这两个分支几乎没什么用。
另外,如果有若干个输入框的话,重复的case和if判断语句会很长.....

cashiba 发表于 2017-4-19 18:08:10

本帖最后由 cashiba 于 2017-4-19 18:12 编辑

回复cashiba
第一個例子 為何要 加入 ExitLoop
不加入不就不會退出了嗎???
kk_lee69 发表于 2017-4-19 17:52 http://www.autoitx.com/images/common/back.gif
忘了删,是加ExitLoop看看效果的....
原来第一个莫名其妙的退出是忘了删这个,感谢认真看+提醒....
{:face (361):}

chzj589 发表于 2017-4-19 18:23:52

回复 12# cashiba
要判断输入框是不是空值,还是要判断输入框输入的数据是否正确?
不理解你的用途?

判断输入框空值:

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
                        ;Case $idinput1
                        ;ifGUICtrlRead($idinput1)=0 Then
                        ;msgbox("","","input1值不能为空")
                        ;Else
                        ;$str1=GUICtrlRead($idinput1)
                        ; EndIf
                        ; Case $idinput2
                        ; ifGUICtrlRead($idinput2)=0 Then
                        ;msgbox("","","input2值不能为空")
                        ;Else
                        ;$str2=GUICtrlRead($idinput2)
                        ; EndIf
                Case $idBtn
                        If GUICtrlRead($idinput1) <> '' And GUICtrlRead($idinput2) <> '' Then
                                $str1 = GUICtrlRead($idinput1)
                                $str2 = GUICtrlRead($idinput2)
                                $str = $str1 & "||" & $str2
                                MsgBox($MB_SYSTEMMODAL, "输入值", $str)
                        Else
                                MsgBox("", "", '请检查输入是否完整')
                        EndIf
        EndSwitch
WEnd

xzf680 发表于 2017-4-19 19:00:56

本帖最后由 xzf680 于 2017-4-19 19:02 编辑

还是没明白你的想法,试试这个:#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

$Main = GUICreate("GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1)
Local $idinput1 = GUICtrlCreateInput("", 10, 5, 300, 20)
Local $idinput2 = GUICtrlCreateInput("", 10, 35, 300, 20)
Local $idBtn = GUICtrlCreateButton("确定", 40, 75, 60, 20)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE
                ExitLoop
   Case $idBtn
                ifGUICtrlRead($idinput1)= "" Then
                                        msgbox("","","input1值不能为空")
                ElseIfGUICtrlRead($idinput2)= "" Then
                                        msgbox("","","input2值不能为空")
                Else
                        $str1=GUICtrlRead($idinput1)
                        $str2=GUICtrlRead($idinput2)
                        $str= $str1&"||"&$str2            
                        MsgBox($MB_SYSTEMMODAL, "输入值",$str)
                EndIf
    Case $GUI_EVENT_PRIMARYDOWN
                        $Pos = GUIGetCursorInfo($Main)
                        If $Pos = $idinput1 Then
                                If GUICtrlRead($idinput2) = "" Then
                                        msgbox("","","input2值不能为空")
                                EndIf
                        ElseIf $Pos = $idinput2 Then
                                If GUICtrlRead($idinput1) = "" Then
                                        msgbox("","","input1值不能为空")
                                EndIf
                        EndIf
EndSwitch
WEnd

kk_lee69 发表于 2017-4-19 19:54:31

这样写呢,还是达不到即时检错的效果,还要点确定后才报告错误。
而且这两个分支几乎没什么用。
另外, ...
cashiba 发表于 2017-4-19 18:04 http://www.autoitx.com/images/common/back.gif

你有邏輯上的問題......
你說【还是达不到即时检错的效果,还要点确定后才报告错误。】

程式一開始 就是兩個輸入框當我甚麼都不做 當然不會發生任何錯誤提示
當你在第一個輸入框輸入資料的時候 就會觸發 檢查......這是正常邏輯吧?? 這還不即時嗎??

難不成 你的意思是 不輸入 也要每隔幾廟 跳出訊息 說 你還沒輸入嗎??

你說【而且这两个分支几乎没什么用。】

這就怪了 怎麼會沒用?? 這不就是用來檢測第一個 或者 第二個輸入框 是否輸入正確嗎???
页: [1] 2
查看完整版本: 如何顺序逐步检测输入无误后才进行下一步[已解决]