Страница 1 из 2

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

Добавлено: 12 фев 2017, 11:58
LEO_NIK
Здравствуйте! На лицевой панели десятка два контролов/индикаторов. В программе примерно столько же Case Structure МАШИНЫ СОСТОЯНИЙ. Есть одна Event Structure. В ходе работы пользователь своими действиями может создать нежелательную ситуацию. Внутри одной из Case Structure по Selector Label появится переход к нежелательному состоянию ВП.
Вопрос. После описанного перехода нужно заблокировать в Event действие всех контролов, кроме одного, который пользователь должен найти и, нажав на него, выйти из этого состояния. Как создать такое событие?

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

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

В VI "нежелательное" состояние это 1 и 2 кнопка true

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

Добавлено: 12 фев 2017, 12:55
LEO_NIK
zxc_pavel писал(а):Можно disable или grayed out ставить. Как удобнее
Спасибо за ответ.
1. Я хотел бы не менять свойства по одному для каждой кнопки, а в Event по фильтру disable сразу для всех, но кроме одной. Как это сделать, когда нажимается мышка мне понятно, а как создать событие, чтобы появились фильтры по появлению конкретного Label? С grayed out не сталкивался. Буду разбираться.
2. Не могу просмотреть вложение, т.к. у меня версия :labview: более старая, 2013. Если не сложно, перепишите для более старой.

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

Добавлено: 12 фев 2017, 13:00
zxc_pavel
Ну да, в отдельном эвенте все свойства менять, у Вас же как я понял переход к нему есть

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

Добавлено: 12 фев 2017, 13:19
LEO_NIK
Посмотрел. Идею понял. Спасибо. Но мне нужно не срыть контролы, а сделать их неактивными, чтобы нажатия на них (кроме одного контрола) ничего не вызывали.
И хотелось бы понять, как сделать событие при появлении определённого селектора Label. В "Labview для всех" написано, что "событием может быть практически всё, что происходит в Labview".

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

Добавлено: 12 фев 2017, 13:52
zxc_pavel
Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит.
Untitled 3.vi
(12.56 КБ) 226 скачиваний
Запрет считывания в таймауте при определенном условии, портит код, конечно, по-другому я не умею. Может кто посоветует...

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

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

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

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

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

Добавлено: 12 фев 2017, 16:43
LEO_NIK
Kosist писал(а):... в том стейте и делайте контролы Disabled (или Disabled and Grayed)
Спасибо. А есть ли функция (оператор ... ?) в :labview: , когда можно разом объявить ВСЕ контролы или какое-то количество как Disabled или надо всех по одному делать пассивными (отключёнными), а потом наоборот? Делать это по одному - трудоёмко. В программе есть немало мест, где должны работать всего 1-2 кнопки, а остальные при этом - пассивные. Иначе пользователь, нажимая на них такое наворотит ... А предугадать его действия с двумя десятками кнопок - невозможно. Проще запретить действия при нажатии. Да и в реальном приборе кнопки работают только когда это необходимо по заложенному алгоритму.
Часть вопроса относительно события по Label уже не актуальна, но на будущее: как всё-таки сделать событие Event не по нажатию мышки, а, например, по определённому Label, или по числовому значению какой-либо величины? Очень удобный механизм, но не могу его использовать. Если не сложно, подскажите описание или пример.

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

Добавлено: 12 фев 2017, 18:43
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. Примерчик прикрепил.

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

Добавлено: 12 фев 2017, 22:18
LEO_NIK
Спасибо за помощь. Кажется, я сообразил с ответами на свои же вопросы. Как проверю свои идеи, отпишусь. Ещё раз спасибо!

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

Добавлено: 13 фев 2017, 07:14
ladik
Можно попробовать собрать все референсы и лейблы в массив. И при нажатии на определенную кнопку, блокировать все контролы, а потом по лейблу делать активными те, что нужно.

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

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

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

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

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

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

Добавлено: 18 фев 2017, 16:42
dadreamer
LEO_NIK писал(а):решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных
Смотрите пример.
Block-Unblock Ctl.vi
lv2013
(13.18 КБ) 226 скачиваний
Конкретные контролы и индикаторы выбираются по их заранее известным характеристикам (в том числе и тем, что вы зададите им) - это может быть класс, лэйбл, заголовок (caption) и т.п.