Допустим есть несколько XControl-ов (разных), имеющих одинаковые методы и свойства, можно ли динамически их подгружать при выполнении программы?
Пробовал делать обертку из обычного VI, и загружать в Subpanel, вот только к общему типу не удаетмя refnum-ы привести, чтобы в массив собрать их, например
Динамическая загрузка XControl
-
Chupakabra
- professional
- Сообщения: 360
- Зарегистрирован: 21 янв 2009, 10:50
- Награды: 1
- Версия LabVIEW: 2015
- Откуда: Москва
- Поблагодарили: 4 раза
- Контактная информация:
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Динамическая загрузка XControl
Каждый XControl определяет свой собственный тип в иерархии встроенных объектов LabVIEW. Если хочется пользоваться ссылкой на объект и узлом свойств/методов, то нельзя ли 2 XControls сделать instance одного и того же XControl'а? Т.е. XControl один, все отличия спрятаны в разном содержании Data и State?
Если это неудобно, то я применял где-то такой трюк: желаемая иерархия XControls дублируется в LVOOP.И в массив кладутся два одинаковых объекта базового класса LVOOP. Возможны и более экзотические варианты.
Вообще, иметь несколько непересекающихся иерархий объектов в языке жутко удобно.
Если это неудобно, то я применял где-то такой трюк: желаемая иерархия XControls дублируется в LVOOP.И в массив кладутся два одинаковых объекта базового класса LVOOP. Возможны и более экзотические варианты.
Вообще, иметь несколько непересекающихся иерархий объектов в языке жутко удобно.
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
Chupakabra
- professional
- Сообщения: 360
- Зарегистрирован: 21 янв 2009, 10:50
- Награды: 1
- Версия LabVIEW: 2015
- Откуда: Москва
- Поблагодарили: 4 раза
- Контактная информация:
Re: Динамическая загрузка XControl
LVOOP в связке с XControl сейчас применять не хочу, так как усложняется все сильно для меня, а времени особо на это нет :)
Сейчас немного другим путем пошел, но это не имеет отношение к теме. А вот то, что имеет, попробовал вместо штатного притягивания типа, использовать обычный TypeCast, и о чудо!, заработало. Проверил, метод вызываются свой для каждого XControlа. Чувствую, что это не совсем корректный подход, и где-нибудь он даст ошибку. Например не ясно как поведет себя программа при вызове метода, который есть в одном XControl и нет в другом :) Буду рад если кто-нибудь поэкспериментирует.
Сейчас немного другим путем пошел, но это не имеет отношение к теме. А вот то, что имеет, попробовал вместо штатного притягивания типа, использовать обычный TypeCast, и о чудо!, заработало. Проверил, метод вызываются свой для каждого XControlа. Чувствую, что это не совсем корректный подход, и где-нибудь он даст ошибку. Например не ясно как поведет себя программа при вызове метода, который есть в одном XControl и нет в другом :) Буду рад если кто-нибудь поэкспериментирует.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Динамическая загрузка XControl
Refnum для XControl'а - это 4-х байтное число, которое не меняется при type_cast (который работает похоже на C++ reinterpret_cast).
Так неправильно, я бы сказал, что то, что это сработало для полностью одинаковых методов в одной версии не значит, что сработает в другой. Или в исполняемом файле.
А почему не хотите ;
LabVIEW повиснет на invoke node несуществующего метода (LV2011 - Linux). Более того, если метод имеет одно название, но реализован VI с разным названием,то всё тоже виснет.Chupakabra писал(а):как поведет себя программа при вызове метода, который есть в одном XControl и нет в другом
Согласен. Подобное экспериментирование быстро приводит во внутренне противоречивое состояние....Chupakabra писал(а):Чувствую, что это не совсем корректный подход
Так неправильно, я бы сказал, что то, что это сработало для полностью одинаковых методов в одной версии не значит, что сработает в другой. Или в исполняемом файле.
А почему не хотите ;
без LVOOP.2 XControls сделать instance одного и того же XControl'а? Т.е. XControl один, все отличия спрятаны в разном содержании Data и State?
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
Chupakabra
- professional
- Сообщения: 360
- Зарегистрирован: 21 янв 2009, 10:50
- Награды: 1
- Версия LabVIEW: 2015
- Откуда: Москва
- Поблагодарили: 4 раза
- Контактная информация:
Re: Динамическая загрузка XControl
Правильно ли я понял, использовать единствнный XControl с разным выводом графики? Придется прятать и показывать индикаторы/контролы для разных видов? А что значит разное содержание Data, когда доступен только один терминал для XControl?mzu2006 писал(а): А почему не хотите ;без LVOOP.2 XControls сделать instance одного и того же XControl'а? Т.е. XControl один, все отличия спрятаны в разном содержании Data и State?
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Динамическая загрузка XControl
Я предлагаю использовать 1 тип XControl'а инстанциированный дважды (брошенный на Front Panel). Таким образом содержимое Abilities остается одно и то же, но Data и State отличаются значением(они одного типа). Возможно, где-то в State лежит enum - селектор, что именно он отображает.Chupakabra писал(а):Правильно ли я понял, использовать единствнный XControl с разным выводом графики? Придется прятать и показывать индикаторы/контролы для разных видов?
2 инстанса XControl'а дают 2 терминала. Посмотрите в чём разница между классом и объектом(инстансом, instance) класса. (Например, здесь: http://alfredjava.wordpress.com/2008/07 ... -instance/)Chupakabra писал(а): А что значит разное содержание Data, когда доступен только один терминал для XControl?
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows