Можно ли сформировать нестандартное меню

Простейшие вопросы в области инженерной разработки
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Можно ли сформировать меню

Сообщение AndreyDmitriev »

> https://decibel.ni.com/content/docs/DOC-17642
> https://decibel.ni.com/content/groups/u ... abview-net

Вот спасибо, за ссылки и огород городить не надо (точнее надо, но немного другой).
Я давно искал пример с менюшкой на .net, а оно, оказывается под ногами лежало...

Да, и картинки тоже навскидку работают:
Вложения
!menu.png
Аватара пользователя
Pavel Krivozubov

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

Re: Можно ли сформировать меню

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

Тема интересная, спасибо за поднятие такого вопроса, он может быть полезен многим. Вынес в топ.
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Можно ли сформировать нестандартное меню

Сообщение Михаил23 »

Re: Можно ли сформировать меню

Сообщение Vasa 02 фев 2012, 22:50
.NET menu bar
https://decibel.ni.com/content/docs/DOC-17642
Lv2010
После установки этого тулкита в LV2009. :labview: при запуски стал вылетать с ошибкой. Ставил с помощью прилагаемого exe.
Аватара пользователя
Vasiliy Baev

Activity Gold Bronze
leader
leader
Сообщения: 545
Зарегистрирован: 31 окт 2011, 09:02
Награды: 4
Версия LabVIEW: 2019
Откуда: Санкт-Петербург
Благодарил (а): 8 раз
Поблагодарили: 10 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение Vasiliy Baev »

Михаил23, данный тулкит сделан в десятой версии, возможно отсюда и проблемы.
Аватара пользователя
Михаил23
adviser
adviser
Сообщения: 219
Зарегистрирован: 24 ноя 2008, 17:58
Версия LabVIEW: 2009
Откуда: Москва

Re: Можно ли сформировать нестандартное меню

Сообщение Михаил23 »

Vasa писал(а):Михаил23, данный тулкит сделан в десятой версии, возможно отсюда и проблемы.
Да но в требованиях к нему от 2009 и старше. Вообщем пришлось переустановить :labview: Т.к востановление не помогло. Попробовал просто вручную перенести в user.lib нужные библиотеки. Все работает все запускается. Так что скорее всего все испортил exe, который идет в комплекте для установки. Будьте аккуратны.
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

Всем здравствуйте, решила попробовать в одном своем проекте данное меню. Возникли вопросы: Возможно ли прицепить иконки непосредственно к самому верхнему уровню? (В приведенном примере иконки к словам "First", " Second","Third") Как эти же слова написать более крупным шрифтом? И наверное самый главный вопрос, запускаю проект, проверяю кнопочки, все работает, далее останавливаю.... и останавливаются все запущенные VI за исключением callback в приведенном примере MenuCB2.vi , который продолжает работать, о чем говорят замочки на библиотеках в проекте. К тому же его не остановить кнопкой Abort Execution она просто не активна. Запускаю снова - меню уже не работает. Останавливаю, закрываю весь проект, открываю снова - все работает. Причем если раньше при закрытии проекта с "висячими" VI LabVIEW спрашивала разрешения об остановки запущеных VIs В этом случае ничего не спрашивает, молча закрывает проект и все, такое впечатление что LabVIEW не видит запущенного VI.... В чем может быть проблема? Надоедает при отладке каждый раз закрывать-открывать проект.... Спасибо
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Можно ли сформировать нестандартное меню

Сообщение Blackman »

Посмотрел пример по ссылке. Все работает нормально. Пришлось только откорректировать путь к файлу иконки.

Здесь библиотеки для уведомлений. Может заинтересуют)

Notify Icon Class
https://lavag.org/topic/14060-put-your- ... d-for-all/

Averna Notify Icon - Averna
http://sine.ni.com/nips/cds/view/p/lang/ru/nid/212914
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

Так в том то и дело, что сам по себе он работает. Но стоит добавить его в проект - виснет callback. Причем в скомпилированном виде нареканий нет, все работает. Надоедает просто при отладке закрывать-открывать.
Как шрифт увеличить или иконки прикрутить? На touchscreen трудно пальцем попасть на нужную строчку - мелко все... Имеется ввиду именно меню верхнего уровня, потому как вложенное хоть и шрифт такой же, зато иконки поставила большие - не промахнешся. Спасибо.
Аватара пользователя
dadreamer

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

Re: Можно ли сформировать нестандартное меню

Сообщение dadreamer »

Детально не могу сейчас сидеть разбираться, но вот запустил пример по ссылке https://forums.ni.com/t5/Example-Progra ... -p/3499712 , всё работает нормально, что в отдельном :vi: , что в проекте. На БД только указал путь к dossier-icone-8759.ico. Кнопкой Stop программа нормально останавливается. Замочков никаких не вижу в структуре проекта. :labview: 2016 64 бита.
2017-12-07_13-13-57.jpg
К самой программе у меня только одна претензия - Message Box не стоило запихивать в Callback SubVI, ему там не место. По-хорошему, нужно было создать User Event строкового типа (например) и передать его в Callback, подключив ко входу User Param. Как только наступает событие нажатия пункта меню, в Callback генерится User Event со строкой, содержащей имя пункта меню. В основной программе "ловим" User Events и, если нужно, отображаем на панели. Стандартный подход для .NET событий (даже где-то в примерах от NI есть).
jane_wild писал(а):Но стоит добавить его в проект - виснет callback.
А как он может виснуть? Там же только вывод сообщения на экран. Само-то сообщение появляется? По идее должно. Кроме того, SubVI настроен как клон, т.е. даже при висящем сообщении повторный вызов должен нормально отработать и должна появиться вторая (третья и т.д.) табличка. upd: так в теории, а на практике окошко модальное и не даёт ничего нажать на ФП.

Я заметил, что Callback SubVI после отработки остаётся в состоянии выполнения, хотя сам по себе не выполняется (зарезервирован для выполнения). Его в таком состоянии нельзя редактировать, даже если он не клон. Есть ворк-эраунд для этого: https://forums.ni.com/t5/LabVIEW/net-ev ... -p/3220455 Я не пробовал, но думаю, что это поможет.

upd2:
Метод работает, но только после остановки главного :vi: ! Ну, то есть, можно сделать отдельный :vi: для "освобождения" или организовать динамический вызов главного :vi: , после отработки которого вызывать GC.Collect().
jane_wild писал(а):Как шрифт увеличить или иконки прикрутить?
Со шрифтом довольно-таки просто всё. В Create Menu.vi нужно добавить на БД .NET-конструктор, в котором выбрать сборку (assembly) System.Drawing(4.0.0.0), в ней объект Font, и конструктор объекта с параметрами String и Single (чтобы лишний раз не возиться с .NET-объектами).
2017-12-07_13-15-38.jpg
Вот, и далее подключаете ссылку объекта Font ко входу узла свойства. Только не забудьте где-нибудь потом за'Dispose'ить ссылку объекта Font, иначе может получиться маленькая утечка (либо сразу после вызова узла свойств, либо в конце кода SubVI).

С иконками чуть посложнее, но не очень. :wink: В Assign Icon.vi есть цикл For, перебирающий самые верхние (родительские) пункты меню. В примере их всего 4, так что цикл крутится от 0 до 3. Для каждого родительского пункта вызывается DropDownItems, то есть получение ссылок на дочерние пункты, которые в этом пункте содержатся. Для них уже написан код установки иконки (см. кейс во внутреннем цикле For). Вам надо просто взять этот кусочек кода и вставить в разрыв между методом get_Item и свойством DropDownItems:
2017-12-07_13-21-13.jpg
Тогда главным пунктам меню также будут присваиваться иконки. В принципе, ничего сложного. Единственный нюанс - может получиться путаница с путями: какие для основных пунктов, какие для вложенных. Я бы сделал отдельный вход-контрол для основных, отдельный - для вложенных. Если не изощряться особо и не ставить прям для каждого пункта уникальную иконку, то можно обойтись даже двумя обычными Path-контролами вместо двумерного массива. Ну, это на вкус и цвет, в общем.
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

Я заметил, что Callback SubVI после отработки остаётся в состоянии выполнения, хотя сам по себе не выполняется (зарезервирован для выполнения). Его в таком состоянии нельзя редактировать, даже если он не клон. Есть ворк-эраунд для этого: https://forums.ni.com/t5/LabVIEW/net-ev ... -p/3220455 Я не пробовал, но думаю, что это поможет.
Я видимо путанно объяснила, именно такое поведение я и наблюдаю. Пункты меню работают, я в callback передаю ссылку на очередь, используя user parameters, и case структурой, определив какой пункт меню был выбран, посылаю сообщения главной программе.

К сожалению приведенное выше решение (метод GC.Collect()) в LV2016 -32, в котором создан мой проект не работает. Что нужно подавать на вход умомянутого метода
CG_Collect.png
CG_Collect.png (4.51 КБ) 12573 просмотра
В остальном все просто супер! Шрифт большой и главное меню с иконками. Спасибо за развернутое объяснение.
Аватара пользователя
dadreamer

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

Re: Можно ли сформировать нестандартное меню

Сообщение dadreamer »

jane_wild писал(а):К сожалению приведенное выше решение (метод GC.Collect()) в LV2016 -32, в котором создан мой проект не работает. Что нужно подавать на вход умомянутого метода
CG_Collect.png
1. Помещаете на БД .NET Invoke Node
2. ПКМ по узлу -> Select Class -> .NET -> Browse
3. Assembly - mscorlib(4.0.0.0), группа объектов - System, объект - GC
4. Нажимаете ОК в окошке
5. ПКМ по узлу -> Select Method -> [ S ]Collect()
6. Всё, можно использовать
Правда, не знаю, что проще - запускать каждый раз отдельный :vi: с этим методом после отработки основной проги или просто перезапускать :labview: . Тем более что в экзешнике всё нормально работает. Ну, может, вы какую-то хитрую архитектуру придумаете для этого :dntknw:
Последний раз редактировалось dadreamer 19 апр 2021, 20:47, всего редактировалось 1 раз.
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

1. Помещаете на БД .NET Invoke Node
2. ПКМ по узлу -> Select Class -> .NET -> Browse
3. Assembly - mscorlib(4.0.0.0), группа объектов - System, объект - GC
4. Нажимаете ОК в окошке
5. ПКМ по узлу -> Select Method -> Collect()
6. Всё, можно использовать


Так я все выше описанное Вами проделала. Замочки на библиотеках, проподают. Но после запуска проекта меню не выпадает, сколько ни жмякай на кнопочку. Закрыла-Открыла проект все снова работает (LabVIEW не обязательно перезапускать). Ну и черт с ним, буду перезапускать проект, уже мало что осталось доделать. Спасибо
Аватара пользователя
dadreamer

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

Re: Можно ли сформировать нестандартное меню

Сообщение dadreamer »

jane_wild писал(а):Замочки на библиотеках
Это как-то странно. Я уже говорил, что не вижу никаких замков. Проверил сейчас на :labview: 2017 64-bit. Единственные файлы, на которых появляются замки - две либы NI_*.lvlib в папке vi.lib. И всё. Может, вы как-то не так добавили файлы в проект и они лочатся. Попробуйте открыть Example.vi и после этого создать чистый проект. :labview: спросит, надо ли добавлять - добавьте. Я так проект делал, всё ок.
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

Согласна, что странно. Как то не полностью освобождаюстя ресурсы
Вот так выклядят кусочек окна проекта после остановки программы. Несмотря на замочки, можно редактировать любые VI за исключением callback
Lock.png
Lock.png (5.01 КБ) 12557 просмотров
Вот так, после запуска Collect.vi (в котором единственный метод CG.Collect) Замочки пропадают и можно редактировать все, включая callback
UnLock.png
UnLock.png (5.47 КБ) 12557 просмотров
Но при повторном запуске всего проекта StartUp-ом Все запускается и работает, только strip Menu не выпадает. Жму на кнопку и ничего не происходит. Закрыла - Открыла проект - все гуд.
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Можно ли сформировать нестандартное меню

Сообщение jane_wild »

Разобралась. Всему виной оказалось вот это свойство
Height.png
Height.png (1.71 КБ) 12549 просмотров
Оно используется в цикле for, для плавного выдвигания - задвигания меню. Так вот, при первом открытии проекта и его последующем запуске, меню имеет размеры, в данном случае высота, установленные при проектировании, скажем 80 пикселей. Далее инициализируется меню и прячется подачей нуля на вход упомянутого метода. При нажатии на кнопочку, циклом for, добавляя по 10 пикселей к высоте, начиная с нуля, меню выдвигается. После выбора необходимого подпункта, оно снова задвигается. Закрывая программу меню спрятано и его высота равна нулю. При повторном запуске, LabVIEW "помнит" этот ноль, меню проходит всю инициализацию без ошибок, но оно просто не показывается, хотя его размер по высоте и устанавливается в положенные 80 пикселей. Вот.
Проблему решила простой подачей 80 на свойство Height, при выходе из программы. Всем спасибо.
Ответить

Вернуться в «Для чайников»