- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
Tree控件的使用
本节将重点讨论LabVIEW中的Tree控件,也许是控件本身的使用比较“麻烦”,导致很多程序员不愿意使用该控件。其实在大多数的应用程序中均可以看到Tree的身影,如Windows操作系统中的“资源管理器”左侧的文件列表,通常Tree控件可以用来显示一些有组织的、分类明确的数据。
1.1编辑Tree控件的外观
Tree控件位于LV的控件选板“List&Table”子选板中,如图 1所示。从背面板可以看出Tree实质上是一种字符串(String)类型,这难免会让人费解:如何将前面板大量的“条理性的数据”与String对应呢?
图 1 Tree控件
选择工具选板中的Edit Text工具,可以直接在Tree控件中输入数据。
- 通过Tree控件的右键快捷菜单Visible Items菜单项,可以改变Tree控件的显示外观,如图 2所示。可以逐一勾选/不勾选该菜单项中的菜单,就明确了各个菜单项对应的含义。
图 2 改变Tree控件的显示外观
- 在Visible Items中有一个Symbols菜单项,从外观上看勾选或不勾选该选项没有什么区别。原来,LabVIEW允许对Tree中的每一行指定一个符号,显示在行首。要显示该符号首先需要勾选Visible Items→Symbols选项,其次在某一行上右击弹出的快捷菜单上选择Item Symbol菜单项,并选择一个符号。如图 3所示。LabVIEW提供了42种符号可供选择,其中第1种为空(默认值,因此前面在勾选Visible Items→Symbols后看不到变化)。可以通过该方式为每一行添加各种不同的符号。
图 3 选择Symbol
- 在Windows资源管理器中,我们可以看到Tree是能够显示层级关系的。这一点可以通过选择右键快捷菜单中的Indent Item和Outdent Item实现,在第图中的3行上右击选择Indent Item,则第3行变成了第2行的子行,如图 4所示。此时,LabVIEW会自动添加一个“+”或“—”符号,如同Windows资源管理器中显示的一样。程序员可以通过选择快捷菜单中的Expand/Contract Symbol Type选项来改变该符号的显示样式。
图 4 改变Tree控件的层次关系
- 那么LabVIEW究竟如果把Tree控件上显示的诸多字符串表示在底层函数面板中呢?我们可以尝试使用一个String显示件验证Tree控件的输出,其前面板和背面板如图 5所示。运行该VI,并且选择Tree的不同行(随着选择的不同,被选中的行会以蓝色高亮显示,比如图中的第3行),观察String显示件中的值。可以得到Tree控件的输出好像是每一行的首列字符串,但是第4行的输出却是A_1,这是一个从来没有输入过的值。
图 5 测试Tree控件的输出字符串
选择Tree右键快捷菜单中的Edit Item…菜单项,将弹出如图 6所示的对话框。对话框的左侧是Tree控件显示的内容,改变控件的选择,可以看出右侧的Tag会随之改变,并且第4行的Tag值正好是A_1。原来Tree控件为每一行自动分配了一个唯一的Tag值(该值可以在Edit Item对话框中修改,但是必须确保唯一性和非空性),其输出则是当前选中行的Tag值。我们可以尝试将第4行的Tag值强行修改为A,此时LabVIEW将会以红色背景显示Tag值,表示该Tag值重复,无法正常使用(也就是说Tree控件中每一行的Tag值必须是唯一并且非空的)。 [p]
图 6 Edit Tree Items对话框
1.2Tree控件对应的事件
在背面板上放置一个事件结构,并且选择Tree控件,可以看到其对应的所有事件,如图 7所示。本节只介绍一些特殊的Tree事件。
图 7 Tree控件的事件
- Edit Cell事件
该事件与multicolum listbox中的Edit Cell事件一样,当用户编辑控件中的内容时被触发。分为Edit Cell消息型事件和Edit Cell
过滤型事件,后者可以根据程序员的设计取消掉该事件。
如程序运行时只允许用户修改Tree控件第1列的值,而不允许修改其他列的值。可以使用Edit Cell
过滤型事件实现该功能,具体如图 8所示。要允许用户在程序运行时编辑Tree控件的值需要首先勾选Tree控件右键快捷菜单中的Editable Cells菜单项,然后运行该程序,在需要修改的单元格中单击并输入响应的字符。可以看出除了修改第1列的值以外,对其它列的修改都不会成功。
也可以把本例延伸一下,比如只允许用户输入特定的字符串(大写字母,数字等),应该如何处理呢?
图 8 Tree控件的Edit Cell
过滤型事件
- Double Click事件
从名称可以看出,该事件在用户双击Tree控件时被触发,如图 9所示。图中事件数据节点中的Tag表示用户双击了哪一行,但是是否有一种方式明确了用户到底双击了Tree控件中的哪一个区域呢,具体为哪一行哪一列呢?显然左侧的Coords表示双击的坐标值,我们可以通过Tree控件的“Point To Row Column”方法(Create→Invoke Node)将Coords坐标值转化为具体的行和列值。此外,如何表示用户双击了Tree控件的行头和列头呢?具体可以参考LabVIEW中关于“Point To Row Column”方法的帮助文档。
图 9 Tree控件的Double Click过滤型事件
- Item Close和Item Open事件
这两个事件是对立的,分别具有一个消息型事件和一个过滤型事件。它们是在用户展开或收缩某一个父层次项时被触发的,如上述Tree控件中的第2行,当展开或收缩该行时会触发该事件(可以通过单击该行左侧的“+”和“—”符号或者双击该行实现展开和收缩操作)。
如果不希望用户收缩Tree控件的第2行,可以使用如图 10所示的代码。运行该VI,可以看出,无论用户如何单击Tree控件第2行左侧的“—”符号,都不会收缩该行。
图 10 Tree控件的Item Close过滤型事件
1.3Tree控件对应的属性
Tree控件的属性众多,如图 11所示,主要是为了动态地改变Tree控件的属性(利用程序修改)。绝大部分的属性与multicolum listbox类似,本节只介绍几个典型的属性节点,重在说明Tree属性节点的使用方法。 [p]
[p]
图 17 Edit Tree Items方法
假如需要给图 18左侧的Tree控件增加一个结点,使之变成右侧的Tree控件,则可以使用Edit Tree Items. Add Item方法。
图 18 增加一个结点(Item项)
图 19所示为增加结点的源代码,其中Parent Tag为B,表示B是待插入项的父结点,如果待插入结点没有父结点则设置为空就可以了。Child Position表示待插入项是第几个子项,很明显应该填入1。Left Cell String是待插入项第1列的字符串。Child Text是一个数组,表示待插入项第2列之后的所有字符串。Child Tag是待插入项的Tag值,不能设置为空或者与其它的Tag值相同。
图 19 增加一个结点(Item项)源代码
1.4.4自定义Tree结点的符号
在Custom Item Symbols方法中,可以动态设置或者自定义结点的符号。如前面所述,LabVIEW共提供了42种内置的符号,每一个符号从上之下从左至右有一个唯一的Index号(从0开始)。
如果需要给图 18中新加入的F结点增加一个自定义的符号,可以使用图 20所示的代码。首先使用属性结点,将F结点的符号设置为1号符号(符号的Index可以在右键快捷菜单的Item Symbol菜单项中查询);然后使用Custom Item Symbol. Set Symbol方法,将1号符号修改为自定义的图片;这样就Tree控件中所有的1号符号会变为新的符号。
图 20 自定义结点的符号
1.5Tree控件的界面刷新
本例将介绍一个特殊的技巧,不仅仅使用在Tree控件中,也可以使用在其它的界面更新中。本例将实现如图 21所示的功能,使用程序自动向Tree控件加入1000个结点,并且每个结点的底色依次交叉不同。
图 21 Tree控件例子前面板
底层代码【下载】如图 22所示。首先使用Edit Tree Items. Delete方法删除Tree控件中所有的内容(不连接Tag表示删除所有内容);然后加入一个N=1000的For循环,每次循环都加入一个新的Item项并且设置该项的背景色。Child Positon设置为-1表示新加入的项在现有项的最末尾处。
图 22 Tree控件例子背面板
运行该VI,可以发现程序确实能够实现相应的功能,但是运行时间较长。这主要是由于Tree控件刷新导致的,每次循环运行,都需要修改结点的背景色,这使得整个界面的刷新速度非常慢。事实上,我们并不需要观察Tree控件增加的过程,只需要快速地获取到结果就可以了。例如在循环运行时,可以并不马上改变Tree控件的外观,而是程序运行完成后,一次性地刷新Tree控件的外观,这样可以大大地提高程序运行的速度。修改后的代码如图 23所示。
图 23 Tree控件例子背面板_修改后
上图中使用了LabVIEW提供的Defer Panel Updates属性,该属性可以延迟整个界面(Panel)的刷新。也就是说当修改界面上控件的值和外观时,并不是马上对界面上的控件进行刷新,而是在恰当的时候(当LabVIEW重绘前面板界面的时候)再统一进行刷新。因此,在开始运行时将Defer Panel Updates属性设置为true,在程序结束后再将Defer Panel Updates属性设置为false强制对前面板控件进行刷新。
上一篇:如何构建数据采集系统(二)
下一篇:局域变量、全局变量和功能型全局变量