LabVIEW中不支持多窗口(MDI),多个运行的VI各自具有自己的单独窗口(前面板)。子面板的出现在一定程度上解决了多窗口的问题。字面版属于容器型控件,在子面板中,可以插入其他VI的前面板,传入部分不包括菜单栏,标题栏等。
首先在前面板中,布置一个子面板控件,调整至合适的位置和大小,此时在程序框图中会自动出翔子面板的“插入VI”方法。子面板本身只有“插入VI”和“删除VI”这两个方法。调用“插入VI”方法后,插入VI的前面板将被加载到子面板中,一直到主VI推出或者使用"删除VI"方法,才能卸载子面板中的VI。
注意,"删除VI"方法只是卸载子面板中插入的VI,不一定从内存中卸载该VI。只在没有其他引用指向该VI时,才会从内存中彻底卸载它。
另一个需要注意的问题是,插入VI必须保证不能打开前面版。已经打开前面板的VI,在被插入子面板时会产生错误。
使用三种不同的方式,演示在子面板中如何插入VI。三种方式插入的效果时相同的。这三种方式分别是"动态调用方式","异步调用方式"和"静态调用方式"。
1.动态调用VI插入子面板
运行动态调用VI后,利用子面板的”插入VI方法“,将其插入子面板中。这是子面板最常见的应用方式。
首先创建一个"动态调用"子VI,该VI负责启动运行三个插入VI,并返回这三个VI的引用数组,供"插入VI"方法使用。
必须注意与常规的动态调用不同,一定不要显示插入VI的前面板。
子面板主VI非常简单。前面板中的枚举控件用于选择插入子面板的VI,在插入一个新VI之前,首先调用"删除VI"方法,然后利用"插入VI"方法,在子面板中显示插入VI的前面板。推出子VI时,循环调用”中止VI“方法,结束所有插入VI。
2.异步调用VI插入子面板
异步调用时LabVIEW新增功能,对于不需要显示前面版的插入VI,异步调用更为方便。异步调用VI,要求调用的子VI具有相同的类型,也就是有相同的连线版。
异步调用与严格类型的VI动态调用非常类型,但是存在本质区别。严格类型的VI动态调用必须等VI运行结束后,才能返回主调VI。异步调用不必等待调用的VI结束,它启动一个单独运行的异步任务,类似于一般的动态调用,但是异步调用运行从连线版输入运行的初始数据。
异步调用VI的程序框图与子面板调用VI的程序框图相差不多
3.并行的静态调用VI插入子面板
虽然在多数情况下,插入子面板的VI都是动态调用或者异步调用的。但是某些情况下,并行的静态调用VI也是可以插入子面板的。比如静态调用的并行VI偶尔需要显示前面板,做一些参数的调整。
并行的静态调用VI是不能通过"中止VI"方法结束运行的。只能通过全局变量,队列,通知器等发送消息让并行的VI自己结束运行。
另外,对于插入子面板的VI,需要获得它的引用。由于是静态调用,所有获取引用的方式与静态调用是不同的。
主VI与插入VI之间的数据交换与动态调用VI的方式相同。可以通过引用,设置控件值,全局变量,队列,通知器,以及用户事件等进行数据交换。
4.在多个子面板中插入相同VI
动态调用的VI,如果被设置为可重入方式,则当它被多次调用时,可以自动为他们分配各自的内存空间,对于动态调用VI,可以通过模板或者将VI设置为可重入的方式,实现同一VI的多次调用,但是插入到子面板的VI,只能通过模板方式多次调用。
必须将插入VI存储为VIT格式。
5.判断VI是否插入子面板
子面板仅仅提供了两个方法和几个属性,因此很难对子面板进行控制,如果一个VI的前面版以及打开,那么是不能将它加载到子面板的。通过VI的方法和属性节点,很容易判断VI的前面板是否打开,但是无法判断VI是否以及被加载到子面板中。
一个加载到字面版中的VI,它的前面板的”可调整大小“属性会自动被设置为只读状态。因此,我们可以通过前面板的”可调整大小“属性来间接判断VI是否被加载到子面板中。当然,这么做的前提是VI的可调整大小属性预先被设置为可改变。判断VI是否被加载到子面板中的程序框图
5.子面板的属性
子面板具有"容器边界"和”透明“属性,通过”容器边界“属性可以调整子面板的大小。同时设置水平,垂直滚动条的显示方式。
该例子使用了OpenG中的”矩阵大小“函数,该函数通过矩阵的左上角点和右下角点计算出矩阵的宽度和高度。
如果子面板的”透明属性设置为真“,则插入子VI具有与主调VI同样的背景色。如果没有设置为假,则插入子VI保持原有背景色。