迴圈的問題 while
各位大大你們好我有一個很滿難搞的需求
要如何能讓我的button2能動作
我有想過hotkey 不過如果我開二個程式就會造成有問題了
Dim $szIPADDRESS = @IPAddress1
Dim $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted,$nPORT
Dim $msg, $recv
Dim $Form1, $Input1, $Button1, $Button2, $YY,$progress
Global $percent = 0, $direction = 1 , $iTimerProgress,$inetProgress
dim$str1,$str2,$str3,$str4
dim $r,$r1,$r2,$r3
dim $filelog = @ScriptDir & "\OP.txt"
FileOpen($filelog,1)
$Form1 = GUICreate ("Server ", 200, 90, 150, 115)
$Input1 = GUICtrlCreateInput("9000", 16, 16, 121, 21)
$Button1 = GUICtrlCreateButton("B1", 144, 16, 43, 25, 0)
$Button2 = GUICtrlCreateButton("B2", 144, 40, 43, 25, 0)
GUICtrlSetBkColor($Button1, 0xFF0000) ; Green
GUISetState(@SW_SHOW)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case$GUI_EVENT_CLOSE
Exit
case $Button1
netst()
case $Button2
$YY = 'Y'
EndSwitch
WEnd
Func netst()
GUICtrlSetBkColor($Button1, 0x00FF00) ; Green
GUICtrlSetData($Button1, "執行中")
$YY = 'Y'
TCPShutdown()
$nPORT = GUICtrlRead($Input1)
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
Do
$recv = TCPRecv($ConnectedSocket, 2048)
If @error Then
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
EndIf
If $recv <> "" Then
FileWriteLine($filelog,"GET <<" & _NowTime(5))
FileWriteLine($filelog, $recv)
$strchk = StringRegExp($recv,'NPMsg',1)
if @error = 0then
Strs($recv)
TCPSend($ConnectedSocket, $str3)
FileWriteLine($filelog, "SEND >>" & _NowTime(5))
FileWriteLine($filelog, $str3)
FileWriteLine($filelog,"-------------------------"&@CRLF)
;_DebugOut("SEND >>" & _NowTime(5) & @CRLF & $str3& @CRLF & "-------------------------"&@CRLF)
EndIf
EndIf
Until $YY <> 'Y'
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
If $MainSocket <> -1 Then TCPCloseSocket($MainSocket)
TCPShutdown()
EndFunc ;==>netst
[ 本帖最后由 c9992 于 2009-2-26 07:57 编辑 ] 加以下代码到EndIf和Until $YY <> 'Y'之间
$msg = GUIGetMsg()
If $msg = $Button2 Then $YY = 'Y' 他走到 do Until 出不來了按鈕都失效了
他不是在gui的那個while中 第一个do until是可以去除的.
另外,关于你这代码可以尝试用TCP事件模式的那个UDF;
再有就是函数间的参数传递问题,当Button2被按下时,$YY的值应当要传递到netst() 原帖由 c9992 于 2009-2-25 01:55 发表 http://www.autoitx.com/images/common/back.gif
他走到 do Until 出不來了按鈕都失效了
他不是在gui的那個while中
所有的While 1下面都要有
$msg = GUIGetMsg()
If $msg = $Button2 Then $YY = 'Y'
你的代码不全,不知道怎么帮你改
大概给你一个例子:
$msg = GUIGetMsg()
Select
Case $msg = $Button1
While 1
;
WEnd
Case $msg = $Button2
Case Else
EndSelect
如果按照上面的写法,按下$Button1以后,所有其他按键全部失效,包括退出
这时候,你要在$Button1下面的While 1里,也加上$msg = GUIGetMsg()
也就是:
$msg = GUIGetMsg()
Select
Case $msg = $Button1
While 1
;
$msg = GUIGetMsg()
Select
Case $msg = $Button2
;
Case Else
;
EndSelect
WEnd
Case $msg = $Button2
Case Else
EndSelect
希望你看得懂。如果你嫌这个方法麻烦,可以考虑使用OnEnvent的模式,但那个也有那个的缺陷。主要看你程序是要做什么
#Include <Date.au3>
Dim $szIPADDRESS = @IPAddress1
Dim $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted,$nPORT
Dim $msg, $recv
Dim $Form1, $Input1, $Button1, $Button2, $YY,$progress
Global $percent = 0, $direction = 1 , $iTimerProgress,$inetProgress
dim$str1,$str2,$str3,$str4
dim $r,$r1,$r2,$r3
dim $filelog = @ScriptDir & "\OP.txt"
FileOpen($filelog,1)
$Form1 = GUICreate ("Server ", 200, 90, 150, 115)
$Input1 = GUICtrlCreateInput("9000", 16, 16, 121, 21)
$Button1 = GUICtrlCreateButton("B1", 144, 16, 43, 25, 0)
$Button2 = GUICtrlCreateButton("B2", 144, 40, 43, 25, 0)
GUICtrlSetBkColor($Button1, 0xFF0000) ; Green
GUISetState(@SW_SHOW)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case-3
Exit
case $Button1
netst()
case $Button2
GUICtrlSetData($Button1, "B1")
GUICtrlSetBkColor($Button1, 0xFF0000)
$YY = 'Y'
EndSwitch
WEnd
Func netst()
GUICtrlSetBkColor($Button1, 0x00FF00) ; Green
GUICtrlSetData($Button1, "執行中")
$YY = 'Y'
TCPShutdown()
$nPORT = GUICtrlRead($Input1)
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit
$ConnectedSocket = -1
;Do
$ConnectedSocket = TCPAccept($MainSocket)
;Until $ConnectedSocket <> -1
Do
$msg = GUIGetMsg()
If $msg = $Button2 Then
$YY = 'Y'
GUICtrlSetData($Button1, "B1")
GUICtrlSetBkColor($Button1, 0xFF0000)
ExitLoop
EndIf
If $msg = - 3 Then Exit
$recv = TCPRecv($ConnectedSocket, 2048)
If @error Then
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
;Do
; $ConnectedSocket = TCPAccept($MainSocket)
;Until $ConnectedSocket <> -1
$ConnectedSocket = TCPAccept($MainSocket)
EndIf
If $recv <> "" Then
FileWriteLine($filelog,"GET <<" & _NowTime(5))
FileWriteLine($filelog, $recv)
$strchk = StringRegExp($recv,'NPMsg',1)
if @error = 0then
;Strs($recv)
TCPSend($ConnectedSocket, $str3)
FileWriteLine($filelog, "SEND >>" & _NowTime(5))
FileWriteLine($filelog, $str3)
FileWriteLine($filelog,"-------------------------"&@CRLF)
;_DebugOut("SEND >>" & _NowTime(5) & @CRLF & $str3& @CRLF & "-------------------------"&@CRLF)
EndIf
EndIf
Until $YY <> 'Y'
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
If $MainSocket <> -1 Then TCPCloseSocket($MainSocket)
TCPShutdown()
EndFunc ;==>netst
大概地改了一下,希望是你要的效果,再有问题的话同LS,建议你发上完整代码.
回复 6# ceoguang 的帖子
這位大大用這個方法是按鈕正常了
可是 client 關閉了就會不能產生新的連線
也是有問題 我後來覺的讓他按鈕失效就失效了
我從 TraySetToolTip("Server Port :"& $nPORT)去試別要關閉的程式這樣比較方便
我也有想過使用 coproce不過滿難看懂的 有時間我再試試看
謝謝大家囉 回复 6# ceoguang
超版好,我也遇上一个类似问题:点击Button1后,Button2不起作用(可能是WHILEWEND内的内容不起作用),如果不点Button1的情况下直接点Button1按钮,_Rundism()函数可完整执行,望指教,帮忙改下。
代码如下:#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#include <GuiListView.au3>
#include <GuiListBox.au3>
#include <string.au3>
#include <Constants.au3>
#include <WinAPI.au3>
Global $PageNum = 1, $LevelForm, $Levelgroup, $LevelView, $SelectMoreButton, $SelectNextButton, $SelectCancelButton, $Levelgroup2, $LevelLabel
Global $title = " Win7/8系统安装工具", $WinSize
$varhd = "C:"
#region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("WINDOWS7/8安装工具 制作:NDYZX", 408, 149)
$Label1 = GUICtrlCreateLabel("选择安装文件", 8, 8, 79, 17)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008080)
$Input1 = GUICtrlCreateInput("C:", 88, 8, 249, 21)
$Label2 = GUICtrlCreateLabel("选择映像版本", 8, 40, 79, 17)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008080)
$Combo2 = GUICtrlCreateCombo("1", 88, 40, 313, 25)
$Label3 = GUICtrlCreateLabel("选择安装分区", 8, 72, 79, 17)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008080)
$Combo3 = GUICtrlCreateCombo("C:", 88, 72, 313, 25)
$Label4 = GUICtrlCreateLabel("选择启动分区", 8, 104, 79, 17)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008080)
$Combo4 = GUICtrlCreateCombo($varhd, 88, 104, 81, 25)
$Button1 = GUICtrlCreateButton("浏览", 344, 8, 60, 21)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008000)
$Button2 = GUICtrlCreateButton("开始安装", 328, 104, 75, 21)
GUICtrlSetFont(-1, 9, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0x008000)
$Label5 = GUICtrlCreateLabel("注意:点击安装后,会格式化安装分区,请保存好资料。", 24, 128, 376, 20)
GUICtrlSetFont(-1, 10, 400, 0, "微软雅黑")
GUICtrlSetColor(-1, 0xFF0000)
$ProButton2 = GUICtrlCreateEdit("", 1, 100, 407, 49)
GUICtrlSetFont(-1, 8, 500, 0, "微软雅黑")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetState($ProButton2, $gui_hide)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
;-----------------------以下为选择引导区-------------------------------------------
Local $getlist
$var = DriveGetDrive("FIXED")
Global $FileNum
If Not @error Then
For $i = 1 To $var
$varhd = GUICtrlSetData($Combo4, StringUpper($var[$i]))
Next
EndIf
;注,引导区的盘符为$getlist后面 要用到
;-----------------------以下为选择安装分区-------------------------------------------
$HDr = DriveGetDrive("FIXED")
Dim $sizeAll[$HDr + 1]
Dim $sizeFre[$HDr + 1]
Dim $SYS[$HDr + 1]
Dim $xs[$HDr + 1]
For $i = 1 To $HDr
$sizeAll[$i] = Int(DriveSpaceTotal($HDr[$i] & "\"))
$sizeFre[$i] = Int(DriveSpaceFree($HDr[$i] & "\"))
$SYS[$i] = DriveGetFileSystem($HDr[$i] & "\")
Next
$xs2 = ""
For $i = 1 To $HDr
$xs[$i] = StringUpper($HDr[$i]) & "盘,格式:" & $SYS[$i] & ",总空间:" & $sizeAll[$i] & "M,剩余空间:" & $sizeFre[$i] & "M。"
If $i > 1 Then
$xs2 = $xs2 & $xs[$i] & "|"
EndIf
Next
GUICtrlSetState($Combo3, $gui_hide)
$fq3 = GUICtrlCreateCombo($xs, 88, 72, 313, 25)
GUICtrlSetData(-1, $xs2, $xs)
While 1
$nmsg = GUIGetMsg()
Switch $nmsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1 ;本句柄为点击浏览并找到WIM文件后显示WIM里WIM8的版本
Global $Image, $LevelInfo, $LevelDiscrip, $MINOR
GUICtrlSetData($Combo2, "")
$wim = FileOpenDialog("请选择指定Windows安装文件的Wim映像", "", "Windows映像文件(*.wim)|所有文件(*.*)", 1 + 2, "install.wim")
GUICtrlSetData($Input1, $wim)
GUICtrlSetData($Combo2, "")
FileDelete(EnvGet("Temp") & '\wiminfo.txt')
_RunDos('"' & @TempDir & '\imagex.exe"' & ' /info "' & $wim & '" >"' & @TempDir & '\wiminfo.txt"')
$txt = FileRead(EnvGet("Temp") & "\wiminfo.txt")
ClipPut($txt)
Local $txt = ClipGet()
$svar = StringRegExp($txt, '<IMAGE INDEX="(\V|">)', 3)
$var = StringRegExp($txt, '<DISPLAYNAME>(\V+)</DISPLAYNAME>', 3)
If @error Then
MsgBox(4096, "", "错误, 读取列表文件失败.")
Else
For $i = 0 To UBound($var) - 1
For $i = 0 To UBound($svar) - 1
GUICtrlSetData($Combo2, $svar[$i] & "." & $var[$i])
Next
Next
_GUICtrlComboBox_SetEditText($Combo2, '正在获取信息,稍后从下拉列表中选择。')
ClipPut ( "" )
EndIf
Case $Button2;
GUICtrlSetState($Label1, $GUI_HIDE)
GUICtrlSetState($Input1, $GUI_HIDE)
GUICtrlSetState($Button1, $GUI_HIDE)
GUICtrlSetState($Label2, $GUI_HIDE)
GUICtrlSetState($Combo2, $GUI_HIDE)
GUICtrlSetState($Label3, $GUI_HIDE)
GUICtrlSetState($Combo3, $GUI_HIDE)
GUICtrlSetState($Label4, $GUI_HIDE)
GUICtrlSetState($Button2, $GUI_HIDE)
GUICtrlSetState($Label3, $GUI_HIDE)
GUICtrlSetState($Combo4, $GUI_HIDE)
$getlist = GUICtrlRead($Combo4);为引导盘变量
$q = GUICtrlRead($fq3) ;本名为读取框中文本这里作为安装按钮的示例,正式出来要换掉
$W = StringLeft($q, 2) ;为安装分区变量。截取 文本前两位为安装位置
$x = GUICtrlRead($Input1) ;为WIM文件路径
$y = GUICtrlRead($Combo2)
Local $T = StringRegExpReplace(StringRegExpReplace($y, '^(.{1,3}).*', '$1'), '\D', '');为wim文件映像编号,正则提取字符串的前三位数字。
_Rundism()
Sleep(3000)
ExitLoop
EndSwitch
WEnd
Run(@ComSpec & " /c " & 'pecmd shut r', "", @SW_HIDE)
Func _Rundism()
$Label1 = GUICtrlCreateLabel("正在安装", 8, 8, 79, 17)
$ProButton2 = GUICtrlCreateEdit("", 1, 22, 407, 149,BitOR(0x00200000,0x0800))
GUISetState(@SW_SHOW)
GUICtrlSetData($ProButton2,"安装进程...",' ')
;$foo = Run("@TempDir & '\imagex.exe' & ' /apply ' & $x & ' ' & $T & ' ' & $W & '\'", @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
$foo = Run('qll.bat',"", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
While 1
$linea = StdoutRead($foo)
If @error Then ExitLoop
Dim $ProgressA,$ProgressB,$ImageXProgress
If StringStripWS($linea,8)<>"" Then
GUICtrlSetData($ProButton2,@CRLF&$linea,' ')
If StringInStr(StringStripCR($linea),"Applying progress") Then
$ProgressA=StringSplit(StringStripCR($linea),"]")
$ProgressB=StringSplit($ProgressA,"[")
$ImageXProgress=StringStripCR(StringStripWS($ProgressB,8))
EndIf
EndIf
WEnd
EndFunc ;==>_Rundism
Func _RunDos($sCommand)
Return RunWait(@ComSpec & " /C """ & $sCommand & """", "", @SW_HIDE)
EndFunc ;==>_RunDos 回复 8# ndyzx
帮助里查找GUIOnEventMode 回复 9# ceoguang
帮助里内容少,笨不好理解,针对上例能不能具体提点,先谢了。
页:
[1]