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

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

ZeroCrash 01-07-2009 13:39 1156357

Блокировка кнопок после нажатия в GUI
 
Что нужно сделать чтобы после нажатия кнопки не было возможности нажать на другие кнопкки в течении 3 секунд? Пробовал ставить sleep(3000), но на кнопки всё равно можно нажимать (правда срабатывают они после того как пройдёт эти 3 секунды).

Код:

#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
$mainwindow = GUICreate("Программа2", 460, 340)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$okbutton = GUICtrlCreateButton("Кнопка", 5, 30, 90)
GUICtrlSetOnEvent($okbutton, "OKButton")
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)

While 1
Sleep(1000)
WEnd

Func OKButton()
If Random() < 0.5 Then
Run(@ComSpec & " /c Start 1.bat")
Sleep(3000)
Else
Run(@ComSpec & " /c Start 2.bat")
Sleep(3000)
Endif
EndFunc

Я не стал вписывать в примере код других кнопок (т. к. они все такие как эта), но кнопок вообще много :)

beve 01-07-2009 16:16 1156486

можно на это время отключить кнопки так:
Код:

#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
$mainwindow = GUICreate("Программа2", 460, 340)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$okbutton =
GUICtrlCreateButton("Ok", 5, 30, 90)
GUICtrlSetOnEvent($okbutton, "OKButton")

$1button =
GUICtrlCreateButton("1", 5, 60, 90)
GUICtrlSetOnEvent($1button, "_1Button")

$2button =
GUICtrlCreateButton("2", 5, 90, 90)
GUICtrlSetOnEvent($2button, "_2Button")

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)

While 1
Sleep
(100)
WEnd

Func
OKButton()
MsgBox(0,"","нажата кнопка OK",1)
ControlDisable($mainwindow,"",$Okbutton)
ControlDisable($mainwindow,"",$1button)
ControlDisable($mainwindow,"",$2button)

Sleep(3000)

ControlEnable($mainwindow,"",$Okbutton)
ControlEnable($mainwindow,"",$1button)
ControlEnable($mainwindow,"",$2button)
EndFunc

Func
_1Button()
MsgBox(0,"","нажата кнопка 1",1)
EndFunc
;
Func _2Button()
MsgBox(0,"","нажата кнопка 2",1)
EndFunc
;
Func CLOSEClicked()
   
Exit
EndFunc


proxy 01-07-2009 19:07 1156636

ZeroCrash, лучше, но не факт, с ипользованием какого-либо таймера, например AdlibEnable:

Код:

#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>

Opt('GUIOnEventMode', 1)

Global $mainwindow, $okbutton

$mainwindow
= GUICreate('Программа2', 460, 340)
    GUISetOnEvent($GUI_EVENT_CLOSE, 'CLOSEClicked')

$okbutton = GUICtrlCreateButton('Кнопка', 5, 30, 90)
    GUICtrlSetOnEvent($okbutton, 'OKButton')

GUISetState()

While 1
    Sleep(100)
WEnd

Func
CLOSEClicked()
    Exit
EndFunc

Func
OKButton()
    If Random() < 0.5 Then
        Run(@ComSpec & ' /c Start 1.bat')
        Sleep(3000)
    Else
        Run(@ComSpec & ' /c Start 2.bat')
        Sleep(3000)
    Endif
    AdlibEnable('_EnableButton', 3000)
    If BitAND(GUICtrlGetState($okbutton), $GUI_ENABLE) Then GUICtrlSetState($okbutton, $GUI_DISABLE)
EndFunc

Func
_EnableButton()
    If BitAND(GUICtrlGetState($okbutton), $GUI_DISABLE) Then GUICtrlSetState($okbutton, $GUI_ENABLE)
    AdlibDisable()
EndFunc

Для более сложных случаев можно использовать:
Код:

#Include <Timers.au3>
_Timer_SetTimer($hWnd[, $iElapse = 250[, $sTimerFunc = ""[, $iTimerID = -1]]])


ZeroCrash 01-07-2009 22:11 1156777

beve, разобрал твой пример....многовато кода получается если добавлять эти функции к каждой кнопке. Может просто я неясно выразился или просто по-другому никак, но мне нужно чтобы при нажатии любой кнопки блокировались все кнопки на 3с. Сейчас разберу скрипт proxy и сравню :)

proxy 01-07-2009 22:17 1156780

Цитата:

Цитата ZeroCrash
beve, разобрал твой пример....многовато кода получается если добавлять эти функции к каждой кнопке. Может просто я неясно выразился или просто по-другому никак, но мне нужно чтобы при нажатии любой кнопки блокировались все кнопки на 3с. Сейчас разберу скрипт proxy и сравню »

пооооооооооооооооооо любому, придется прописывать ВСЕ кнопки, которые необходимо заблокировать.
Либо сразу напрямую:
Код:

ControlDisable($mainwindow,"",$Okbutton)
или
Код:

GUICtrlSetState($okbutton, $GUI_DISABLE)
Либо состовлять списки указателей на кнопки, кторые необходимо заблокировать. Пример:
Код:

#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>

Opt('GUIOnEventMode', 1)

Global $mainwindow, $okbutton1, $okbutton2, $sButtonList

$mainwindow
= GUICreate('Программа2', 460, 340)
    GUISetOnEvent($GUI_EVENT_CLOSE, 'CLOSEClicked')

$okbutton1 = GUICtrlCreateButton('Кнопка', 5, 30, 90)
    GUICtrlSetOnEvent(-1, 'OKButton')
$okbutton2 = GUICtrlCreateButton('Кнопка', 5, 30+30, 90)
    GUICtrlSetOnEvent(-1, 'OKButton')

$sButtonList = $okbutton1 & '|' & $okbutton2
GUISetState()

While 1
    Sleep(100)
WEnd

Func
CLOSEClicked()
    Exit
EndFunc

Func
OKButton()
    If Random() < 0.5 Then
        Run(@ComSpec & ' /c Start 1.bat')
        Sleep(3000)
    Else
        Run(@ComSpec & ' /c Start 2.bat')
        Sleep(3000)
    Endif
    AdlibEnable('_EnableButton', 3000)
    _ButtonSetState(0)
EndFunc

Func
_EnableButton()
    _ButtonSetState(1)
    AdlibDisable()
EndFunc

Func
_ButtonSetState($fState)
    Local $aListButton = StringSplit($sButtonList, '|')
    If @error Then Return
    Local
$fUnState, $i
    If $fState Then
        $fState  = $GUI_ENABLE
        $fUnState
= $GUI_DISABLE
    Else
        $fState  = $GUI_DISABLE
        $fUnState
= $GUI_ENABLE
    EndIf
    For
$i=1 To $aListButton[0]
        If BitAND(GUICtrlGetState($aListButton[$i]), $fUnState) Then GUICtrlSetState($aListButton[$i], $fState)
    Next
EndFunc

Да, думаю, не плохо сначала проверять состояние кнопки, Enable или Disable, что бы лишний раз не "моргать" кнопкой:
Код:

If BitAND(GUICtrlGetState($okbutton), $GUI_ENABLE) Then GUICtrlSetState($okbutton, $GUI_DISABLE)

ZeroCrash 01-07-2009 22:28 1156787

Цитата:

Цитата proxy
пооооооооооооооооооо любому, придется прописывать ВСЕ кнопки, которые необходимо заблокировать. »

поработав и с твоим кодом я это понял :(
Цитата:

Цитата proxy
Да, думаю, не плохо сначала проверять состояние кнопки, Enable или Disable, что бы лишний раз не "моргать" кнопкой »

Думаю в этом смысла нет. Тут у меня либо ВСЕ кнопки включены, либо ВСЕ выключены.

Ладно, буду работать. Как всё сделаю, отпишусь.

Цитата:

Цитата proxy
Либо состовлять списки указателей на кнопки, кторые необходимо заблокировать »

Самый наилучший вариант! Сенкс! :up

ZeroCrash 01-07-2009 23:00 1156808

Всё закончил :) Вариант со составлением списка по-моему самый практичный и простой :)

tweakos 13-07-2009 08:24 1166027

ZeroCrash,
для частого использования одного и того же кода, можно использовать следущее(будет полезно для всех):
Код:

global $run = какое_то_действие and какое_то_действие and какое_то_действие;прописываем команды через оператор and

execute ($run);в нужном месте исполняем код....будет полезно при частом вызове кода в любом месте программы...



Время: 15:33.

Время: 15:33.
© OSzone.net 2001-