Автор Тема: [Элементы GUI] _GUICtrlSwitchState - переключение состояния GUICtrl в обратное.  (Прочитано 9496 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Pelerin [?]

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

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

~~~Возможности UDF~~~
  • Переключение GUI в противоположное текущему состояние.
    (нажмите для показа/скрытия)
  • Установление начального состояния GUI в зависимости от значения переменной. Надо просто поменять местами $true и $false.
    (нажмите для показа/скрытия)
  • Переключение состояния GUI1 в зависимости от текущего состояния GUI2
    (нажмите для показа/скрытия)
  • Изменение значения переменной на противоположное (без использования GUI).
    (нажмите для показа/скрытия)

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

~~~Собственно сама UDF~~~
(нажмите для показа/скрытия)

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

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

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

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

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

(нажмите для показа/скрытия)

Спасибо всем кто помог довести эту функцию до ума
« Последнее редактирование: Август 22, 2011, 12:51:26 от Pelerin »

Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Хорошо бы еще небольшой пример добавить.


Думай, прежде чем говорить.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied  [?]
Цитировать
Хорошо бы еще небольшой пример добавить.
Ну да, а то я не понял как оно работает, идея кажется в целом неплохая.

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


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн Pelerin [?]

  • Осваивающий
  • **
  • Сообщений: 81

  • Автор темы
  • Репутация: 23
  • Пол: Мужской
    • Мой личный сайт для размещения закачек.
    • Награды
Yashied
Хорошо бы еще небольшой пример добавить.
Добавил пример. В принципе, это рабочий кусок из моей ToDo-prog, немного его подфиксил...

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


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я бы еще назвал функцию не GUISwitcher(), а GUICtrlSwitch().

:)

Русское сообщество AutoIt


Оффлайн Pelerin [?]

  • Осваивающий
  • **
  • Сообщений: 81

  • Автор темы
  • Репутация: 23
  • Пол: Мужской
    • Мой личный сайт для размещения закачек.
    • Награды
Да, так будет лучше. Переименую..
« Последнее редактирование: Март 07, 2011, 16:06:46 от Pelerin »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
А я вот присмотрелся к самой функции...

Код: AutoIt [Выделить]
$param=1 Or $param=$GUI_CHECKED Or $param=$GUI_ENABLE Or $param=True Or $param=$GUI_SHOW Or $param=$GUI_FOCUS


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

Оффлайн Pelerin [?]

  • Осваивающий
  • **
  • Сообщений: 81

  • Автор темы
  • Репутация: 23
  • Пол: Мужской
    • Мой личный сайт для размещения закачек.
    • Награды
А я вот присмотрелся к самой функции...

Код: AutoIt [Выделить]
$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... Тогда кусок кода
Код: AutoIt [Выделить]
Switch $answer
   Case 6
      $param = 1
   case 7
      $param = 0
EndSwitch

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

(см. Пример)
Так можно добавлять чего хочешь, в зависимости от всего кода.
« Последнее редактирование: Март 05, 2011, 02:10:50 от Pelerin »

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied  [?]
Цитировать
Вас ничего здесь не смущает?
да. в итоге $param = True всегда, ибо после конвертации туда сюда, не будет различия между всеми этими флагами. в данном случае, это не страшно. для краткости, можно заменить на просто If $param, но если в дальнейшем, будет сравнение в других ветках условного дерева, то конечно где-то выскочит ошибка
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
А что именно должно смущать?

Поясню:

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

Оффлайн Pelerin [?]

  • Осваивающий
  • **
  • Сообщений: 81

  • Автор темы
  • Репутация: 23
  • Пол: Мужской
    • Мой личный сайт для размещения закачек.
    • Награды
Yashied, Kaster,
Эврика!! Теперь я понял!! :laugh: Спасибо!

Обновил код:
  • Добавил проверку на "булевость"
  • При не правильном значении $param, возвращается -1
« Последнее редактирование: Март 07, 2011, 16:12:03 от Pelerin »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Pelerin  [?]
Цитировать
Обновил код
Я бы функцию так построил:

Код: AutoIt [Выделить]
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 [?]

  • Осваивающий
  • **
  • Сообщений: 81

  • Автор темы
  • Репутация: 23
  • Пол: Мужской
    • Мой личный сайт для размещения закачек.
    • Награды
CreatoR,
Код: AutoIt [Выделить]
$vParam = Number($vParam)

- это красиво  :-[ Уже исправил.

Код: AutoIt [Выделить]
If $iCtrlID Then
        GUICtrlSetState($iCtrlID, $vParam)
EndIf
 

- а здесь будет оказия если $iCtrlID = string... Я бы все-таки оставил  $iCtrlID>0.

OffTopic:Ничего что я переменные называю без префикса, т.е. не $vParam а $param? Знаю что принято с префиксом, но мне как-то удобно так. Интересно ваше мнение.
« Последнее редактирование: Март 07, 2011, 17:23:08 от Pelerin »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Pelerin  [?]
Цитировать
здесь будет оказия если $iCtrlID = string
А почему CtrlID должен быть строковым значением, тогда уже лучше проверять в начале, так правильнее:

Код: AutoIt [Выделить]
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 [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Yashied  [?]
Цитировать
Я бы еще назвал функцию не GUISwitcher(), а GUICtrlSwitch().
А ещё правильнее, было бы назвать её так:
Код: AutoIt [Выделить]
_GUICtrlSwitchState()


Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
25 Ответов
12096 Просмотров
Последний ответ Март 13, 2011, 23:50:48
от k790
12 Ответов
6500 Просмотров
Последний ответ Апрель 19, 2011, 00:34:28
от CreatoR
5 Ответов
6042 Просмотров
Последний ответ Ноябрь 16, 2011, 12:21:45
от panda_911
4 Ответов
3131 Просмотров
Последний ответ Февраль 03, 2012, 13:35:44
от Gealut
6 Ответов
3372 Просмотров
Последний ответ Декабрь 18, 2012, 07:01:00
от vasykas
2 Ответов
2053 Просмотров
Последний ответ Декабрь 22, 2013, 08:59:09
от madmasles
9 Ответов
3700 Просмотров
Последний ответ Февраль 10, 2014, 19:51:13
от AZJIO
4 Ответов
1819 Просмотров
Последний ответ Июль 29, 2014, 18:18:56
от sasha-ld
0 Ответов
726 Просмотров
Последний ответ Июль 29, 2014, 13:23:27
от madmasles
1 Ответов
362 Просмотров
Последний ответ Июль 06, 2018, 07:25:40
от Tuxzer92