2011年3月20日,第一稿
2011年8月10日,第二稿
2011年8月10日,第二稿
6.2 引用——操控对象的钥匙
上一节我们讨论了如何创建应用程序、VI和对象等的属性节点和调用节点,同时也看到了这些节点的丰富程度,当然也非常期待能够在程序设计中使用这些节点。问题是在LabVIEW中如何操控访问这些节点呢?
大概在LabVIEW4.0中,在仪器控制中就使用了属性节点。到LabVIEW5.0属性节点被归结到VI服务器部分,并为许多对象提供了属性节点和调用节点。同时提供了一种对这些节点进行操控的机制,就是通过“引用”来操控访问这些属性节点。
大概在LabVIEW4.0中,在仪器控制中就使用了属性节点。到LabVIEW5.0属性节点被归结到VI服务器部分,并为许多对象提供了属性节点和调用节点。同时提供了一种对这些节点进行操控的机制,就是通过“引用”来操控访问这些属性节点。
6.2.1 引用的基本概念
引用是LabVIEW中的一个非常重要概念,它类似于一个指向对象的指针。这里所说对象的概念比之前对象的概念得到了延伸。LabVIEW中的应用程序、VI和对象等等都应该视为图形化语言中的对象,对象不再单单用来针对控件。也就是说,应用程序、VI和控件等等都可以通过引用来实现操控。
面向对象的Java语言(包括C++)也采用了引用的概念。尽管LabVIEW并不是纯面向对象的语言,但是引用的概念与面向对象的Java语言基本相同,引用都被用来作为操控对象的钥匙,或者说是操控对象的标识符(一种特殊的数据类型)。
需要注意的是:面向对象的编程语言,通过程序设计可以创建新的对象或为对象创建新的属性和方法(不断的完善所创建的对象),并通过引用来操控对象。可是在LabVIEW图形化编程语言中,我们只能通过引用来操控和使用对象所固有的属性和方法。
有人曾这样比喻过[13]:引用和对象之间的关系,就好比电视机(对象)和遥控器(对象的引用)之间的关系一样。只要你手上握有遥控器,便可以控制电视机。若要改变电视机的频道或音量的大小,操纵遥控器即可。实质上,就是通过引用(遥控器)来间接的控制电视机(对象)并改变它的工作状态。如果你想在房间里走来走去,又不想失去对电视机的控制,只需携带遥控器就行,不必背着笨重的电视机。
由于建立了这种引用机制,对象中的许多属性和方法就会被我们在程序设计中得到广泛的应用。而作为图形化语言的提供者NI,只需不断的提供和改进这些对象的属性和方法来提高图形化语言应用程序设计的灵活性和实用性。
面向对象的Java语言(包括C++)也采用了引用的概念。尽管LabVIEW并不是纯面向对象的语言,但是引用的概念与面向对象的Java语言基本相同,引用都被用来作为操控对象的钥匙,或者说是操控对象的标识符(一种特殊的数据类型)。
需要注意的是:面向对象的编程语言,通过程序设计可以创建新的对象或为对象创建新的属性和方法(不断的完善所创建的对象),并通过引用来操控对象。可是在LabVIEW图形化编程语言中,我们只能通过引用来操控和使用对象所固有的属性和方法。
有人曾这样比喻过[13]:引用和对象之间的关系,就好比电视机(对象)和遥控器(对象的引用)之间的关系一样。只要你手上握有遥控器,便可以控制电视机。若要改变电视机的频道或音量的大小,操纵遥控器即可。实质上,就是通过引用(遥控器)来间接的控制电视机(对象)并改变它的工作状态。如果你想在房间里走来走去,又不想失去对电视机的控制,只需携带遥控器就行,不必背着笨重的电视机。
由于建立了这种引用机制,对象中的许多属性和方法就会被我们在程序设计中得到广泛的应用。而作为图形化语言的提供者NI,只需不断的提供和改进这些对象的属性和方法来提高图形化语言应用程序设计的灵活性和实用性。
6.2.2 获得引用的方法之一:创建
如何获得操控对象的钥匙,也就是如何获得对象的引用。其实,获得引用的方法之一就是创建。
创建的基本概念是:所要操控的对象必须存在于当前的程序中,否则不可创建引用。
创建的具体操作是:在程序框图上,鼠标右键空白区,在弹出的快捷菜单中选择:
》函数
》编程
》应用程序控制
》VI服务器引用
它实际上是一个图形化的通用引用,并没有指向任何对象。参见下图。
创建的基本概念是:所要操控的对象必须存在于当前的程序中,否则不可创建引用。
创建的具体操作是:在程序框图上,鼠标右键空白区,在弹出的快捷菜单中选择:
》函数
》编程
》应用程序控制
》VI服务器引用
它实际上是一个图形化的通用引用,并没有指向任何对象。参见下图。
将VI服务器引用拖拽到前面板上,它变成一个指向对象的引用(实例化),它的默认状态是:本VI。参见下图。
这里请注意:因为本VI是已经存在的,所以我们可以通过创建获得它的引用。当然通过快捷菜单还可以选择设定为其它对象的引用,参见上图。比如也可以选择:本应用程序的引用或窗格中其它控件的引用,参见下图中的具体引用实例。需要注意的是:这些对象必须真正的存在(关于非实例化的引用句柄后面我们会谈到)。
当控件作为对象时,它的引用更容易创建,鼠标右键点击程序框图或前面板上的控件,在弹出的快捷菜单中选择:
》创建
》引用
即可创建一个控件的引用(参见上图中的“数字”引用)。
现在,有了对象的引用就可以通过引用来操控不同的对象了。参看下面的例子。
》创建
》引用
即可创建一个控件的引用(参见上图中的“数字”引用)。
现在,有了对象的引用就可以通过引用来操控不同的对象了。参看下面的例子。
例6-3 查看本应用程序的多个属性
利用本应用称序引用查看本应用程序的多个属性,程序参见下图。
通过这些属性节点看到我们所使用的操作系统、多核处理器的数量等一些系统特性。
6.2.3 获得引用的方法之二:打开与关闭引用
我们上面所谈的对象都是已经存在当前程序中的对象,所以可以通过创建的方法来获得这些对象的引用。还有一些对象并没有存在于当前的程序中,获得它们的引用的方法就是采用打开xx引用的函数,包括打开应用程序引用和打开VI引用。具体操作是:在程序框图中,鼠标右键单击空白处,在弹出的快捷菜单中选择:
》函数
》编程
》应用程序控制
》打开应用程序引用或打开VI引用,并拖拽到程序框图中,参见下图。
》函数
》编程
》应用程序控制
》打开应用程序引用或打开VI引用,并拖拽到程序框图中,参见下图。
关于打开应用程序引用和打开VI引用的具体应用实例后面我们会谈到。
如果我们打开了应用程序或VI的引用,使用后必须关掉该引用。关闭该引用的方法是使用“关闭引用”函数。具体操作是:在程序框图中鼠标右键单击空白处,在弹出的菜单中选择:
》函数
》编程
》应用程序控制
》关闭引用
将关闭引用函数拖拽到程序框图中即可。
打开引用完成对应节点的操作后,关闭该引用是一个良好的编程习惯。这样可以避免内存的泄露和浪费更多的系统资源。
对于前面谈到的那些所创建的引用,我个人理解是无须关闭的,似乎LabVIEW将会自动关闭这些引用。比如VI关闭后,这些引用随着对象的消亡会自动消亡,VI导入后会自动获得这些引用。许多NI所提供的例程也都是这样使用的。
对于打开的引用一定要注意进行关闭操作。
下面我们看一个打开应用程序引用的实际应用例子,参见下图。
如果我们打开了应用程序或VI的引用,使用后必须关掉该引用。关闭该引用的方法是使用“关闭引用”函数。具体操作是:在程序框图中鼠标右键单击空白处,在弹出的菜单中选择:
》函数
》编程
》应用程序控制
》关闭引用
将关闭引用函数拖拽到程序框图中即可。
打开引用完成对应节点的操作后,关闭该引用是一个良好的编程习惯。这样可以避免内存的泄露和浪费更多的系统资源。
对于前面谈到的那些所创建的引用,我个人理解是无须关闭的,似乎LabVIEW将会自动关闭这些引用。比如VI关闭后,这些引用随着对象的消亡会自动消亡,VI导入后会自动获得这些引用。许多NI所提供的例程也都是这样使用的。
对于打开的引用一定要注意进行关闭操作。
下面我们看一个打开应用程序引用的实际应用例子,参见下图。
在这个例子中我们应该注意到,如果输入空字符串,该函数将打开本应用程序的引用。下图中的操作可以给出证明。
6.2.4 引用句柄
上面我们通过两种方法获得了对象的引用。在图形化程序设计中,仅有这些方法还是不够的。比如我们有一个主VI的程序,其界面上有一个字符串显示控件,我们需要对字符串文本进行一些设置,通过属性节点可以实现这些操控,参见下图。
这样的程序代码给我们带来了很多麻烦,至少是占用程序框图中的很大面积。当然我们可以将这部分代码转换成一个子VI,减少占用面积、简化程序代码。创建的子VI命名为:字体设置.vi。参见下图。
在字体设置.vi中我们看到使用了一个引用句柄(字符串)。在主VI中看到了对象的引用代替了引用句柄的使用方法。
引用句柄是一组控件(程序框图上是引用句柄端子),它包括了很多的对象。在前面板上,鼠标右击空白处,在弹出的快捷菜单中选择:
》控件
》新式(经典)
》引用句柄
参见下图。
引用句柄是一组控件(程序框图上是引用句柄端子),它包括了很多的对象。在前面板上,鼠标右击空白处,在弹出的快捷菜单中选择:
》控件
》新式(经典)
》引用句柄
参见下图。
引用句柄主要用来引导VI之间的引用传递(传引用),它的功能实际上满足了VI层次化、模块化设计的需求。
引用句柄本身并没有什么实际作用,只起到了引用标识符的作用,包括程序框图中引用句柄的端子。引用句柄最终只有被实例化后,才能真正称为引用。所以,引用句柄也可以称为:非实例化的引用。
下面我们就围绕LabVIEW中三个最终要的对象(应用程序、VI、控件)来说明引用的实际应用。
引用句柄本身并没有什么实际作用,只起到了引用标识符的作用,包括程序框图中引用句柄的端子。引用句柄最终只有被实例化后,才能真正称为引用。所以,引用句柄也可以称为:非实例化的引用。
下面我们就围绕LabVIEW中三个最终要的对象(应用程序、VI、控件)来说明引用的实际应用。













