Детально не могу сейчас сидеть разбираться, но вот запустил пример по ссылке
https://forums.ni.com/t5/Example-Progra ... -p/3499712 , всё работает нормально, что в отдельном
, что в проекте. На БД только указал путь к
dossier-icone-8759.ico. Кнопкой Stop программа нормально останавливается. Замочков никаких не вижу в структуре проекта.
2016 64 бита.
К самой программе у меня только одна претензия - 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:
Метод работает, но только после остановки главного
! Ну, то есть, можно сделать отдельный
для "освобождения" или организовать динамический вызов главного
, после отработки которого вызывать GC.Collect().
jane_wild писал(а):Как шрифт увеличить или иконки прикрутить?
Со шрифтом довольно-таки просто всё. В
Create Menu.vi нужно добавить на БД .NET-конструктор, в котором выбрать сборку (assembly)
System.Drawing(4.0.0.0), в ней объект
Font, и конструктор объекта с параметрами
String и
Single (чтобы лишний раз не возиться с .NET-объектами).
Вот, и далее подключаете ссылку объекта Font ко входу узла свойства. Только не забудьте где-нибудь потом за'Dispose'ить ссылку объекта Font, иначе может получиться маленькая утечка (либо сразу после вызова узла свойств, либо в конце кода SubVI).
С иконками чуть посложнее, но не очень.
В
Assign Icon.vi есть цикл For, перебирающий самые верхние (родительские) пункты меню. В примере их всего 4, так что цикл крутится от 0 до 3. Для каждого родительского пункта вызывается
DropDownItems, то есть получение ссылок на дочерние пункты, которые в этом пункте содержатся. Для них уже написан код установки иконки (см. кейс во внутреннем цикле For). Вам надо просто взять этот кусочек кода и вставить в разрыв между методом
get_Item и свойством
DropDownItems:
Тогда главным пунктам меню также будут присваиваться иконки. В принципе, ничего сложного. Единственный нюанс - может получиться путаница с путями: какие для основных пунктов, какие для вложенных. Я бы сделал отдельный вход-контрол для основных, отдельный - для вложенных. Если не изощряться особо и не ставить прям для каждого пункта уникальную иконку, то можно обойтись даже двумя обычными Path-контролами вместо двумерного массива. Ну, это на вкус и цвет, в общем.