Многоуровневый ComboBox
-
- user
- Сообщения: 93
- Зарегистрирован: 05 июн 2013, 08:58
- Версия LabVIEW: 13
- Контактная информация:
Многоуровневый ComboBox
Подскажите возможно ли сделать многоуровневый ComboBox такой структуры
1
_1.1
_1.2
2
3
_3.1
и т.д.
1
_1.1
_1.2
2
3
_3.1
и т.д.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Многоуровневый ComboBox
Это дерево (Tree) получается:mixail_ писал(а):Подскажите возможно ли сделать многоуровневый ComboBox такой структуры
https://decibel.ni.com/content/docs/DOC-18526
https://decibel.ni.com/content/docs/DOC-7248
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Многоуровневый ComboBox
Это больше на "меню" похожеmixail_ писал(а):IvanLis, не совсем то что нужно
я имел в виду вот такое:
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- user
- Сообщения: 93
- Зарегистрирован: 05 июн 2013, 08:58
- Версия LabVIEW: 13
- Контактная информация:
Re: Многоуровневый ComboBox
IvanLis, да Вы правы, нашел решение http://forums.ni.com/t5/LabVIEW/How-to- ... d-p/506356
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Такое выпадающее меню и в текстовых языках редко встречается (и используется), больше всё-таки это уместно в веб-дизайне. Вот тут предложено решение через .NET, если изрядно повозиться, то можно создать такое меню, которое будет выглядеть, как на картинке. Есть ещё кое какие shareware-компоненты, импортируемые в посредством ActiveX/.NET-интерфейса. Например, вот: ctxDropMenu и Exontrol eXContextMenu (у последнего заявлена даже поддержка , однако оба не бесплатны, хотя в триал-режиме можно юзать).
Второй как-то так выглядит: Первый не стал пока проверять...
Второй как-то так выглядит: Первый не стал пока проверять...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Поигрался более детально с eXContextMenu, какое-то оно глючное оказалось, всё время перескакивало в верхний левый угол экрана. Может, это как-то и настраивается, но я в упор не нашёл. Зато на том же сайте есть компонент чуть попроще: ExPopupMenu (тоже триал, но вполне функционален, из минусов - только ссылка на сайт в контекстном меню). Для решения сабжа вполне подходит, потому опишу здесь работу с ним.
После скачивания и установки в новом файле на лицевой панели размещаем .NET & ActiveX -> ActiveX Container: Далее жмём ПКМ на контейнере -> Insert ActiveX Object -> ExPopupMenu ActiveX Control в появившемся окне. Контейнер превратился в прозрачный контрол. Нужно нажать на нём ПКМ -> Popup Menu -> Properties. Появится редактор всплывающего контекстного меню: В нём всё крайне просто и интуитивно понятно. Поле "Item" - текст элемента меню, "ID" - уникальный идентификатор. Для того, чтобы создать вложенный пункт, нужно поставить галочку "Popup". С остальным сейчас можно даже не разбираться.
На БД находится настроенный контрол контекстного меню. Чтобы меню появилось при запуске программы, можно использовать метод Show: Или свойство ShowAtCursor: На выходе функции/свойства будет ID выбранного пункта меню или 0, если пункт не выбран. Выглядит это вот так: Теперь можно попробовать решить проблему из темы http://www.labviewportal.org/viewtopic.php?f=35&t=6999 . Сразу скажу, что решение до конца довести довольно сложно, и в примере только частичное решение проблемы.
Что нужно сделать: popup-меню забиваем нужными элементами, в Ring'е прописываем те же самые элементы (в Items имена, в Values - ID из меню). Пустые элементы, содержащие внутри под-элементы, прописывать не надо: Ring помещаем в кластер, делаем Enabled State у Ring'а = Disabled (вместо встроенного списка LV будет выпадать наше меню). Теперь событие нажатия мышью на Ring'е можно обработать вот так: Выглядит всё это как-то так: Если же теперь поместить кластер в массив, то ситуация намного усложняется. У массива можно обработать событие нажатия мышью, но у вложенных в массив элементов нажатие в Event'е не обрабатывается. Поэтому придётся анализировать координаты массива, элементов массива, их геометрические размеры, и определять, есть или нет попадание мышью в массив и какой индекс у элемента, куда произошло попадание: И то такой алгоритм работает лишь для растянутого вертикально массива. При сжатом до одного элемента массиве можно использовать свойство Index Values[0] - это будет индексом текущего элемента (по которому щёлкнули мышью). Для растянутого горизонтально массива нужно городить ещё одну ветку анализа координат. Можно сказать, что задача решается, нужно только время. Тем же способом можно оформить и решение с форума NI, я специально взял вариант посложнее.
После скачивания и установки в новом файле на лицевой панели размещаем .NET & ActiveX -> ActiveX Container: Далее жмём ПКМ на контейнере -> Insert ActiveX Object -> ExPopupMenu ActiveX Control в появившемся окне. Контейнер превратился в прозрачный контрол. Нужно нажать на нём ПКМ -> Popup Menu -> Properties. Появится редактор всплывающего контекстного меню: В нём всё крайне просто и интуитивно понятно. Поле "Item" - текст элемента меню, "ID" - уникальный идентификатор. Для того, чтобы создать вложенный пункт, нужно поставить галочку "Popup". С остальным сейчас можно даже не разбираться.
На БД находится настроенный контрол контекстного меню. Чтобы меню появилось при запуске программы, можно использовать метод Show: Или свойство ShowAtCursor: На выходе функции/свойства будет ID выбранного пункта меню или 0, если пункт не выбран. Выглядит это вот так: Теперь можно попробовать решить проблему из темы http://www.labviewportal.org/viewtopic.php?f=35&t=6999 . Сразу скажу, что решение до конца довести довольно сложно, и в примере только частичное решение проблемы.
Что нужно сделать: popup-меню забиваем нужными элементами, в Ring'е прописываем те же самые элементы (в Items имена, в Values - ID из меню). Пустые элементы, содержащие внутри под-элементы, прописывать не надо: Ring помещаем в кластер, делаем Enabled State у Ring'а = Disabled (вместо встроенного списка LV будет выпадать наше меню). Теперь событие нажатия мышью на Ring'е можно обработать вот так: Выглядит всё это как-то так: Если же теперь поместить кластер в массив, то ситуация намного усложняется. У массива можно обработать событие нажатия мышью, но у вложенных в массив элементов нажатие в Event'е не обрабатывается. Поэтому придётся анализировать координаты массива, элементов массива, их геометрические размеры, и определять, есть или нет попадание мышью в массив и какой индекс у элемента, куда произошло попадание: И то такой алгоритм работает лишь для растянутого вертикально массива. При сжатом до одного элемента массиве можно использовать свойство Index Values[0] - это будет индексом текущего элемента (по которому щёлкнули мышью). Для растянутого горизонтально массива нужно городить ещё одну ветку анализа координат. Можно сказать, что задача решается, нужно только время. Тем же способом можно оформить и решение с форума NI, я специально взял вариант посложнее.
- Вложения
-
- Popup Menu.vi
- LV2011
- (26 КБ) 252 скачивания
-
Pavel Krivozubov
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Спасибо, тема в разделе "Скачать"
http://www.labviewportal.org/ru/licevaj ... 7-09-44-47
http://www.labviewportal.org/ru/licevaj ... 7-09-44-47
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Оказывается, для определения индекса элемента в массиве, по которому щёлкнули мышью, уже есть готовый : https://decibel.ni.com/content/docs/DOC-22434 . С массивами кластеров работает отлично.
-
- user
- Сообщения: 93
- Зарегистрирован: 05 июн 2013, 08:58
- Версия LabVIEW: 13
- Контактная информация:
Re: Многоуровневый ComboBox
только если кластер из одного элемента, если добавить еще, то уже не узнать на какой из них кликнули(dadreamer писал(а):Оказывается, для определения индекса элемента в массиве, по которому щёлкнули мышью, уже есть готовый : https://decibel.ni.com/content/docs/DOC-22434 . С массивами кластеров работает отлично.
вот тоже пример с нахождением индекса https://decibel.ni.com/content/docs/DOC-6406
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Индекс элемента массива исправно определяется, только что проверил на массиве, содержащем кластеры из двух списков. Другое дело, что непонятно, на какой список в конкретном кластере нажали. Здесь придётся опять выкручиваться с помощью анализа координат и ширины/высоты контролов.mixail_ писал(а):только если кластер из одного элемента, если добавить еще, то уже не узнать на какой из них кликнули(
Это старый пример, он некорректно работает, если у массива отобразить Index Display. Тот , что выше, работает с большинством массивов (разных типов, с разным графическим оформлением, разной ориентации на панели).mixail_ писал(а):вот тоже пример с нахождением индекса https://decibel.ni.com/content/docs/DOC-6406
-
- interested
- Сообщения: 2
- Зарегистрирован: 26 июн 2016, 20:03
- Версия LabVIEW: 14
- Контактная информация:
Re: Многоуровневый ComboBox
или так, но надо знать структуру кластера
- Вложения
-
- fdsf323234sdfasf.PNG (7.35 КБ) 13433 просмотра
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Многоуровневый ComboBox
lorgen
У вас решение №1 с рядом ограничений, и к тому же своеобразное. Позиция row соответствует индексу элемента массива в строке массива только для массива, сжатого до 1 элемента или растянутого по вертикали. Позиция col определяет не индекс элемента массива в столбце массива, а номер элемента кластера в элементе массива. Конечно, в рамках соответствующей задачи это можно как-то использовать, но отнюдь не в качестве оптимального решения. Ну, и плюсом ко всему row и col не определяются, когда создаём новый элемент массива путём клика на нём. Но, наверно, вы и так в курсе, раз там стоит дополнительное условие на проверку размеров старого и нового массивов.
Так что решение с использованием Determine Clicked Array Element Index VI остаётся по-прежнему универсальным и более оптимальным, чем остальные подходы. Оно работает для всех размещений массивов (один элемент, горизонтальная/вертикальная ориентация), а также даёт возможность узнать о кликах по скроллбарам и индекс-контролу.
Решение №2 поинтереснее в том плане, что получаем именно изменённый элемент массива, а не строку/столбец. И структуру кластера вовсе необязательно забивать константой на БД: Однако в каких-то приложениях это будет уместно, в каких-то - не очень. А чтобы определить индекс элемента массива, нужно выполнять поиск этого изменённого элемента в массиве. Если элементы не уникальные, то такой подход провалится (получим не тот индекс). Кроме прочего, у вас там событие Mouse Down? обрабатывается, уместнее было бы загнать код в Value Change, чтоб получить текущий (а не предыдущий) элемент массива, ну и клавиши тоже обработать.
У вас решение №1 с рядом ограничений, и к тому же своеобразное. Позиция row соответствует индексу элемента массива в строке массива только для массива, сжатого до 1 элемента или растянутого по вертикали. Позиция col определяет не индекс элемента массива в столбце массива, а номер элемента кластера в элементе массива. Конечно, в рамках соответствующей задачи это можно как-то использовать, но отнюдь не в качестве оптимального решения. Ну, и плюсом ко всему row и col не определяются, когда создаём новый элемент массива путём клика на нём. Но, наверно, вы и так в курсе, раз там стоит дополнительное условие на проверку размеров старого и нового массивов.
Так что решение с использованием Determine Clicked Array Element Index VI остаётся по-прежнему универсальным и более оптимальным, чем остальные подходы. Оно работает для всех размещений массивов (один элемент, горизонтальная/вертикальная ориентация), а также даёт возможность узнать о кликах по скроллбарам и индекс-контролу.
Решение №2 поинтереснее в том плане, что получаем именно изменённый элемент массива, а не строку/столбец. И структуру кластера вовсе необязательно забивать константой на БД: Однако в каких-то приложениях это будет уместно, в каких-то - не очень. А чтобы определить индекс элемента массива, нужно выполнять поиск этого изменённого элемента в массиве. Если элементы не уникальные, то такой подход провалится (получим не тот индекс). Кроме прочего, у вас там событие Mouse Down? обрабатывается, уместнее было бы загнать код в Value Change, чтоб получить текущий (а не предыдущий) элемент массива, ну и клавиши тоже обработать.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Многоуровневый ComboBox
Решение с 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 даже не смотрел тогда...
Правда, можно немного по-другому симулировать клик ПКМ - 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 даже не смотрел тогда...
- Вложения
-
- Menu.vi
- (16.26 КБ) 175 скачиваний
Мы делили апельсин - много наших полегло...