eaglelin 发表于 2012-1-3 10:06:11

OnEvent模式在子程序里面的表现[已解决]

本帖最后由 eaglelin 于 2012-1-3 13:34 编辑

我昨天试了一下OnEvent模式
不是以前没用过这个模式。而是我在主程序里面用了宏@GuiCtrlID是成功的,但是在子程序里面的GUI用@GuiCtrlID出现了控件没有反应的情况。我反复调试,没有结果。所以来问问#include <GuiConstants.au3>

GUICreate("MyGUI", 372, 88, -1, -1)

$Progress_1 = GUICtrlCreateProgress(10, 10, 370, 20)
$Button_2 = GUICtrlCreateButton("start", 10, 40, 60, 30)
$Button_3 = GUICtrlCreateButton("pause", 80, 40, 60, 30)
$Button_4 = GUICtrlCreateButton("exit", 150, 40, 70, 30)

Opt("GUIOnEventMode", 1)

Dim $start = 0, $ostart

GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "gui")
GUICtrlSetOnEvent($Button_2, "gui")
GUICtrlSetOnEvent($Button_3, "gui")
GUICtrlSetOnEvent($Button_4, "gui")

While 1
    If $start >= 0 Then
      Sleep(50)
      $start += 1
      If $start > 100 Then $start = 0
      If $start >= 0 Then
            $ostart = $start
            GUICtrlSetData($Progress_1, $start)
      Else
            ContinueLoop
      EndIf
    EndIf
WEnd

Exit

Func gui()
    Switch @GUI_CtrlId
      Case $GUI_EVENT_CLOSE, $Button_4
            Exit
      Case $Button_2
            subfunc()
      Case $Button_3
            If $start = -100 Then
                $start = $ostart
            Else
                $start = -100
            EndIf
    EndSwitch
EndFunc   ;==>gui

Funcsubfunc()

GUICreate("SubGUI", 372, 88, -1, -1)
$Button_2 = GUICtrlCreateButton("start1", 10, 40, 60, 30)
$Button_4 = GUICtrlCreateButton("exit", 150, 40, 70, 30)
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "subgui")
GUICtrlSetOnEvent($Button_2, "subgui")
GUICtrlSetOnEvent($Button_4, "subgui")
While 1
WEnd
Sleep(100)
EndFunc

Func subgui()
    Switch @GUI_CtrlId
      Case $GUI_EVENT_CLOSE, $Button_4
            Exit
      Case $Button_2
            MsgBox(1,"","Sub OK")
    EndSwitch
EndFunc   ;==>gui

eaglelin 发表于 2012-1-3 11:40:45

贴上了源码

xiehuahere 发表于 2012-1-3 12:01:07

本帖最后由 xiehuahere 于 2012-1-3 12:44 编辑

回复 1# eaglelin


    subfunc里面,

1)控件ID建议跟主GUI的区分开来,并且要声明为全局变量,否则subgui函数中识别不到这些控件ID。

2)GUISetState() 应该在所有GUICtrlSetOnEvent动作都做完之后。
   即,要先为各个控件注册事件响应函数,然后再show出GUI来。

3)那个 Sleep(100) 应该是在 While 1循环里面吧?这个While循环不需要,因为主GUI已经有一个主循环了,依靠这个即可。

还有,你再看看吧。

xiehuahere 发表于 2012-1-3 12:05:34

另外,你有没有发现,点击Pause暂停后,要再点击Pause按钮两次才能恢复进度显示。

建议 gui 函数中,Case $Button_3
            If $start = -100 Then
                $start = $ostart
            Else
                $start = -100
            EndIf改一下判断条件:Case $Button_3
            If $start < 0 Then
                $start = $ostart
            Else
                $start = -100
            EndIf参见:
http://www.autoitx.com/forum.php?mod=viewthread&tid=476&page=8&extra=#pid382849

seniors 发表于 2012-1-3 12:07:48

楼上的说法,我没弄过,不知道
但是为什么非要GUICtrlSetOnEvent到一个函数呢
一个按钮一个函数不是更简单清楚吗?

xiehuahere 发表于 2012-1-3 12:12:50

回复 5# seniors


    看一下 OnEvent模式进阶教程:
http://www.autoitx.com/forum.php?mod=viewthread&tid=476&extra=&page=1

估计是参考了这个。

asionwu 发表于 2012-1-3 12:23:39

subfunc里面的
While 1
WEnd
去掉

xiehuahere 发表于 2012-1-3 12:42:03

本帖最后由 xiehuahere 于 2012-1-3 12:43 编辑

试试这个吧:#include <GuiConstants.au3>

Global $subGUI, $Button_5, $Button_6
GUICreate("MyGUI", 372, 88, -1, -1)

$Progress_1 = GUICtrlCreateProgress(10, 10, 370, 20)
$Button_2 = GUICtrlCreateButton("start", 10, 40, 60, 30)
$Button_3 = GUICtrlCreateButton("pause", 80, 40, 60, 30)
$Button_4 = GUICtrlCreateButton("exit", 150, 40, 70, 30)

Opt("GUIOnEventMode", 1)

Dim $start = 0, $ostart

GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "gui")
GUICtrlSetOnEvent($Button_2, "gui")
GUICtrlSetOnEvent($Button_3, "gui")
GUICtrlSetOnEvent($Button_4, "gui")

While 1
    If $start >= 0 Then
      Sleep(50)
      $start += 1
      If $start > 100 Then $start = 0
      If $start >= 0 Then
            $ostart = $start
            GUICtrlSetData($Progress_1, $start)
      Else
            ContinueLoop
      EndIf
    EndIf
WEnd

Exit

Func gui()
    Switch @GUI_CtrlId
      Case $GUI_EVENT_CLOSE, $Button_4
            Exit
      Case $Button_2
            subfunc()
      Case $Button_3
            If $start < 0 Then
                $start = $ostart
            Else
                $start = -100
            EndIf
    EndSwitch
EndFunc   ;==>gui

Funcsubfunc()
        $subGUI = GUICreate("SubGUI", 372, 88, -1, -1)
        $Button_5 = GUICtrlCreateButton("start1", 10, 40, 60, 30)
        $Button_6 = GUICtrlCreateButton("exit", 150, 40, 70, 30)
        GUISetOnEvent($GUI_EVENT_CLOSE, "subgui")
        GUICtrlSetOnEvent($Button_5, "subgui")
        GUICtrlSetOnEvent($Button_6, "subgui")
        GUISetState()
EndFunc
Func subgui()
    Switch @GUI_CtrlId
      Case $GUI_EVENT_CLOSE, $Button_6
            GUIDelete($subGUI)
      Case $Button_5
            MsgBox(1,"","Sub OK")
    EndSwitch
EndFunc   ;==>gui

eaglelin 发表于 2012-1-3 13:25:08

本帖最后由 eaglelin 于 2012-1-3 13:35 编辑

哦!就是说控件ID不能重复是吧! 谢谢了 !

eaglelin 发表于 2012-1-3 13:25:31

哦!就是说控件ID不能重复是吧!

ila 发表于 2015-4-28 14:02:40

8楼好事例,谢谢。
我在进阶教程那里没看到子窗口里用按钮退出子窗口的说法。
页: [1]
查看完整版本: OnEvent模式在子程序里面的表现[已解决]