Показать полную графическую версию : [решено] Блокировка кнопок после нажатия в 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
Я не стал вписывать в примере код других кнопок (т. к. они все такие как эта), но кнопок вообще много :)
можно на это время отключить кнопки так:
#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
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 и сравню :)
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
Всё закончил :) Вариант со составлением списка по-моему самый практичный и простой :)
ZeroCrash,
для частого использования одного и того же кода, можно использовать следущее(будет полезно для всех):
global $run = какое_то_действие and какое_то_действие and какое_то_действие;прописываем команды через оператор and
execute ($run);в нужном месте исполняем код....будет полезно при частом вызове кода в любом месте программы...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.