Что нового

[Элементы GUI] _GUICtrlSwitchState - переключение состояния GUICtrl в обратное.

Pelerin

Осваивающий
Сообщения
81
Репутация
23
AutoIt: 3
Категория: Вспомогательные функции, Окна и диалоги, Элементы GUI, Разное
Автор: Pelerin (c)

Описание UDF: Небольшая функция для переключения состояния элементов GUI между парами противоположных значений ($GUI_CHECKED/$GUI_UNCHECKED; 1/0; True/False и т.д. ). Очень часто, при построении GUI, возникает закономерная необходимость переключать состояние его элементов или, хотя бы, просто в начале скрипта поставить то значение, которое соответствует переменной считанной из ini-файла и т.д. Однако бывает лень писать обработку этих действий для каждого GUICTRL да и код становится не совсем читаемым. Поэтому я и придумал эту функцию.

~~~Возможности UDF~~~
[list type=decimal]
[*]Переключение GUI в противоположное текущему состояние.
Код:
$param = _GUICtrlSwitchState($ctrlid, $GUI_ENABLE, $GUI_ENABLE, $GUI_DISABLE)
[*]Установление начального состояния GUI в зависимости от значения переменной. Надо просто поменять местами $true и $false.
Код:
$param = _GUICtrlSwitchState($ctrlid, $GUI_ENABLE, $GUI_DISABLE, $GUI_ENABLE)
[*]Переключение состояния GUI1 в зависимости от текущего состояния GUI2
Код:
$param = _GUICtrlSwitchState($ctrlid_1, GuiCtrlGetState($ctrlid_2), $GUI_ENABLE, $GUI_DISABLE)
[*]Изменение значения переменной на противоположное (без использования GUI).
Код:
$param = _GUICtrlSwitchState("", True, True, False)
[/list]

Пары противоположных значений: 1/0; True/False; $GUI_CHECKED/$GUI_UNCHECKED; $GUI_ENABLE/$GUI_DISABLE; $GUI_SHOW/$GUI_HIDE; $GUI_FOCUS/$GUI_NOFOCUS, а также строковые значения "True"/"False";"+"/"-". Вы можете добавлять новые пары значений дописав их в функцию (см. код функции).

~~~Собственно сама UDF~~~
Код:
Func _GUICtrlSwitchState($ctrlid, $param, $true, $false)
	If IsBool($param) Then $param=Number($param)
    If not StringIsDigit($param) Then
        Switch $param
            Case "True", "+" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $false
            Case "False", "-" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    Else
        Switch $param
            Case 1,  $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $false
            Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE , $GUI_NOFOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    EndIf
    If $ctrlid > 0 Then GUICtrlSetState ($ctrlid, $param)
    Return $param
EndFunc

~~~Описание параметров~~~
Все параметры обязательны
$ctrlid - внутренний id элемента GUI, который требуется переключить. Возвращается функцией GuiCtrlCreate(). Если требуется только изменить значение переменной то $ctrlid=""

$param - значение переменной, которая задает состояние GUI. Должно соответствовать одному из значений списка пары противоположных значений

$true/$false - пара состояний между которой надо переключиться (см. пары противоположных значений). В принципе может быть равно любой другой паре значений. Значения этих аргументов жестко не детерминированы.

Возвращаемое значение - новое значение $param, которое равно одному из параметров $true/$false или, в случае не правильного $param, - -1

~~~Пример~~~
Рабочий скрипт с комментариями. Для проверки можно запустить на тест.

Код:
#include <GUIConstants.au3>
$answer = MsgBox (4, @ScriptName, "Активировать тестовый CheckBox при старте скрипта?")
Switch $answer
    Case 6
        $param = '+'
    case 7
        $param = False
EndSwitch

$gui = GUICreate (@ScriptName, 270, 130)
Dim $gui_ctrl[8]
$gui_ctrl[0]= GUICtrlCreateCheckbox ('Если CheckBox активен, то активна "Group"', 10, 10, 330, 25)
$gui_ctrl[1]= GUICtrlCreateGroup ("Group: ", 10, 35, 250, 50)
$gui_ctrl[2]= GUICtrlCreateLabel ("L1", 20, 55, 50, 20, 0x01)
$gui_ctrl[3]= GUICtrlCreateInput ("0", 80, 50, 50, 25)
$gui_ctrl[4]= GUICtrlCreateUpdown ($gui_ctrl[3])
$gui_ctrl[5] = GUICtrlCreateLabel ("L2:", 130, 55, 50, 20, 0x01)
$gui_ctrl[6]= GUICtrlCreateInput ("0", 190, 50, 50, 25)
$gui_ctrl[7]= GUICtrlCreateUpdown ($gui_ctrl[6])
$gui_accept = GUICtrlCreateButton ("Close", 10, 95, 250, 30)

GUICtrlSetLimit ($gui_ctrl[4], 59, 0)
GUICtrlSetLimit ($gui_ctrl[7], 59, 0)

_GUICtrlSwitchState($gui_ctrl[0], $param, $GUI_UNCHECKED, $GUI_CHECKED) ; переключение CheckBox'а в состояние выбраное при старте
For $i = 1 to 7 ; переключение "Group" в состояние в зависимости от состояния CheckBox'а
    _GUICtrlSwitchState($gui_ctrl[$i], $param, $GUI_DISABLE, $GUI_ENABLE)
Next

GUISetState (@SW_SHOW, $gui)
Do
    $msg = GUIGetMsg ($gui)
    If $msg = $gui_ctrl[0] Then
        $param = _GUICtrlSwitchState('', $param, 1, 0) ; просто меняем значение $param с 1 на 0 или с 0 на 1 (CheckBox переключится сам)
        For $i = 1 to 7
            _GUICtrlSwitchState($gui_ctrl[$i], $param, $GUI_DISABLE, $GUI_ENABLE) ; переключение "Group" в состояние в зависимости от состояния CheckBox'а
        Next
    EndIf
Until $msg = $gui_accept or $msg = $gui_event_close

; --------------------
Func _GUICtrlSwitchState($ctrlid, $param, $true, $false)
	If IsBool($param) Then $param=Number($param)
    If not StringIsDigit($param) Then
        Switch $param
            Case "True", "+" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $false
            Case "False", "-" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    Else
        Switch $param
            Case 1,  $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $false
            Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE , $GUI_NOFOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    EndIf
    If $ctrlid > 0 Then GUICtrlSetState ($ctrlid, $param)
    Return $param
EndFunc

Спасибо всем кто помог довести эту функцию до ума
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Хорошо бы еще небольшой пример добавить.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Yashied [?]
Хорошо бы еще небольшой пример добавить.
Ну да, а то я не понял как оно работает, идея кажется в целом неплохая.

Но на UDF оно не тянет, скорее в полезняшки...
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Yashied
Yashied сказал(а):
Хорошо бы еще небольшой пример добавить.
Добавил пример. В принципе, это рабочий кусок из моей ToDo-prog, немного его подфиксил...

CreatoR, можно и в полезняшки. Но я думал там готовые проги должны лежать... А кто должен перенести я или модератор?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Я бы еще назвал функцию не GUISwitcher(), а GUICtrlSwitch().

:smile:
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Да, так будет лучше. Переименую..
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

А я вот присмотрелся к самой функции...

Код:
$param=1 Or $param=$GUI_CHECKED Or $param=$GUI_ENABLE Or $param=True Or $param=$GUI_SHOW Or $param=$GUI_FOCUS


Вас ничего здесь не смущает?
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Yashied сказал(а):
А я вот присмотрелся к самой функции...

Код:
$param=1 Or $param=$GUI_CHECKED Or $param=$GUI_ENABLE Or $param=True Or $param=$GUI_SHOW Or $param=$GUI_FOCUS


Вас ничего здесь не смущает?
А что именно должно смущать? Так и задумано было...
Этот ряд можно продолжить например $GUI_AVISTART и $GUI_AVISTOP для второго Case... или поставить 6 и 7... Тогда кусок кода
Код:
Switch $answer
   Case 6
      $param = 1
   case 7
      $param = 0
EndSwitch

можно заменить на
Код:
$param=GUICtrlSwitch('', $answer, 0, 1)

(см. Пример)
Так можно добавлять чего хочешь, в зависимости от всего кода.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

Yashied [?]
Вас ничего здесь не смущает?
да. в итоге $param = True всегда, ибо после конвертации туда сюда, не будет различия между всеми этими флагами. в данном случае, это не страшно. для краткости, можно заменить на просто If $param, но если в дальнейшем, будет сравнение в других ветках условного дерева, то конечно где-то выскочит ошибка
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] GuiSwitcher - Переключение элементов GUI в противоположное текущему состояние.

Pelerin сказал(а):
А что именно должно смущать?

Поясню:

TRUE = любое ненулевое значение, в том числе и строковое
FALSE = 0 или "" (пустая строка)
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

Yashied, Kaster,
Эврика!! Теперь я понял!! :laugh: Спасибо!

Обновил код:
[list type=decimal]
[*]Добавил проверку на "булевость"
[*]При не правильном значении $param, возвращается -1
[/list]
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

Pelerin [?]
Я бы функцию так построил:

Код:
Func _GUICtrlSwitch($iCtrlID, $vParam, $nTrueState, $nFalseState)
	;Не уверен что проверка вообще нужна, в любом(?) случае это будет числовое значение
	;If IsBool($vParam) Then
		$vParam = Number($vParam)
	;EndIf
	
	Switch $vParam
		Case 1, $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS
			$vParam = $nFalseState
		Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE, $GUI_NOFOCUS
			$vParam = $nTrueState
		Case Else
			Return -1
	EndSwitch
	
	If $iCtrlID Then
		GUICtrlSetState($iCtrlID, $vParam)
	EndIf
	
	Return $vParam
EndFunc
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

CreatoR,
Код:
$vParam = Number($vParam)
- это красиво :-[ Уже исправил.

Код:
If $iCtrlID Then
        GUICtrlSetState($iCtrlID, $vParam)
EndIf
- а здесь будет оказия если $iCtrlID = string... Я бы все-таки оставил $iCtrlID>0.

OffTopic::
Ничего что я переменные называю без префикса, т.е. не $vParam а $param? Знаю что принято с префиксом, но мне как-то удобно так. Интересно ваше мнение.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

Pelerin [?]
здесь будет оказия если $iCtrlID = string
А почему CtrlID должен быть строковым значением, тогда уже лучше проверять в начале, так правильнее:

Код:
Func _GUICtrlSwitch($iCtrlID, $vParam, $nTrueState, $nFalseState)
	If Not GUICtrlGetHandle($iCtrlID) Then
		Return SetError(1, 0, -1)
	EndIf
	
    Switch Number($vParam)
        Case 1, $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS
            $vParam = $nFalseState
        Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE, $GUI_NOFOCUS
            $vParam = $nTrueState
        Case Else
            Return -1
    EndSwitch
    
	GUICtrlSetState($iCtrlID, $vParam)
    Return $vParam
EndFunc


OffTopic:

Ничего что я переменные называю без префикса, т.е. не $vParam а $param? Знаю что принято с префиксом, но мне как-то удобно так. Интересно ваше мнение.
Моё мнение “светится” в моих примерах. Мне больше нравится с префиксами и коррекцией заглавных букв, имхо, так эстетичнее.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] GUICtrlSwitch - Переключение элементов GUI в противоположное текущему состояние.

Yashied [?]
Я бы еще назвал функцию не GUISwitcher(), а GUICtrlSwitch().
А ещё правильнее, было бы назвать её так:
Код:
_GUICtrlSwitchState()
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Re: [Элементы GUI] _GUICtrlSwitchState - переключение состояния GUICtrl в обрат

Обновил код:
[list type=decimal]
[*]Сделал все по-уму.
[*]Добавил поддержку строковых значений для $param. Удобно при считывании из ini-файла.
[/list]
 
Верх