Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Вопросы по кнопкам  (Прочитано 6624 раз)

vladka767

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Вопросы по кнопкам
« : 08 Июля 2019, 20:30:57 »
Добрый день.
Есть задача : Одной кнопкой устанавливать переменную только в 1, второй только в 0 (Старт, Стоп).
Но отображать нужно два сотояния и на той и на другой кнопке, т.е. нажал "Старт" и кнопка старт подсветилась, а кнопка "Стоп" погасла и наоборот.
Не нашел простого решения , может подкажете как это сделать без скриптов?

Так же пробовал делать 2 кнопки для переключения ( Старт переключает в 1, Стоп переключает в 0 ), а отображать состояние на третей ( Состояние со значением Старт = 1, Стоп = 0, без возможности редактирования ).
Ко всем кнопкам привязана одна булевая переменная.
Тоже получается как-то не понятно : если нажимаю  Старт на третей кнопке отображается Стоп и наоборот...
Проект прилагаю.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по кнопкам
« Ответ #1 : 08 Июля 2019, 21:11:19 »
Здравствуйте.
Обычно просто создают одну кнопку с двумя состояниями (первое - старт, второе - стоп) тогда Вы сможете включать и выключать одной кнопкой. В этом случае и третья кнопка не нужна, т.к. по состоянию основной кнопки уже понятно запущен процесс или остановлен.
Если всё же нужно вывести состояние (запущен / остановлен) через отдельную кнопку (у Вас это кнопка с именем "Button5"), то включите у неё свойство "Инверсия" или поменяйте вручную порядок двух её состояний. Хотя обычно состояние отображают через компонент Текст, т.к. кнопка может использоваться для управления значением переменной.
Посмотрите проект во вложении.

vladka767

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #2 : 09 Июля 2019, 19:22:45 »
Понятно, спасибо!
Использую элемент "кнопка" для отображения. т.к. так проще менять состояния.

pan2000

  • Постоялец
  • ***
  • Сообщений: 216
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #3 : 10 Июля 2019, 02:33:03 »
Есть задача : Одной кнопкой устанавливать переменную только в 1, второй только в 0 (Старт, Стоп).
Но отображать нужно два сотояния и на той и на другой кнопке, т.е. нажал "Старт" и кнопка старт подсветилась, а кнопка "Стоп" погасла и наоборот.
Не нашел простого решения , может подкажете как это сделать без скриптов?

Возможно то, что Вам нужно, но со скриптом.

Для включения-выключения используются связанные с одной переменной кнопки "Run" и "Stop", с фиксацией и двумя состояниями.
Иконка и надпись на кнопке одинаковы для обоих состояний каждой кнопки, цвет отпущенного состояния кнопок - серый, нажатого - зеленый для кнопки "Run" и красный для "Stop". Тег кнопки "Run" = 1, кнопки "Stop" = 0.
Для блокировки обратного переключения при повторном нажатии кнопки можно использовать коррекцию переменной или управление доступностью кнопки.
Скрипт по событию "Пользователь кликнул объект мышью":
Код: (delphi)
// это скрипт для коррекции переменной
  xVarForButton.Value := Sender.Tag;

// это скрипт для управления доступностью
  Button1.Enabled := Sender.Tag <> 1;  // кнопка "Run"
  Button2.Enabled := Sender.Tag = 1;   // кнопка "Stop"

Во вложении пример с обоими скриптами. Для справки показан список событий, происходящих по нажатию кнопок.
« Изменён: 10 Июля 2019, 02:35:53 от pan2000 »

vladka767

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #4 : 11 Июля 2019, 17:17:07 »
Есть задача : Одной кнопкой устанавливать переменную только в 1, второй только в 0 (Старт, Стоп).
Но отображать нужно два сотояния и на той и на другой кнопке, т.е. нажал "Старт" и кнопка старт подсветилась, а кнопка "Стоп" погасла и наоборот.
Не нашел простого решения , может подкажете как это сделать без скриптов?

Возможно то, что Вам нужно, но со скриптом.

Для включения-выключения используются связанные с одной переменной кнопки "Run" и "Stop", с фиксацией и двумя состояниями.
Иконка и надпись на кнопке одинаковы для обоих состояний каждой кнопки, цвет отпущенного состояния кнопок - серый, нажатого - зеленый для кнопки "Run" и красный для "Stop". Тег кнопки "Run" = 1, кнопки "Stop" = 0.
Для блокировки обратного переключения при повторном нажатии кнопки можно использовать коррекцию переменной или управление доступностью кнопки.
Скрипт по событию "Пользователь кликнул объект мышью":
Код: (delphi)
// это скрипт для коррекции переменной
  xVarForButton.Value := Sender.Tag;

// это скрипт для управления доступностью
  Button1.Enabled := Sender.Tag <> 1;  // кнопка "Run"
  Button2.Enabled := Sender.Tag = 1;   // кнопка "Stop"

Во вложении пример с обоими скриптами. Для справки показан список событий, происходящих по нажатию кнопок.

Как скриптами сделать я догадался, думал может стандартными настройками можно было.
Но за ответ все равно спасибо  :)

vladka767

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #5 : 17 Июля 2019, 19:48:38 »
Не нашел где можно установить значение вне диапазона "Номеров" .
При выходе за диапазон в вашем примере кнопка просто становится не активной, а мне нужно чтобы она меняла на нужное мне состояние.

vladka767

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #6 : 22 Июля 2019, 18:55:29 »
Для взаимосвязанных кнопок необходим скрипт.

Довольно странно, это типовая задача и, как по мне, довольно просто реализуема.
Буду надеятся что в дальнейшем такая возможность добавится...

Genrosol

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #7 : 05 Августа 2019, 07:17:30 »
Здравствуйте, уважаемые разработчики Simple-Scada!
Очень часто возникает необходимость в использовании подобной кнопки, по нажатию которой происходит запись только одного значения (1 или 0) в привязанную переменную.
Пока приходится менять значение скриптом на событие "OnClick". Все бы хорошо, но так же требуется реализовать подтверждение нажатия кнопки.
В связи с этим имеется предложение доработать объект TM_Button в соответствии с поставленной задачей. Или реализовать подтверждение ввода значение через скрипты (аналоги MessageDlg в Delphi), но предполагаю это будет сложнее.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1363
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #8 : 05 Августа 2019, 08:34:39 »
Здравствуйте.

Цитировать
Очень часто возникает необходимость в использовании подобной кнопки, по нажатию которой происходит запись только одного значения (1 или 0) в привязанную переменную.
Если у кнопки "С фиксацией" оставить одно состояние, то кнопка будет записывать фиксированное значение - см. скриншот во вложении.

Genrosol

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #9 : 06 Августа 2019, 06:38:24 »
Если у кнопки "С фиксацией" оставить одно состояние, то кнопка будет записывать фиксированное значение - см. скриншот во вложении.
Спасибо за ответ! Предложенный способ предполагает изменение свойств кнопки при нажатии так же через скрипты (цвет кнопки, цвет шрифта и т.д.)? Не то, что бы не хочется использовать скрипты, просто для подобной тривиальной задачи ожидаешь простое стандартное решение. Ну ничего, привыкнем.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по кнопкам
« Ответ #10 : 06 Августа 2019, 10:33:27 »
Т.е. нужно, чтобы кнопка использовала два состояния, например была серого цвета при значении 0 и зелёного цвета при значении 1, но по нажатию на кнопку всегда записывала в переменную только 1? (0 и 1 для примера, можно и другие значения). Верно? Если так, то мы можем у состояний кнопки добавить новое свойство, чтобы можно было отключить присвоение из этого состояния и использовать его только для визуального отображения. В результате можно было бы создать кнопку с двумя состояниями, которая записывает в переменную только одно значение:
  сост. 1. Кнопка серого цвета, при нажатии записывает 1 и переходит в состояние 2;
  сост. 2. Кнопка зелёного цвета, при нажатии ничего не записывает.
Или нужно другое поведение?
« Изменён: 06 Августа 2019, 10:34:30 от Simple-Scada »

Genrosol

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #11 : 06 Августа 2019, 13:35:56 »
Т.е. нужно, чтобы кнопка использовала два состояния, например была серого цвета при значении 0 и зелёного цвета при значении 1, но по нажатию на кнопку всегда записывала в переменную только 1? (0 и 1 для примера, можно и другие значения). Верно?
Именно так.

Neskad

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Вопросы по кнопкам
« Ответ #12 : 01 Октября 2019, 17:42:40 »
Может кому пригодится маленький скрипт для цветовой индикации срабатывания кнопок с фиксацией и одним состоянием, о которых тут шла речь. Скрипт универсальный, нужно только привязать его к каждой из кнопок, на событие "OnDataChange".
И разумеется кнопки должны быть привязаны к общей глобальной переменной.

Код: (delphi)
var
  button: TM_Button;
begin
// цветовая индикация действующего режима кнопок
  button:= Sender as TM_Button;
  if button.States[0].Value = button.Variable.Value then
    button.States[0].Color:= clLimeGreen // цвет активной кнопки
  else
    button.States[0].Color:= clGray; // цвет неактивной кнопки
end.
« Изменён: 01 Октября 2019, 17:49:05 от Neskad »