Skip to main content

运行中改变界面

在程序运行的过程中,常常需要改动其界面。比如改变窗口的标题、改变控件的数值、隐藏控件以及变动控件的位置等。这些操作一般可以通过设置 VI 和控件等的属性来完成。调用节点和属性节点的使用方法非常类似,只是功能不同。下面主要介绍属性节点的用法,但也可引申到调用节点中。

属性节点

本书在数据和控件一节中对控件的属性节点做过简要介绍。如果需要设置同一 VI 上的控件的属性,可以直接在控件的右键菜单中创建它的属性节点。直接创建出来的属性节点与其相关联的控件之间没有数据线相连,但用户通过它们共同的标签就会立即意识到它们之间的关系。

设置控件的属性还可以使用另一种方式:为控件创建一个引用(在控件的右键菜单中选择 "创建 -> 引用"),然后把这个引用与通用的 "属性节点"(位于函数选板 "编程 -> 应用程序控制 -> 属性节点")相连,再选择需要设置的属性(图 6.3)。

图 .3 使用控件的属性节点

用以上两种方式创建的属性节点在功能上是完全相同的。

在界面设计中,经常需要对某些控件的属性进行修改,如隐藏控件、禁用控件、移动控件等,这些操作都可以通过设置控件的属性来完成。

图 6.4 中的程序通过设置 "字符串 3" 控件的 "位置 -> 置顶" 属性来改变这个控件的位置,从而实现让 "字符串 3" 控件的位置随 "移动右侧的控件" 的输入值变化而改变。

图 .4 设置控件位置属性

直接从控件上创建出来的属性节点只能在控件所在的 VI 中使用。倘若需要设置另一个 VI 上的控件属性,就只能使用第二种(创建引用)方法了。比如,需要设置一个控件的多个属性,会在程序框图中占据较大的显示空间。为了让主 VI 的程序框图显得比较整洁,也可以把所有的属性设置放到另外一个子 VI 中去。此时,控件在主 VI 上,属性节点在子 VI 上,就得使用创建引用设置属性的方法了。

另外,有时需要在程序中设置多个控件的同一属性。由控件直接生成的属性节点只能与固定的控件相关联,这就需要为每个控件都生成相同的属性节点。由于通用属性节点可以作用于任何控件,因此可以使用通用属性节点做成的子 VI 来设置所有的控件,以尽可能地重用代码。

VI 的属性

把通用 "属性节点" 从函数选板拖放到 VI 程序框图上时,它默认的被设置为 "应用程序" 类。这时可以从中选取版本号、程序名称等属性。通过属性节点的右键菜单可以让它显示其它类别对象的属性(图 6.5)。

图 .5 让属性节点显示 VI 的属性

如果,我们需要设置 VI 的属性,那么就把属性节点关联的类选为 "VI"。在没有任何引用输入时,这个属性节点中的属性设置都是针对它所在的 VI 的。例如,图 6.6 中的程序可以修改 VI 的标题。

图 .6 修改 VI 标题

如果是设置其它 VI 的属性,就要给属性节点传入一个 VI 的引用。VI 的引用可以通过两种方法得到:静态的和动态的。

使用静态的方法:需要使用 "编程 -> 应用程序控制 -> 静态 VI 引用" 节点(图 6.7)。把这个节点放置在程序框图上,鼠标双击静态引用的图标或选择它的右键菜单 "浏览路径...",可以弹出 "选择需打开的 VI" 提示框。从中选取某一 VI,这个节点即可输出这一 VI 的引用。之所以称其为静态,是因为在编写程序时,就已经指定好了这个引用所指向的 VI。

图 .7 静态方法得到 VI 引用

使用动态的方法:如果是在程序运行中,才能知道需要设置哪个 VI,那么就需要使用 "编程 -> 应用程序控制 -> 打开 VI 引用" 函数来打开一个 VI 的引用(图 6.8)。把 VI 的路径传给这个函数,它就会返回这个 VI 的引用。

图 .8 动态方法得到 VI 引用

得到对象的引用

直接从控件或其它对象生成属性节点的方法,有很多局限性。实际编程过程中,更多的是使用通用属性节点,根据输入引用的类型使用对应的属性。

对象的引用可以直接使用对象的鼠标右键菜单生成,也可以利用属性节点从与其相关的其它对象中得到。比如通过使用属性节点,可以从 VI 的引用得到 VI 的前面板的引用,再从前面板得到前面板上所有控件的引用(图 6.9)。

图 .9 从 VI 得到前面板的所有控件的引用

在实际应用中,更多的情况是需要得到一个 VI 上的某个控件,而不是所有控件。先得到所有的控件,再一一判别它们是否是所需的那个控件,这种方法比较麻烦。实际上,这可以利用 LabVIEW 已有的一个 VI:"[LabVIEW]\resource\importtools\Common\VI Scripting\VI\Front Panel\Method\Get Control.vi" 来实现(图 6.10)。

图 .10 根据标签得到某一控件的引用

有些对象是无法直接为其创建属性节点的,只能通过这种间接的方法来得到该对象的引用。例如,我们无法通过右键菜单来为界面上的修饰物(控件选板 "新式 -> 修饰" 中的对象)创建属性节点,若要设置它的属性,就必须首先得到它所在的 VI 的引用,再得到前面板的引用,然后得到修饰物的引用,最后使用这个引用来设置属性(图 6.11)。(有些系统风格的装饰物,其颜色是由系统设置决定的,不能在程序中改变。)

图 .11 设置修饰物的颜色

对象类的层次结构

VI Scripting 所使用的引用都是指向某一对象的,这些对象可以被分成不同的类型。比如某一个 VI 是属于 VI 类的,某一个控件是属于控件类的,等等。这些类按照通用和特定的关系,可以排出一个如图 2.57 所示的树状的层级关系。

比如界面上有一普通的数字控件,它是属于 "数字" 控件类的,这是一个比较特定的类。它同时也属于 "数值" 类。不过 "数值" 类比 "数字" 控件类更通用,它还包含 "颜色" 控件等其它的对象。而更加通用一些的 "控件" 类则包含了布尔、字符串等各种控件对象。为了表述方便,我们把一个特定的类型叫做子类,把比它通用一级的类型叫做父类。如,"控件" 类是 "数值" 类的父类,而 "数值" 类是 "控件" 类的子类。

在传递对象的引用时,可以把引用设置为对象所属的任何一个类的类型。例如,一个普通的数字控件的引用,既可以是 "数字" 控件类型的;也可以是 "控件" 类型的,还可以是更通用的 "图形对象" 类型的。不同类型的属性节点具有不同的属性。父类具有的属性,子类都具有。但子类还可以具有更多特殊的属性。

当需要设置几个对象共同的属性时,需要使用它们共属的类来表示。它们共属的类是一个更通用的类。

一个对象的引用可以通过使用 "编程 -> 应用程序控制 -> 转换为特定的类" 或 "编程 -> 应用程序控制 -> 转换为通用的类",把这个引用转换成更加通用或更加特定的类型。比如需要得到几个不同控件的标签,它们可以使用同一个 "标签 -> 文本" 属性。为了让它们使用同一个属性节点,需要用具有同样类的引用来表示它们(图 6.12)。

图 .12 使用 "转换为通用的类" 把不同控件的引用都表示为 "控件" 类

某些时候,可能会先得到一个以通用类表示的某对象的引用,如果后续程序需要设置这个对象某些特殊属性,就必须先把这个引用转换为特定的类,才能使用这些特定的属性。

例如:VI 前面板上有一簇控件,簇中有两个元素,第二个元素是一个 LED 灯泡控件,需要程序运行时修改这个灯泡的颜色。簇中的元素可以通过簇的 " 控件 []"属性得到。由于簇中可以包含各种类型的控件,所以" 控件 []"输出的都是以" 控件 "类型表示的各个控件的引用。而" 颜色 "是" 布尔 "类型控件的一个特殊属性,所以,这里需要把得到的" 控件 "引用转换成特定的" 布尔 " 类型,才能设置其颜色属性(图 6.13、图 6.14)。

图 .13 被修改的簇控件

图 .14 修改簇中元素的属性

类浏览器

LabVIEW 提供了一个工具来帮助编程者方便的找到某个类的某个属性或调用节点,这就是 "类浏览器" 工具(图 6.15)。需要打开这个工具时,可以选择菜单中的 "查看 -> 类浏览器"。

图 .15 类浏览器对话框

在类浏览器工具的对话框中选择一个 "VI 服务器" 作为对象库,再选择需要处理的类。它会在 "属性和方法" 列表中列出这个类所有的属性和方法。双击一个条目,就可以把这个属性或方法添加在 VI 的程序框图上。

如果需要查看 LabVIEW 中所有的可以用于 VI Scripting 编程的类及其属性和方法,可以打开 LabVIEW 的帮助文档,在索引中输入 "VI 服务器类的层次结构"(英文 "VI Server Class Hierarchy")即可可按照层次结构查阅到 VI 服务器中每个类所具有的属性、方法以及事件(图 6.16)。

图 .16 在 LabVIEW 帮助文档中查阅 VI 服务器类层次结构