Автор Тема: Запрет выхода или выполнения каких-либо действий во время работы программы  (Прочитано 3550 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Иногда бывает так, что Ваша программа, при нажатии на определенную кнопку в окне, должна произвести какие-либо важные действия, которые выполняются некоторое время (например, ищет файлы, записывает что-нибудь в файл и т.д. В моем примере возводит в куб числа от 1 до 100 с полу-секундной паузой) и эти действия крайне не желательно прерывать. Можно дезактивировать окно или его элементы в начале действий и активировать в конце:
Код: AutoIt [Выделить]
;начало действий
GUISetState(@SW_DISABLE, $hGui)
;или
GUICtrlSetState($nID, $GUI_DISABLE)
;действия
GUISetState(@SW_ENABLE, $hGui)
;или
GUICtrlSetState($nID, $GUI_ENABLE)

Я предлагаю другой способ, основанный на обработке WM-сообщений Вашего окна.
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <MenuConstants.au3>
#include <WinAPI.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $fPause, $fWork, $hGui, $nLabelInfo, $nLabelGo, $nLabelPause, $nLabelExit, $nButtonGo, $nButtonPause, $nButtonExit

If WinExists(@ScriptName & '{[/@[email protected]\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@[email protected]\]}')

$hGui = GUICreate('Test', 400, 115)
$nLabelInfo = GUICtrlCreateLabel('', 100, 12, 200, 15, $SS_CENTER)
$nLabelGo = GUICtrlCreateLabel('', 10, 72, 120, 30, $SS_CENTER)
$nLabelPause = GUICtrlCreateLabel('', 140, 72, 120, 30, $SS_CENTER)
$nLabelExit = GUICtrlCreateLabel('', 270, 72, 120, 30, $SS_CENTER)
For $i = $nLabelInfo To $nLabelExit
    GUICtrlSetBkColor($i, 0xD2D2D2)
Next
$nButtonGo = GUICtrlCreateButton('Вперед', 10, 40, 120, 30)
$nButtonPause = GUICtrlCreateButton('Пауза', 140, 40, 120, 30)
$nButtonExit = GUICtrlCreateButton('Выход', 270, 40, 120, 30)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $nButtonExit
            Exit
        Case $nButtonGo
            $fWork = True
            $fPause = False
            GUICtrlSetData($nLabelGo, 'Работаем')
            GUICtrlSetData($nLabelPause, 'Нет паузы')
            For $i = 1 To 100
                While $fPause
                    Sleep(10)
                WEnd
                GUICtrlSetData($nLabelInfo, StringFormat('%d ^ %d = %d', $i, 3, $i ^ 3))
                Sleep(500)
            Next
            $fWork = False
            For $i = $nLabelGo To $nLabelExit
                GUICtrlSetData($i, '')
            Next
    EndSwitch
WEnd

Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $n_ID = BitAND($iwParam, 0xFFFF)

    Switch $hWnd
        Case $hGui
            Switch $n_ID
                Case $SC_CLOSE
                    If $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelExit, 'Нельзя выходить во время работы')
                        Return 1
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $n_ID = BitAND($iwParam, 0xFFFF)

    Switch $hWnd
        Case $hGui
            Switch $n_ID
                Case $nButtonGo
                    If $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelGo, 'Не надо меня тыкать, я уже работаю')
                        Return 1
                    EndIf
                Case $nButtonPause
                    If Not $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelPause, 'И где я должен сделать паузу7')
                        Return 1
                    EndIf
                    $fPause = Not $fPause
                    If $fPause Then
                        GUICtrlSetData($nButtonPause, 'Продолжить')
                        GUICtrlSetData($nLabelPause, 'Пауза в работе, перекур')
                    Else
                        GUICtrlSetData($nButtonPause, 'Пауза')
                        GUICtrlSetData($nLabelPause, 'Нет паузы, перекур окончен')
                    EndIf
                Case $nButtonExit
                    If $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelExit, 'Нельзя выходить во время работы')
                        Return 1
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
madmasles
а в чем преимущество?
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Kaster  [?]
Цитировать
а в чем преимущество?
А про преимущество я ничего не говорил, но в моем примере в паузе. :)

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
madmasles  [?]
Цитировать
А про преимущество я ничего не говорил
я имел в виду, раз есть два варианта реализации одного и того же, но один короче и понятнее другого, то для использования последнего нужно неоспоримое преимущество, помимо спортивного интереса :)
Цитировать
в моем примере в паузе.
честно говоря, я не понял как пауза может быть преимуществом  ;D

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Это можно сделать через GUIOnEventMode:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $fPause, $fWork, $hGui, $nLabelInfo, $nLabelGo, $nLabelPause, $nLabelExit, $nButtonGo, $nButtonPause, $nButtonExit

If WinExists(@ScriptName & '{[/@[email protected]\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@[email protected]\]}')

$hGui = GUICreate('Test', 400, 115)

$nLabelInfo = GUICtrlCreateLabel('', 100, 12, 200, 15, $SS_CENTER)
$nLabelGo = GUICtrlCreateLabel('', 10, 72, 120, 30, $SS_CENTER)
$nLabelPause = GUICtrlCreateLabel('', 140, 72, 120, 30, $SS_CENTER)
$nLabelExit = GUICtrlCreateLabel('', 270, 72, 120, 30, $SS_CENTER)

For $i = $nLabelInfo To $nLabelExit
    GUICtrlSetBkColor($i, 0xD2D2D2)
Next

$nButtonGo = GUICtrlCreateButton('Вперед', 10, 40, 120, 30)
$nButtonPause = GUICtrlCreateButton('Пауза', 140, 40, 120, 30)
$nButtonExit = GUICtrlCreateButton('Выход', 270, 40, 120, 30)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $nButtonExit
            Exit
        Case $nButtonGo
            $fWork = True
            $fPause = False
           
            Opt('GUIOnEventMode', 1)
           
            GUISetOnEvent($GUI_EVENT_CLOSE, "_Events")
           
            For $ID = $nLabelInfo To $nButtonExit
                GUICtrlSetOnEvent($ID, "_Events")
            Next
           
            GUICtrlSetData($nLabelGo, 'Работаем')
            GUICtrlSetData($nLabelPause, 'Нет паузы')
           
            For $i = 1 To 100
                While $fPause
                    Sleep(10)
                WEnd
               
                GUICtrlSetData($nLabelInfo, StringFormat('%d ^ %d = %d', $i, 3, $i ^ 3))
                Sleep(500)
            Next
           
            $fWork = False
           
            For $i = $nLabelGo To $nLabelExit
                GUICtrlSetData($i, '')
            Next
           
            Opt('GUIOnEventMode', 0)
    EndSwitch
WEnd

Func _Events()
    Local $n_ID = @GUI_CtrlId
    Local $hWnd = @GUI_WinHandle
   
    Switch $hWnd
        Case $hGui
            Switch $n_ID
                Case $nButtonGo
                    If $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelGo, 'Не надо меня тыкать, я уже работаю')
                        Return 1
                    EndIf
                Case $nButtonPause
                    If Not $fWork Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelPause, 'И где я должен сделать паузу7')
                        Return 1
                    EndIf
                   
                    $fPause = Not $fPause
                   
                    If $fPause Then
                        GUICtrlSetData($nButtonPause, 'Продолжить')
                        GUICtrlSetData($nLabelPause, 'Пауза в работе, перекур')
                    Else
                        GUICtrlSetData($nButtonPause, 'Пауза')
                        GUICtrlSetData($nLabelPause, 'Нет паузы, перекур окончен')
                    EndIf
                Case $GUI_EVENT_CLOSE, $nButtonExit
                    If Not $fPause Then
                        _WinAPI_MessageBeep(2)
                        GUICtrlSetData($nLabelExit, 'Нельзя выходить во время работы')
                        Return 1
                    Else
                        Exit
                    EndIf
            EndSwitch
    EndSwitch
EndFunc



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR  [?]
Цитировать
Это можно сделать через GUIOnEventMode
Я знаю, но..., не нравится мне GUIOnEventMode:)

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2268 Просмотров
Последний ответ Август 10, 2012, 13:19:15
от CreatoR
8 Ответов
5428 Просмотров
Последний ответ Декабрь 15, 2014, 17:04:16
от madmasles
2 Ответов
2111 Просмотров
Последний ответ Июнь 12, 2013, 22:58:17
от Vovsla
3 Ответов
1645 Просмотров
Последний ответ Июль 31, 2015, 15:07:36
от alex33
30 Ответов
2920 Просмотров
Последний ответ Март 19, 2017, 22:53:16
от Alofa
3 Ответов
949 Просмотров
Последний ответ Апрель 19, 2017, 11:55:14
от Maximill
4 Ответов
694 Просмотров
Последний ответ Октябрь 03, 2017, 15:21:23
от Rouzenrot
13 Ответов
776 Просмотров
Последний ответ Март 12, 2018, 03:20:26
от БлагоѨръ
5 Ответов
1241 Просмотров
Последний ответ Март 13, 2018, 14:20:53
от kyi
2 Ответов
115 Просмотров
Последний ответ Октябрь 11, 2018, 14:44:41
от Werwolfik