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

Обсуждение, связанное с разработкой ПО верхнего уровня

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

Postby LEO_NIK on 12 Feb 2017, 11:58

Здравствуйте! На лицевой панели десятка два контролов/индикаторов. В программе примерно столько же Case Structure МАШИНЫ СОСТОЯНИЙ. Есть одна Event Structure. В ходе работы пользователь своими действиями может создать нежелательную ситуацию. Внутри одной из Case Structure по Selector Label появится переход к нежелательному состоянию ВП.
Вопрос. После описанного перехода нужно заблокировать в Event действие всех контролов, кроме одного, который пользователь должен найти и, нажав на него, выйти из этого состояния. Как создать такое событие?
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby zxc_pavel on 12 Feb 2017, 12:37

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

В VI "нежелательное" состояние это 1 и 2 кнопка true
Attachments
Untitled 2.vi
(22.51 KiB) Downloaded 84 times
zxc_pavel
user
user
 
Posts: 96
Joined: 02 Jun 2016, 12:07
LabVIEW Version: 14
Karma: 74

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

Postby LEO_NIK on 12 Feb 2017, 12:55

zxc_pavel wrote:Можно disable или grayed out ставить. Как удобнее

Спасибо за ответ.
1. Я хотел бы не менять свойства по одному для каждой кнопки, а в Event по фильтру disable сразу для всех, но кроме одной. Как это сделать, когда нажимается мышка мне понятно, а как создать событие, чтобы появились фильтры по появлению конкретного Label? С grayed out не сталкивался. Буду разбираться.
2. Не могу просмотреть вложение, т.к. у меня версия :labview: более старая, 2013. Если не сложно, перепишите для более старой.
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby zxc_pavel on 12 Feb 2017, 13:00

Ну да, в отдельном эвенте все свойства менять, у Вас же как я понял переход к нему есть
Attachments
Untitled 2 13.0.vi
(11.83 KiB) Downloaded 71 times
zxc_pavel
user
user
 
Posts: 96
Joined: 02 Jun 2016, 12:07
LabVIEW Version: 14
Karma: 74

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

Postby LEO_NIK on 12 Feb 2017, 13:19

Посмотрел. Идею понял. Спасибо. Но мне нужно не срыть контролы, а сделать их неактивными, чтобы нажатия на них (кроме одного контрола) ничего не вызывали.
И хотелось бы понять, как сделать событие при появлении определённого селектора Label. В "Labview для всех" написано, что "событием может быть практически всё, что происходит в Labview".
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby zxc_pavel on 12 Feb 2017, 13:52

Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит.

Untitled 3.vi
(12.56 KiB) Downloaded 79 times


Запрет считывания в таймауте при определенном условии, портит код, конечно, по-другому я не умею. Может кто посоветует...
zxc_pavel
user
user
 
Posts: 96
Joined: 02 Jun 2016, 12:07
LabVIEW Version: 14
Karma: 74

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

Postby LEO_NIK on 12 Feb 2017, 14:55

zxc_pavel wrote:Можно не удалять с экрана, а запретить нажатие на них, но как я понял Вас это вряд ли устроит

Устроит, очень даже. Главное, чтобы никаких действий при нажатии на них не происходило. Посмотрел вложение. Близко к тому, что мне надо. Спасибо. Кнопки никак не должны меняться при нажатии. Думаю, что доделаю сам.
А таймаут меня устраивает. Во всяком случае, пока.
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby Kosist on 12 Feb 2017, 15:42

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

Мне кажется, что Вам не нужен таймаут - у Вас ведь есть стейт-машина. И когда переходите в "запрещенное состояние", в том стейте и делайте контролы Disabled (или Disabled and Grayed). А когда выходите из запрещенного состояния, делайте все контролы активными. Таймаут здесь не нужен, это была специфика примера...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 900
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 253
CLAD I/O VIP students

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

Postby LEO_NIK on 12 Feb 2017, 16:43

Kosist wrote:... в том стейте и делайте контролы Disabled (или Disabled and Grayed)

Спасибо. А есть ли функция (оператор ... ?) в :labview: , когда можно разом объявить ВСЕ контролы или какое-то количество как Disabled или надо всех по одному делать пассивными (отключёнными), а потом наоборот? Делать это по одному - трудоёмко. В программе есть немало мест, где должны работать всего 1-2 кнопки, а остальные при этом - пассивные. Иначе пользователь, нажимая на них такое наворотит ... А предугадать его действия с двумя десятками кнопок - невозможно. Проще запретить действия при нажатии. Да и в реальном приборе кнопки работают только когда это необходимо по заложенному алгоритму.
Часть вопроса относительно события по Label уже не актуальна, но на будущее: как всё-таки сделать событие Event не по нажатию мышки, а, например, по определённому Label, или по числовому значению какой-либо величины? Очень удобный механизм, но не могу его использовать. Если не сложно, подскажите описание или пример.
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby zxc_pavel on 12 Feb 2017, 18:43

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

Если я правильно понял, нужны user event'ы - события не по нажатию на кнопку
Может быть, я не знаю способа проще, но делаю так.
Создается event structure: ПКМ по нему -> Show dynamic event terminals. Дальше события прописать (почему-то они находятся далеко...). Тут я нашел, мб где-то еще есть.
reg_events.png

Там 3 vi нужны, register for events, create user event и generate user event. Примерчик прикрепил.
Attachments
Untitled 1.vi
(10.69 KiB) Downloaded 77 times
zxc_pavel
user
user
 
Posts: 96
Joined: 02 Jun 2016, 12:07
LabVIEW Version: 14
Karma: 74

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

Postby LEO_NIK on 12 Feb 2017, 22:18

Спасибо за помощь. Кажется, я сообразил с ответами на свои же вопросы. Как проверю свои идеи, отпишусь. Ещё раз спасибо!
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby ladik on 13 Feb 2017, 07:14

Можно попробовать собрать все референсы и лейблы в массив. И при нажатии на определенную кнопку, блокировать все контролы, а потом по лейблу делать активными те, что нужно.
Attachments
DisabledControls.vi
(13.25 KiB) Downloaded 82 times
Дорогу осилит идущий.
User avatar
ladik
advanced
advanced
 
Posts: 198
Joined: 18 Nov 2014, 11:45
Location: Астана
Medals: 1
Silver (1)
LabVIEW Version: 2011, 2015
Karma: 69
hardware I/O VIP

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

Postby LEO_NIK on 18 Feb 2017, 00:05

ladik, спасибо за совет. Я тут сам вроде нащупал, как решить свою задачу, поэтому не смотрел на форум. Посмотрю на ВЛОЖЕНИЕ, потом отвечу. Кое что получилось, но не так, как задумывал. Главная проблема, которую не решил, но обхожу как-то сложно, коряво, это вот что.
Мне нужно сделать так, чтобы можно было отключать не нажатие на кнопку, а действие, которое она должна выполнить. Свойством же Disabled отключается эффект нажатия. Да, кнопка мёртвая, но действие выполняется. Мне же нужно всё наоборот. Не могу найти способ, как программно отключать, а как разрешать выполнение какой-то функции при нажатии на контрол. Повторяю, что кнопка (с самовозвратом) должна нажиматься вхолостую.
Для чего это нужно? Как уже писал, на лиц. панели около 20 контролов. На каждом шаге программы по заложенному алгоритму должны быть задействованы всего несколько контролов. Чтобы не позволить необученному пользователю выполнять неправильные действия и увести тем самым программу куда-то в тупик, я решил нерабочие кнопки заблокировать от действий при нажатии на них. Поскольку большая часть кнопок на каждом шаге - не рабочие, то решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных, которые после выполнения нажатий на них опять заблокировать до следующего шага, когда они будут нужны. И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так.
Вполне допускаю, что делаю коряво. Приму любую критику и совет.
LEO_NIK
user
user
 
Posts: 86
Joined: 09 Sep 2016, 20:09
LabVIEW Version: 2013
Karma: 0

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

Postby Artem.spb on 18 Feb 2017, 16:17

LEO_NIK wrote: И будет даже хорошо, что пользователь видит, как они нажимаются, но ничего не происходит: значит он делает что-то не так..

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

Если уж хочется издеваться над пользователем, то в обработчике нажатия кнопок надо всего лишь проверять, допустимо ли действие. если оно не допустимо, то и не делать его.
Artem.spb
expert
expert
 
Posts: 1456
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 249
CLD hardware I/O VIP freelance

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

Postby dadreamer on 18 Feb 2017, 16:42

LEO_NIK wrote:решил ВСЕ контролы держать по умолчанию заблокированными (не знаю, как это сделать), а в нужный момент разблокировать (как ?) только несколько конкретных

Смотрите пример.
Block-Unblock Ctl.vi
lv2013
(13.18 KiB) Downloaded 85 times

Конкретные контролы и индикаторы выбираются по их заранее известным характеристикам (в том числе и тем, что вы зададите им) - это может быть класс, лэйбл, заголовок (caption) и т.п.
User avatar
dadreamer
professor
professor
 
Posts: 3157
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 803
I/O VIP vision internet

Next

Return to Лицевая панель

Who is online

Users browsing this forum: No registered users and 4 guests

cron