Войти

Показать полную графическую версию : [решено] Блокировка кнопок после нажатия в GUI


ZeroCrash
01-07-2009, 13:39
Что нужно сделать чтобы после нажатия кнопки не было возможности нажать на другие кнопкки в течении 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
можно на это время отключить кнопки так:
#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
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
beve, разобрал твой пример....многовато кода получается если добавлять эти функции к каждой кнопке. Может просто я неясно выразился или просто по-другому никак, но мне нужно чтобы при нажатии любой кнопки блокировались все кнопки на 3с. Сейчас разберу скрипт proxy и сравню :)

proxy
01-07-2009, 22:17
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
пооооооооооооооооооо любому, придется прописывать ВСЕ кнопки, которые необходимо заблокировать. »
поработав и с твоим кодом я это понял :(
Да, думаю, не плохо сначала проверять состояние кнопки, Enable или Disable, что бы лишний раз не "моргать" кнопкой »
Думаю в этом смысла нет. Тут у меня либо ВСЕ кнопки включены, либо ВСЕ выключены.

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

Либо состовлять списки указателей на кнопки, кторые необходимо заблокировать »
Самый наилучший вариант! Сенкс! :up

ZeroCrash
01-07-2009, 23:00
Всё закончил :) Вариант со составлением списка по-моему самый практичный и простой :)

tweakos
13-07-2009, 08:24
ZeroCrash,
для частого использования одного и того же кода, можно использовать следущее(будет полезно для всех):

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

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




© OSzone.net 2001-2012