Запрет действий всех контролов, кроме одного

Обсуждение, связанное с разработкой ПО верхнего уровня
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

Здравствуйте! На лицевой панели десятка два контролов/индикаторов. В программе примерно столько же Case Structure МАШИНЫ СОСТОЯНИЙ. Есть одна Event Structure. В ходе работы пользователь своими действиями может создать нежелательную ситуацию. Внутри одной из Case Structure по Selector Label появится переход к нежелательному состоянию ВП.
Вопрос. После описанного перехода нужно заблокировать в Event действие всех контролов, кроме одного, который пользователь должен найти и, нажав на него, выйти из этого состояния. Как создать такое событие?
Аватара пользователя
zxc_pavel
adviser
adviser
Сообщения: 242
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 9 раз
Поблагодарили: 23 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение zxc_pavel »

Нужно просто вызывать методы контролов.
Мне нравится просто менять visible на false, просто убирая кнопку
Можно disable или grayed out ставить. Как удобнее

В VI "нежелательное" состояние это 1 и 2 кнопка true
Вложения
Untitled 2.vi
(22.51 КБ) 217 скачиваний
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

zxc_pavel писал(а):Можно disable или grayed out ставить. Как удобнее
Спасибо за ответ.
1. Я хотел бы не менять свойства по одному для каждой кнопки, а в Event по фильтру disable сразу для всех, но кроме одной. Как это сделать, когда нажимается мышка мне понятно, а как создать событие, чтобы появились фильтры по появлению конкретного Label? С grayed out не сталкивался. Буду разбираться.
2. Не могу просмотреть вложение, т.к. у меня версия :labview: более старая, 2013. Если не сложно, перепишите для более старой.
Аватара пользователя
zxc_pavel
adviser
adviser
Сообщения: 242
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 9 раз
Поблагодарили: 23 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение zxc_pavel »

Ну да, в отдельном эвенте все свойства менять, у Вас же как я понял переход к нему есть
Вложения
Untitled 2 13.0.vi
(11.83 КБ) 203 скачивания
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

Посмотрел. Идею понял. Спасибо. Но мне нужно не срыть контролы, а сделать их неактивными, чтобы нажатия на них (кроме одного контрола) ничего не вызывали.
И хотелось бы понять, как сделать событие при появлении определённого селектора Label. В "Labview для всех" написано, что "событием может быть практически всё, что происходит в Labview".
Аватара пользователя
zxc_pavel
adviser
adviser
Сообщения: 242
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 9 раз
Поблагодарили: 23 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение zxc_pavel »

Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит.
Untitled 3.vi
(12.56 КБ) 223 скачивания
Запрет считывания в таймауте при определенном условии, портит код, конечно, по-другому я не умею. Может кто посоветует...
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

zxc_pavel писал(а):Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит
Устроит, очень даже. Главное, чтобы никаких действий при нажатии на них не происходило. Посмотрел вложение. Близко к тому, что мне надо. Спасибо. Кнопки никак не должны меняться при нажатии. Думаю, что доделаю сам.
А таймаут меня устраивает. Во всяком случае, пока.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение Kosist »

LEO_NIK писал(а):Устроит, очень даже. Главное, чтобы никаких действий при нажатии на них не происходило. Посмотрел вложение. Близко к тому, что мне надо. Спасибо. Кнопки никак не должны меняться при нажатии. Думаю, что доделаю сам.
А таймаут меня устраивает. Во всяком случае, пока.
Мне кажется, что Вам не нужен таймаут - у Вас ведь есть стейт-машина. И когда переходите в "запрещенное состояние", в том стейте и делайте контролы Disabled (или Disabled and Grayed). А когда выходите из запрещенного состояния, делайте все контролы активными. Таймаут здесь не нужен, это была специфика примера...
Мы делили апельсин - много наших полегло...
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

Kosist писал(а):... в том стейте и делайте контролы Disabled (или Disabled and Grayed)
Спасибо. А есть ли функция (оператор ... ?) в :labview: , когда можно разом объявить ВСЕ контролы или какое-то количество как Disabled или надо всех по одному делать пассивными (отключёнными), а потом наоборот? Делать это по одному - трудоёмко. В программе есть немало мест, где должны работать всего 1-2 кнопки, а остальные при этом - пассивные. Иначе пользователь, нажимая на них такое наворотит ... А предугадать его действия с двумя десятками кнопок - невозможно. Проще запретить действия при нажатии. Да и в реальном приборе кнопки работают только когда это необходимо по заложенному алгоритму.
Часть вопроса относительно события по Label уже не актуальна, но на будущее: как всё-таки сделать событие Event не по нажатию мышки, а, например, по определённому Label, или по числовому значению какой-либо величины? Очень удобный механизм, но не могу его использовать. Если не сложно, подскажите описание или пример.
Аватара пользователя
zxc_pavel
adviser
adviser
Сообщения: 242
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 9 раз
Поблагодарили: 23 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение zxc_pavel »

Это не так трудоемко, можно же копировать через ctrl. Места правда много занимает. Но по другому никак.

Если я правильно понял, нужны user event'ы - события не по нажатию на кнопку
Может быть, я не знаю способа проще, но делаю так.
Создается event structure: ПКМ по нему -> Show dynamic event terminals. Дальше события прописать (почему-то они находятся далеко...). Тут я нашел, мб где-то еще есть.
reg_events.png
Там 3 vi нужны, register for events, create user event и generate user event. Примерчик прикрепил.
Вложения
Untitled 1.vi
(10.69 КБ) 213 скачиваний
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

Спасибо за помощь. Кажется, я сообразил с ответами на свои же вопросы. Как проверю свои идеи, отпишусь. Ещё раз спасибо!
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 275
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение ladik »

Можно попробовать собрать все референсы и лейблы в массив. И при нажатии на определенную кнопку, блокировать все контролы, а потом по лейблу делать активными те, что нужно.
Вложения
DisabledControls.vi
(13.25 КБ) 213 скачиваний
Дорогу осилит идущий.
LEO_NIK
user
user
Сообщения: 86
Зарегистрирован: 09 сен 2016, 20:09
Версия LabVIEW: 2013
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение LEO_NIK »

ladik, спасибо за совет. Я тут сам вроде нащупал, как решить свою задачу, поэтому не смотрел на форум. Посмотрю на ВЛОЖЕНИЕ, потом отвечу. Кое что получилось, но не так, как задумывал. Главная проблема, которую не решил, но обхожу как-то сложно, коряво, это вот что.
Мне нужно сделать так, чтобы можно было отключать не нажатие на кнопку, а действие, которое она должна выполнить. Свойством же Disabled отключается эффект нажатия. Да, кнопка мёртвая, но действие выполняется. Мне же нужно всё наоборот. Не могу найти способ, как программно отключать, а как разрешать выполнение какой-то функции при нажатии на контрол. Повторяю, что кнопка (с самовозвратом) должна нажиматься вхолостую.
Для чего это нужно? Как уже писал, на лиц. панели около 20 контролов. На каждом шаге программы по заложенному алгоритму должны быть задействованы всего несколько контролов. Чтобы не позволить необученному пользователю выполнять неправильные действия и увести тем самым программу куда-то в тупик, я решил нерабочие кнопки заблокировать от действий при нажатии на них. Поскольку большая часть кнопок на каждом шаге - не рабочие, то решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных, которые после выполнения нажатий на них опять заблокировать до следующего шага, когда они будут нужны. И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так.
Вполне допускаю, что делаю коряво. Приму любую критику и совет.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение Artem.spb »

LEO_NIK писал(а): И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так..
этот как раз с точки зрения юзабилити ОЧЕНЬ плохо: дать пользователю сделать действие, а потом сказать, что он дурак, потому что делать этого было нельзя.
Это ещё с библейских времён известно: если поставить дерево посреди сада и сказать что его трогать нельзя, то очень захочется.
Качественный интерфейс не исправляет ошибки пользователя, а не позволяет ему их совершать (в данном случае блокировкой кнопок).

Если уж хочется издеваться над пользователем, то в обработчике нажатия кнопок надо всего лишь проверять, допустимо ли действие. если оно не допустимо, то и не делать его.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Запрет действий всех контролов, кроме одного

Сообщение dadreamer »

LEO_NIK писал(а):решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных
Смотрите пример.
Block-Unblock Ctl.vi
lv2013
(13.18 КБ) 225 скачиваний
Конкретные контролы и индикаторы выбираются по их заранее известным характеристикам (в том числе и тем, что вы зададите им) - это может быть класс, лэйбл, заголовок (caption) и т.п.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Лицевая панель»