Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Остановить Func нажатием на кнопку... (http://forum.oszone.net/showthread.php?t=173720)

JaguarSP 21-04-2010 16:54 1397811

Остановить Func нажатием на кнопку...
 
Надо остановить Func нажатием на кнопку или даже не только остановить func а вообще закрыть.
Код:

Func _Timer()
    For $Start = $paz To 0 Step -1
                        Select
            Case $Start >= 7
                GUICtrlSetColor($Label1, 0x00FF00)
                GUICtrlSetData($Label1, $Start)
            Case $Start > 3
                GUICtrlSetColor($Label1, 0xFF8000)
                GUICtrlSetData($Label1, $Start)
            Case $Start >= 0
                GUICtrlSetColor($Label1, 0xFF0000)
                GUICtrlSetData($Label1, $Start)
        EndSelect
        Sleep(1000)
    Next
    Return
EndFunc

http://forum.oszone.net/thread-150169.html это не подходит...

alt-andrew 21-04-2010 18:10 1397860

А если задать горячие клавиши?
Код:

HotKeySet("{ESC}", "Terminate")

Func Terminate()
        Exit 0
EndFunc


JaguarSP 21-04-2010 19:02 1397896

так то оно да... а можно сделать чтобы хоткей был переменной что то типа:
Код:

HotKeySet("$cancel", "Terminate")
$cancel = GUICtrlCreateButton("Cancel", 295, 422, 100, 53, 0)


Func Terminate()
        Exit 0
EndFunc


alt-andrew 21-04-2010 20:03 1397936

Насколько я знаю GUICtrlCreateButton создает кнопку для GUI,соответственно у вас есть окно,а почему бы тогда не сделать так:
Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 164, 162, 388, 278)
$Button1 = GUICtrlCreateButton("Button1", 40, 104, 75, 25)
GUISetState(@SW_SHOW)



While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        Exit

        EndSwitch
WEnd


Medic84 21-04-2010 23:13 1398070

Только вся проблема заключается в том, что цикл While..WEnd не обрабатывается во время выполнения определенной функции. Поэтому нужно устанавливать проверку на нажатие кнопки $bitton1 в самой функции...

JaguarSP 21-04-2010 23:42 1398076

Medic84 ага именно так...
Цитата:

Цитата Medic84
устанавливать проверку на нажатие кнопки $bitton1 в самой функции... »

вот именно это и надо... а как это сделать?

Medic84 21-04-2010 23:46 1398077

Ну как. В коде пишешь чуть ли не после каждой строчки
Код:

if $nMsg = $button1 Then Exit

JaguarSP 22-04-2010 00:34 1398090

пробовал во все участки функции вставлять... =((( не помогает, может быть что не так делаю? попробуй сам вставь вот func
Код:

Func _Timer()
    For $Start = $paz To 0 Step -1
                        Select
            Case $Start >= 7
                GUICtrlSetColor($Label1, 0x00FF00)
                GUICtrlSetData($Label1, $Start)
            Case $Start > 3
                GUICtrlSetColor($Label1, 0xFF8000)
                GUICtrlSetData($Label1, $Start)
            Case $Start >= 0
                GUICtrlSetColor($Label1, 0xFF0000)
                GUICtrlSetData($Label1, $Start)
        EndSelect
        Sleep(1000)
    Next
    Return
EndFunc


madmasles 22-04-2010 02:28 1398164

JaguarSP,
А если примерно так:
Код:

#include <GuiConstantsEx.au3>

Global $minuts = 00, $secunds = 10

$hGUI = GUICreate("Test", 200, 100)
$vremya = StringFormat("%02i:%02i", $minuts, $secunds)
$button = GUICtrlCreateButton($vremya, 65, 35, 75, 25)
GUISetState()
AdlibRegister("_TimerCount", 1000)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $button
            AdlibUnRegister()
            GUICtrlSetData($button, "00:00")
            _MyFunc()
    EndSwitch
WEnd

Func _TimerCount()
    $secunds -= 1
    GUICtrlSetData($button, StringFormat("%02i:%02i", $minuts, $secunds))

    If $secunds = 0 Then
        If $minuts >= 1 Then
            $minuts -= 1
            $secunds = 60
        Else
            If $secunds = 0 And $minuts = 0 Then
                AdlibUnRegister()
                _MyFunc()
            EndIf
        EndIf
    EndIf
EndFunc  ;==>_TimerCount

Func _MyFunc()
    MsgBox(0, "_MyFunc", "Кнопка нажата")
EndFunc  ;==>_MyFunc


Creat0R 22-04-2010 13:30 1398430

В таком случае обычно в цикле самой функции опрашивают событие нажатой кнопки, или ещё лучше, изменить режим обработки событии и проверять значение некой глобальной переменной:

Код:

#include <GuiConstantsEx.au3>

Global $iStop = False

$hGUI = GUICreate("Test", 200, 100)
$nStop_Button = GUICtrlCreateButton("Stop _Timer()", 65, 35, 75, 25)

GUISetState()

_Timer()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

Func _Timer()
    $iOld_Opt = Opt("GUIOnEventMode", 1)

    GUICtrlSetOnEvent($nStop_Button, "_Main_Events")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

    $paz = 10

    For $Start = $paz To 0 Step -1
;~      Select
;~            Case $Start >= 7
;~                GUICtrlSetColor($Label1, 0x00FF00)
;~                GUICtrlSetData($Label1, $Start)
;~            Case $Start > 3
;~                GUICtrlSetColor($Label1, 0xFF8000)
;~                GUICtrlSetData($Label1, $Start)
;~            Case $Start >= 0
;~                GUICtrlSetColor($Label1, 0xFF0000)
;~                GUICtrlSetData($Label1, $Start)
;~      EndSelect


        If $iStop Then
            MsgBox(64, 'Title', '_Timer() Stopped.')
            $iStop = False
            ExitLoop
        EndIf

        Sleep(1000)
    Next

    Opt("GUIOnEventMode", $iOld_Opt)

    Return
EndFunc

Func _Main_Events()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStop_Button
            $iStop
= True
    EndSwitch
EndFunc

Ну или сразу использовать этот режим:

Код:

#include <GuiConstantsEx.au3>

Opt("GUIOnEventMode", 1)

Global $iStop = False

$hGUI = GUICreate("Test", 200, 100)
$nStop_Button = GUICtrlCreateButton("Stop _Timer()", 65, 35, 75, 25)

GUICtrlSetOnEvent($nStop_Button, "_Main_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

GUISetState()

_Timer()

While 1
    Sleep(10)
WEnd

Func _Timer()
    $paz = 10

    $iStop = False

    For $Start = $paz To 0 Step -1
        ;......

        If $iStop Then
            MsgBox(64, 'Title', '_Timer() Stopped.')
            $iStop = False
            ExitLoop
        EndIf

        Sleep(1000)
    Next

    Return
EndFunc

Func _Main_Events()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStop_Button
            $iStop
= True
    EndSwitch
EndFunc


Medic84 22-04-2010 13:45 1398445

Цитата:

Цитата Creat0R
Ну или сразу использовать этот режим: »

Да, совсем забыл про это :)
Но в больших программах это неудобно...

JaguarSP 22-04-2010 18:39 1398683

Всем огромное спасибо, все сделал, все робит:-)))) Много нового подчерпнул для себя :-)


Время: 16:38.

Время: 16:38.
© OSzone.net 2001-