Что нового

[Элементы GUI] Сделать кнопку доступной и недоступной с помощью элемента CheckBox

Hmayak

Новичок
Сообщения
24
Репутация
0
Код скрипта:
Код:
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

;------- Окно скрипта -----------------------------------------
GUICreate("Мое окно", 276, 230) ;Главная форма программы

$CTRL_btnОК = GUICtrlCreateButton("ОК", 10, 160, 70, 30) ;
$CTRL_btnCancel = GUICtrlCreateButton("Закрыть", 90, 160, 70, 30) ;
GUICtrlSetState($CTRL_btnCancel, $GUI_DISABLE) ;Делаем кнопку изначально недоступной

$CTRL_cbCheckBox = GUICtrlCreateCheckbox("Разрешить закрытие", 10,130) ;
;-----------------------------------
GUISetState()

Local $msg
Do
  $msg = GUIGetMsg()
  Switch $msg
	 case $CTRL_cbCheckBox ;
		 If GUICtrlGetState($CTRL_btnCancel) = $GUI_ENABLE Then
		    GUICtrlSetState($CTRL_btnCancel, $GUI_DISABLE)
		 Else
		    GUICtrlSetState($CTRL_btnCancel, $GUI_ENABLE)
		 EndIf
   EndSwitch

Until $msg = $GUI_EVENT_CLOSE

Кнопка становится доступной и её не получается сделать недоступной.
Менял код цикла на
Код:
If GUICtrlGetState($CTRL_cbCheckBox) = $GUI_CHECKED Then
	  GUICtrlSetState($CTRL_btnCancel, $GUI_ENABLE)
Else
	  GUICtrlSetState($CTRL_btnCancel, $GUI_DISABLE)
EndIf

Обновляется с такой скоростью, что не получается понять доступна ли кнопка или нет :-\
Подскажите опытные люди
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Код:
Local $msg
Do
	$msg = GUIGetMsg()
	Switch $msg
		Case $CTRL_cbCheckBox ;
			$getstate = GUICtrlRead($CTRL_cbCheckBox)
			Switch $getstate
				Case 4
					GUICtrlSetState($CTRL_btnCancel, $GUI_DISABLE)
				Case 1
					GUICtrlSetState($CTRL_btnCancel, $GUI_ENABLE)
			EndSwitch
	EndSwitch

Until $msg = $GUI_EVENT_CLOSE
 
Автор
H

Hmayak

Новичок
Сообщения
24
Репутация
0
joiner сказал(а):
Код:
Local $msg
Do
	$msg = GUIGetMsg()
	Switch $msg
		Case $CTRL_cbCheckBox ;
			$getstate = GUICtrlRead($CTRL_cbCheckBox)
			Switch $getstate
				Case 4
					GUICtrlSetState($CTRL_btnCancel, $GUI_DISABLE)
				Case 1
					GUICtrlSetState($CTRL_btnCancel, $GUI_ENABLE)
			EndSwitch
	EndSwitch

Until $msg = $GUI_EVENT_CLOSE
Объясните пожалуйста, в чем разница?
И как убрать это постоянное моргание?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Hmayak,
Код:
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>

Global $aState[2] = [$GUI_DISABLE, $GUI_ENABLE]

GUICreate('Мое окно', 276, 230)

$id_btnOK = GUICtrlCreateButton('ОК', 10, 160, 70, 30)
$id_btnCancel = GUICtrlCreateButton('Закрыть', 90, 160, 70, 30)
$id_CheckBox = GUICtrlCreateCheckbox('Разрешить закрытие', 10, 130)
GUICtrlSetState($id_btnCancel, $aState[GUICtrlSendMsg($id_CheckBox, $BM_GETCHECK, 0, 0)])
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $id_btnCancel
			Exit
		Case $id_CheckBox
			GUICtrlSetState($id_btnCancel, $aState[GUICtrlSendMsg($id_CheckBox, $BM_GETCHECK, 0, 0)])
	EndSwitch
WEnd
 
Автор
H

Hmayak

Новичок
Сообщения
24
Репутация
0
joiner сказал(а):
Hmayak [?]
И как убрать это постоянное моргание?
какое моргание. у меня ничего не "моргает" :smile:
Всё исправил, всё работает.
Но объясните в чем разница?
Почему я не могу проверить состояние флажка с помощью условного оператора?
madmasles, тоже спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
ничего не могу сказать. я когда то столкнулся с этим же и не стал морочить себе голову. оказалось что при опросе состояния кнопки получаем
1.недоступна - 144
2.доступна - 80
в справке
$GUI_ENABLE (64)
$GUI_DISABLE (128)
а значит для определения состояния кнопок это не подходит
к тому же, в данном коде управляющим элементом является $CTRL_cbCheckBox а не кнопка. поэтому правильно будет отталкиваться от его состояния.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
joiner [?]
при опросе состояния кнопки получаем
Код:
ConsoleWrite(BitAND(144, $GUI_DISABLE) & @LF);недоступна
ConsoleWrite(BitAND(80, $GUI_ENABLE) & @LF);доступна



Добавлено:
Сообщение автоматически объединено:


joiner [?]
а значит для определения состояния кнопок это не подходит
Почему?
Код:
#include <GUIConstantsEx.au3>

GUICreate('Мое окно', 276, 230)

$id_btnOK = GUICtrlCreateButton('ОК', 10, 160, 70, 30)
$id_btnCancel = GUICtrlCreateButton('Закрыть', 90, 160, 70, 30)
GUICtrlSetState(-1, $GUI_DISABLE)
$id_CheckBox = GUICtrlCreateCheckbox('Разрешить закрытие', 10, 130)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $id_btnCancel
			Exit
		Case $id_CheckBox
			If BitAND(GUICtrlGetState($id_btnCancel), $GUI_ENABLE) Then
				GUICtrlSetState($id_btnCancel, $GUI_DISABLE)
			Else
				GUICtrlSetState($id_btnCancel, $GUI_ENABLE)
			EndIf
	EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
OffTopic:
madmasles
я ценю ваше желание поспорить(ибо сам любитель), но тема уже решена. вы могли бы сразу это указать в вашем первом примере, а не затевать "почемучки" :smile:
в коде лучше всего отталкиваться от главного и явного - в данном случае это чекбокс. кнопка же второстепенна. по поводу BitAnd мне тоже пришла эта мысль в голову после сообщения. но уточнять не стал ибо (опять по кругу) - кнопка второстепенна
 
Верх