Многоуровневый ComboBox

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
mixail_
user
user
Сообщения: 93
Зарегистрирован: 05 июн 2013, 08:58
Версия LabVIEW: 13
Контактная информация:

Многоуровневый ComboBox

Сообщение mixail_ »

Подскажите возможно ли сделать многоуровневый ComboBox такой структуры
1
_1.1
_1.2
2
3
_3.1
и т.д.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Многоуровневый ComboBox

Сообщение IvanLis »

mixail_ писал(а):Подскажите возможно ли сделать многоуровневый ComboBox такой структуры
Это дерево (Tree) получается:
https://decibel.ni.com/content/docs/DOC-18526
https://decibel.ni.com/content/docs/DOC-7248
mixail_
user
user
Сообщения: 93
Зарегистрирован: 05 июн 2013, 08:58
Версия LabVIEW: 13
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение mixail_ »

IvanLis, не совсем то что нужно
я имел в виду вот такое:
example.png
example.png (7.24 КБ) 14631 просмотр
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Многоуровневый ComboBox

Сообщение IvanLis »

mixail_ писал(а):IvanLis, не совсем то что нужно
я имел в виду вот такое:
Это больше на "меню" похоже :dntknw:
mixail_
user
user
Сообщения: 93
Зарегистрирован: 05 июн 2013, 08:58
Версия LabVIEW: 13
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение mixail_ »

IvanLis, да Вы правы, нашел решение http://forums.ni.com/t5/LabVIEW/How-to- ... d-p/506356
Аватара пользователя
dadreamer

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

Re: Многоуровневый ComboBox

Сообщение dadreamer »

Такое выпадающее меню и в текстовых языках редко встречается (и используется), больше всё-таки это уместно в веб-дизайне. Вот тут предложено решение через .NET, если изрядно повозиться, то можно создать такое меню, которое будет выглядеть, как на картинке. Есть ещё кое какие shareware-компоненты, импортируемые в :labview: посредством ActiveX/.NET-интерфейса. Например, вот: ctxDropMenu и Exontrol eXContextMenu (у последнего заявлена даже поддержка :labview: , однако оба не бесплатны, хотя в триал-режиме можно юзать).
Второй как-то так выглядит:
2014-05-05_23-11-53.jpg
2014-05-05_23-11-53.jpg (47.22 КБ) 14584 просмотра
Первый не стал пока проверять...
Аватара пользователя
dadreamer

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

Re: Многоуровневый ComboBox

Сообщение dadreamer »

Поигрался более детально с eXContextMenu, какое-то оно глючное оказалось, всё время перескакивало в верхний левый угол экрана. Может, это как-то и настраивается, но я в упор не нашёл. Зато на том же сайте есть компонент чуть попроще: ExPopupMenu (тоже триал, но вполне функционален, из минусов - только ссылка на сайт в контекстном меню). Для решения сабжа вполне подходит, потому опишу здесь работу с ним.
После скачивания и установки в новом файле :labview: на лицевой панели размещаем .NET & ActiveX -> ActiveX Container:
container.jpg
container.jpg (23.27 КБ) 14564 просмотра
Далее жмём ПКМ на контейнере -> Insert ActiveX Object -> ExPopupMenu ActiveX Control в появившемся окне. Контейнер превратился в прозрачный контрол. Нужно нажать на нём ПКМ -> Popup Menu -> Properties. Появится редактор всплывающего контекстного меню:
popup_editor.jpg
В нём всё крайне просто и интуитивно понятно. Поле "Item" - текст элемента меню, "ID" - уникальный идентификатор. Для того, чтобы создать вложенный пункт, нужно поставить галочку "Popup". С остальным сейчас можно даже не разбираться.
На БД находится настроенный контрол контекстного меню. Чтобы меню появилось при запуске программы, можно использовать метод Show:
Show.png
Show.png (11.1 КБ) 14564 просмотра
Или свойство ShowAtCursor:
ShowAtCursor.png
ShowAtCursor.png (10.24 КБ) 14564 просмотра
На выходе функции/свойства будет ID выбранного пункта меню или 0, если пункт не выбран. Выглядит это вот так:
FP.jpg
FP.jpg (33.38 КБ) 14564 просмотра
Теперь можно попробовать решить проблему из темы http://www.labviewportal.org/viewtopic.php?f=35&t=6999 . Сразу скажу, что решение до конца довести довольно сложно, и в примере только частичное решение проблемы.
Что нужно сделать: popup-меню забиваем нужными элементами, в Ring'е прописываем те же самые элементы (в Items имена, в Values - ID из меню). Пустые элементы, содержащие внутри под-элементы, прописывать не надо:
Ring.jpg
Ring помещаем в кластер, делаем Enabled State у Ring'а = Disabled (вместо встроенного списка LV будет выпадать наше меню). Теперь событие нажатия мышью на Ring'е можно обработать вот так:
event1.jpg
Выглядит всё это как-то так:
FP2.jpg
Если же теперь поместить кластер в массив, то ситуация намного усложняется. У массива можно обработать событие нажатия мышью, но у вложенных в массив элементов нажатие в Event'е не обрабатывается. Поэтому придётся анализировать координаты массива, элементов массива, их геометрические размеры, и определять, есть или нет попадание мышью в массив и какой индекс у элемента, куда произошло попадание:
event2.jpg
И то такой алгоритм работает лишь для растянутого вертикально массива. При сжатом до одного элемента массиве можно использовать свойство Index Values[0] - это будет индексом текущего элемента (по которому щёлкнули мышью). Для растянутого горизонтально массива нужно городить ещё одну ветку анализа координат. Можно сказать, что задача решается, нужно только время. Тем же способом можно оформить и решение с форума NI, я специально взял вариант посложнее.
Вложения
Popup Menu.vi
LV2011
(26 КБ) 251 скачивание
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение Pavel Krivozubov »

Спасибо, тема в разделе "Скачать" :super:
http://www.labviewportal.org/ru/licevaj ... 7-09-44-47
Аватара пользователя
dadreamer

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

Re: Многоуровневый ComboBox

Сообщение dadreamer »

Оказывается, для определения индекса элемента в массиве, по которому щёлкнули мышью, уже есть готовый :vi: : https://decibel.ni.com/content/docs/DOC-22434 . С массивами кластеров работает отлично.
mixail_
user
user
Сообщения: 93
Зарегистрирован: 05 июн 2013, 08:58
Версия LabVIEW: 13
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение mixail_ »

dadreamer писал(а):Оказывается, для определения индекса элемента в массиве, по которому щёлкнули мышью, уже есть готовый :vi: : https://decibel.ni.com/content/docs/DOC-22434 . С массивами кластеров работает отлично.
только если кластер из одного элемента, если добавить еще, то уже не узнать на какой из них кликнули(

вот тоже пример с нахождением индекса https://decibel.ni.com/content/docs/DOC-6406
Аватара пользователя
dadreamer

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

Re: Многоуровневый ComboBox

Сообщение dadreamer »

mixail_ писал(а):только если кластер из одного элемента, если добавить еще, то уже не узнать на какой из них кликнули(
Индекс элемента массива исправно определяется, только что проверил на массиве, содержащем кластеры из двух списков. Другое дело, что непонятно, на какой список в конкретном кластере нажали. Здесь придётся опять выкручиваться с помощью анализа координат и ширины/высоты контролов.
mixail_ писал(а):вот тоже пример с нахождением индекса https://decibel.ni.com/content/docs/DOC-6406
Это старый пример, он некорректно работает, если у массива отобразить Index Display. Тот :vi: , что выше, работает с большинством массивов (разных типов, с разным графическим оформлением, разной ориентации на панели).
lorgen
interested
interested
Сообщения: 2
Зарегистрирован: 26 июн 2016, 20:03
Версия LabVIEW: 14
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение lorgen »

Что-то сложновато, так проще будет
Вложения
fdsf323234sdfasf.PNG
lorgen
interested
interested
Сообщения: 2
Зарегистрирован: 26 июн 2016, 20:03
Версия LabVIEW: 14
Контактная информация:

Re: Многоуровневый ComboBox

Сообщение lorgen »

или так, но надо знать структуру кластера
Вложения
fdsf323234sdfasf.PNG
fdsf323234sdfasf.PNG (7.35 КБ) 13381 просмотр
Аватара пользователя
dadreamer

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

Re: Многоуровневый ComboBox

Сообщение dadreamer »

lorgen
У вас решение №1 с рядом ограничений, и к тому же своеобразное. Позиция row соответствует индексу элемента массива в строке массива только для массива, сжатого до 1 элемента или растянутого по вертикали. Позиция col определяет не индекс элемента массива в столбце массива, а номер элемента кластера в элементе массива. Конечно, в рамках соответствующей задачи это можно как-то использовать, но отнюдь не в качестве оптимального решения. Ну, и плюсом ко всему row и col не определяются, когда создаём новый элемент массива путём клика на нём. Но, наверно, вы и так в курсе, раз там стоит дополнительное условие на проверку размеров старого и нового массивов.
Так что решение с использованием Determine Clicked Array Element Index VI остаётся по-прежнему универсальным и более оптимальным, чем остальные подходы. Оно работает для всех размещений массивов (один элемент, горизонтальная/вертикальная ориентация), а также даёт возможность узнать о кликах по скроллбарам и индекс-контролу.

Решение №2 поинтереснее в том плане, что получаем именно изменённый элемент массива, а не строку/столбец. И структуру кластера вовсе необязательно забивать константой на БД:
2016-06-28_23-20-53.jpg
2016-06-28_23-20-53.jpg (28.29 КБ) 13310 просмотров
Однако в каких-то приложениях это будет уместно, в каких-то - не очень. А чтобы определить индекс элемента массива, нужно выполнять поиск этого изменённого элемента в массиве. Если элементы не уникальные, то такой подход провалится (получим не тот индекс). Кроме прочего, у вас там событие Mouse Down? обрабатывается, уместнее было бы загнать код в Value Change, чтоб получить текущий (а не предыдущий) элемент массива, ну и клавиши тоже обработать.
Аватара пользователя
Kosist

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

Re: Многоуровневый ComboBox

Сообщение Kosist »

Решение с ActiveX компонентом интерестное, но как по мне, то проще делать так, как в примере с NI форума показано - легче сделать, и понятней...
Правда, можно немного по-другому симулировать клик ПКМ - http://digital.ni.com/public.nsf/allkb/ ... 60000E272C, и в итоге можно сделать что-то вроде этого примера (то же по идее http://forums.ni.com/t5/LabVIEW/How-to- ... d-p/506356, но при помощи dll, что все-таки не так хорошо, как нативные свойтсва Event Structure).

Интерестно, dadreamer, а Вам случайно не попадалось что-то, что позволяет создать дерево каталогов, как, например, в AIMP? (скрин прилагаю). Когда-то искал, пару год назад, но ничего не нашел. Но, честно говоря, в сторону .NET и ActiveX даже не смотрел тогда...
Screenshot 2016-06-29 18.11.55.png
Вложения
Menu.vi
(16.26 КБ) 174 скачивания
Мы делили апельсин - много наших полегло...
Ответить

Вернуться в «Общие»