Запрет действий всех контролов, кроме одного
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Запрет действий всех контролов, кроме одного
Здравствуйте! На лицевой панели десятка два контролов/индикаторов. В программе примерно столько же Case Structure МАШИНЫ СОСТОЯНИЙ. Есть одна Event Structure. В ходе работы пользователь своими действиями может создать нежелательную ситуацию. Внутри одной из Case Structure по Selector Label появится переход к нежелательному состоянию ВП.
Вопрос. После описанного перехода нужно заблокировать в Event действие всех контролов, кроме одного, который пользователь должен найти и, нажав на него, выйти из этого состояния. Как создать такое событие?
Вопрос. После описанного перехода нужно заблокировать в Event действие всех контролов, кроме одного, который пользователь должен найти и, нажав на него, выйти из этого состояния. Как создать такое событие?
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Нужно просто вызывать методы контролов.
Мне нравится просто менять visible на false, просто убирая кнопку
Можно disable или grayed out ставить. Как удобнее
В VI "нежелательное" состояние это 1 и 2 кнопка true
Мне нравится просто менять visible на false, просто убирая кнопку
Можно disable или grayed out ставить. Как удобнее
В VI "нежелательное" состояние это 1 и 2 кнопка true
- Вложения
-
- Untitled 2.vi
- (22.51 КБ) 218 скачиваний
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Спасибо за ответ.zxc_pavel писал(а):Можно disable или grayed out ставить. Как удобнее
1. Я хотел бы не менять свойства по одному для каждой кнопки, а в Event по фильтру disable сразу для всех, но кроме одной. Как это сделать, когда нажимается мышка мне понятно, а как создать событие, чтобы появились фильтры по появлению конкретного Label? С grayed out не сталкивался. Буду разбираться.
2. Не могу просмотреть вложение, т.к. у меня версия более старая, 2013. Если не сложно, перепишите для более старой.
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Ну да, в отдельном эвенте все свойства менять, у Вас же как я понял переход к нему есть
- Вложения
-
- Untitled 2 13.0.vi
- (11.83 КБ) 204 скачивания
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Посмотрел. Идею понял. Спасибо. Но мне нужно не срыть контролы, а сделать их неактивными, чтобы нажатия на них (кроме одного контрола) ничего не вызывали.
И хотелось бы понять, как сделать событие при появлении определённого селектора Label. В "Labview для всех" написано, что "событием может быть практически всё, что происходит в Labview".
И хотелось бы понять, как сделать событие при появлении определённого селектора Label. В "Labview для всех" написано, что "событием может быть практически всё, что происходит в Labview".
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит.
Запрет считывания в таймауте при определенном условии, портит код, конечно, по-другому я не умею. Может кто посоветует...
Запрет считывания в таймауте при определенном условии, портит код, конечно, по-другому я не умею. Может кто посоветует...
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Устроит, очень даже. Главное, чтобы никаких действий при нажатии на них не происходило. Посмотрел вложение. Близко к тому, что мне надо. Спасибо. Кнопки никак не должны меняться при нажатии. Думаю, что доделаю сам.zxc_pavel писал(а):Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит
А таймаут меня устраивает. Во всяком случае, пока.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Мне кажется, что Вам не нужен таймаут - у Вас ведь есть стейт-машина. И когда переходите в "запрещенное состояние", в том стейте и делайте контролы Disabled (или Disabled and Grayed). А когда выходите из запрещенного состояния, делайте все контролы активными. Таймаут здесь не нужен, это была специфика примера...LEO_NIK писал(а):Устроит, очень даже. Главное, чтобы никаких действий при нажатии на них не происходило. Посмотрел вложение. Близко к тому, что мне надо. Спасибо. Кнопки никак не должны меняться при нажатии. Думаю, что доделаю сам.
А таймаут меня устраивает. Во всяком случае, пока.
Мы делили апельсин - много наших полегло...
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Спасибо. А есть ли функция (оператор ... ?) в , когда можно разом объявить ВСЕ контролы или какое-то количество как Disabled или надо всех по одному делать пассивными (отключёнными), а потом наоборот? Делать это по одному - трудоёмко. В программе есть немало мест, где должны работать всего 1-2 кнопки, а остальные при этом - пассивные. Иначе пользователь, нажимая на них такое наворотит ... А предугадать его действия с двумя десятками кнопок - невозможно. Проще запретить действия при нажатии. Да и в реальном приборе кнопки работают только когда это необходимо по заложенному алгоритму.Kosist писал(а):... в том стейте и делайте контролы Disabled (или Disabled and Grayed)
Часть вопроса относительно события по Label уже не актуальна, но на будущее: как всё-таки сделать событие Event не по нажатию мышки, а, например, по определённому Label, или по числовому значению какой-либо величины? Очень удобный механизм, но не могу его использовать. Если не сложно, подскажите описание или пример.
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Это не так трудоемко, можно же копировать через ctrl. Места правда много занимает. Но по другому никак.
Если я правильно понял, нужны user event'ы - события не по нажатию на кнопку
Может быть, я не знаю способа проще, но делаю так.
Создается event structure: ПКМ по нему -> Show dynamic event terminals. Дальше события прописать (почему-то они находятся далеко...). Тут я нашел, мб где-то еще есть. Там 3 vi нужны, register for events, create user event и generate user event. Примерчик прикрепил.
Если я правильно понял, нужны user event'ы - события не по нажатию на кнопку
Может быть, я не знаю способа проще, но делаю так.
Создается event structure: ПКМ по нему -> Show dynamic event terminals. Дальше события прописать (почему-то они находятся далеко...). Тут я нашел, мб где-то еще есть. Там 3 vi нужны, register for events, create user event и generate user event. Примерчик прикрепил.
- Вложения
-
- Untitled 1.vi
- (10.69 КБ) 214 скачиваний
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Спасибо за помощь. Кажется, я сообразил с ответами на свои же вопросы. Как проверю свои идеи, отпишусь. Ещё раз спасибо!
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Можно попробовать собрать все референсы и лейблы в массив. И при нажатии на определенную кнопку, блокировать все контролы, а потом по лейблу делать активными те, что нужно.
- Вложения
-
- DisabledControls.vi
- (13.25 КБ) 214 скачиваний
Дорогу осилит идущий.
-
- user
- Сообщения: 86
- Зарегистрирован: 09 сен 2016, 20:09
- Версия LabVIEW: 2013
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
ladik, спасибо за совет. Я тут сам вроде нащупал, как решить свою задачу, поэтому не смотрел на форум. Посмотрю на ВЛОЖЕНИЕ, потом отвечу. Кое что получилось, но не так, как задумывал. Главная проблема, которую не решил, но обхожу как-то сложно, коряво, это вот что.
Мне нужно сделать так, чтобы можно было отключать не нажатие на кнопку, а действие, которое она должна выполнить. Свойством же Disabled отключается эффект нажатия. Да, кнопка мёртвая, но действие выполняется. Мне же нужно всё наоборот. Не могу найти способ, как программно отключать, а как разрешать выполнение какой-то функции при нажатии на контрол. Повторяю, что кнопка (с самовозвратом) должна нажиматься вхолостую.
Для чего это нужно? Как уже писал, на лиц. панели около 20 контролов. На каждом шаге программы по заложенному алгоритму должны быть задействованы всего несколько контролов. Чтобы не позволить необученному пользователю выполнять неправильные действия и увести тем самым программу куда-то в тупик, я решил нерабочие кнопки заблокировать от действий при нажатии на них. Поскольку большая часть кнопок на каждом шаге - не рабочие, то решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных, которые после выполнения нажатий на них опять заблокировать до следующего шага, когда они будут нужны. И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так.
Вполне допускаю, что делаю коряво. Приму любую критику и совет.
Мне нужно сделать так, чтобы можно было отключать не нажатие на кнопку, а действие, которое она должна выполнить. Свойством же Disabled отключается эффект нажатия. Да, кнопка мёртвая, но действие выполняется. Мне же нужно всё наоборот. Не могу найти способ, как программно отключать, а как разрешать выполнение какой-то функции при нажатии на контрол. Повторяю, что кнопка (с самовозвратом) должна нажиматься вхолостую.
Для чего это нужно? Как уже писал, на лиц. панели около 20 контролов. На каждом шаге программы по заложенному алгоритму должны быть задействованы всего несколько контролов. Чтобы не позволить необученному пользователю выполнять неправильные действия и увести тем самым программу куда-то в тупик, я решил нерабочие кнопки заблокировать от действий при нажатии на них. Поскольку большая часть кнопок на каждом шаге - не рабочие, то решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных, которые после выполнения нажатий на них опять заблокировать до следующего шага, когда они будут нужны. И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так.
Вполне допускаю, что делаю коряво. Приму любую критику и совет.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
этот как раз с точки зрения юзабилити ОЧЕНЬ плохо: дать пользователю сделать действие, а потом сказать, что он дурак, потому что делать этого было нельзя.LEO_NIK писал(а): И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так..
Это ещё с библейских времён известно: если поставить дерево посреди сада и сказать что его трогать нельзя, то очень захочется.
Качественный интерфейс не исправляет ошибки пользователя, а не позволяет ему их совершать (в данном случае блокировкой кнопок).
Если уж хочется издеваться над пользователем, то в обработчике нажатия кнопок надо всего лишь проверять, допустимо ли действие. если оно не допустимо, то и не делать его.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Запрет действий всех контролов, кроме одного
Смотрите пример. Конкретные контролы и индикаторы выбираются по их заранее известным характеристикам (в том числе и тем, что вы зададите им) - это может быть класс, лэйбл, заголовок (caption) и т.п.LEO_NIK писал(а):решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 20 Ответы
- 671 Просмотры
-
Последнее сообщение Zloydj