一、树形控件基本构成
树形控件这个名称非常形象,其如同树一样,是典型的分层结构。树形控件的属性和方法使用非常灵活,树形控件的内容既可以静态编辑,也可以通过编程来动态填充。静态编辑树形控件适用于内容不变的应用场景,而动态填充则比较复杂,适用于内容无法确定的场合。
在了解树形控件的静态编辑前需要先熟悉树形控件各部分名称及其含义。如下图1-1所示,树形控件有几个基本元素构成,包括扩展/折叠符号、项目符号、左单元格字符串、子项文本。
图1-1 树形控件的基本构成
扩展/折叠符号可以选择Windows、LabVIEW、Mac OS等显示方式;
项目符号可以选择内部项目符号表中提供的符号,也支持用户自定义符号;
左单元格字符串表示项目的具体含义,直接显示在树形控件中,LabVIEW内部区分具体项目,是通过项目标识符(Tag)实现的(项目标识符也是字符串,可以与左单元格字符串相同,也可以不同);
子项文本时字符串数组,可以多列显示,常用于说明项目的用途,也可不用。
二、树形控件静态编辑
对于树形控件这种典型的分层结构而言,位于顶端的项目通常称为顶端项目或者根项,其特点是没有父项。而其他中间项目既有父项,又有子项,它们相互之间有隶属关系。位于末端的项目可以仅设置为子项,表示该项目不能作为其他项目的父项。
对于内容始终不变的树形控件,可以在开发编辑环境中直接使用操作选板编辑,简单介绍一下属性空间的编辑方法。
第一步:按照层次结构设计树形控件的内容草图,包括所有的左单元格字符串及其标识(Tag),如下图1-2所示。
图1-2内容草图
第二步:按照草图设计树形控件。对于树形控件而言,显示在树形控件中的左单元格字符串是不重要的,重要的是区别各个项目的标识。必须保证这些标识(Tag)是唯一的。默认情况下,LabVIEW会根据左单元格自动生成同名的标识。左单元格字符串可以相同,对于同名单元格,生成的标签会自动添加序号,如下图1-3所示,可以通过快捷菜单打开“编辑项”对话框来设置标识名称。在“编辑项”对话框中,按照顺序数据所有左单元格字符串,遵循从左到右、从上到下的原则。
图1-3 查看标识符
第三步:根据不同层次,通过树形控件的快捷菜单中的“缩进项”进行缩进。多层项目需要多层缩进。项目编辑完成后,选择合适的缩进符号。如果需要不同的项目符号,可在树形控件快捷菜单“显示项”中打卡“符号”对话框,然后选择合适的内置项目符号。效果如下图1-4所示。
图1-4 树形控件静态编辑效果
第四步:在编辑菜单中,选择“当前值设置成默认值”项,然后存储树形控件所在的VI。
这样就完成了树形控件的静态编辑。
三、树形控件的常用属性、方法和事件
树形控件包含的数据类型为字符串或者字符串数组。如果允许多选,则树形控件会返回字符串数组;反之则返回字符串。虽然树形控件的值属性会返回树,但树形控件和树形控件的值属性可以直接和字符串或字符串数组连接。连接的字符串或者字符串数组,表示选中项目的标签字符串。
树形控件的属性和方法是实现树形控件动态填充的关键,需要仔细分析和理解。
1.树形控件常用属性
编辑位置:可读可写,用于获取或者设置当前文本编辑醒目的行或列索引,索引(0,0)表示左上角项目,索引(-1,-1)表示行首和列首,索引(-2,-2)表示未选择任何编辑项。另外必须设置可编辑单元格后才能使用“编辑位置”属性。
显示层次为0的项缩进/移出符号:可读可写,用于获取或设置是否显示顶层根项的缩进/移出符号。隐藏缩进/移出符号是,缩进等级为0的项将与树形控件的左侧对齐。
缩进/移出符号类型:可读可写,用于获取或设置缩进/移出符号的类型。有效值包括0(None)、1(LabVIEW)、2(Mac OS)、3(Windows)和4(Default)。
显示的项:只读属性,用于获取所有可见项的项目标识,并按显示次序排列。未展开子项不返回。
行数和列数:读写属性,用于获取或者设置树形控件可见部分的行数和列数。
行列首字符串:读写属性,用于获取或设置行首列首字符串。
活动列数:读写属性,用于获取或者设置活动单元格所在的列。值设置为-2表示选择所有列;值为-1表示选择列首;值为0表示选择第1列。
字体:读写属性,用于设置活动单元格字体、背景颜色、对齐方式等显示效果。
单元格大小:读写属性,用于读取或者设置单元格的高度和宽度。
标识符:用于设置标识符项目为活动项目,其后所有操作针对活动项进行。
所有标识符:用于从上至下返回所有项目的标识符。
2.树形控件常用方法
排列子项:用于对某一项的子项按字母顺序进行排列。
删除项:在树形控件中删除指定项。如需删除树形控件所有相,可设置标识符为空字符串,并设置删除子项为TRUE。
添加项:在树形控件中添加指定项。
添加项到末尾:在树形控件现有项之后添加项。
添加多个项到末尾:在树形控件现有项之后同时添加多个项。
获取子项:根据给定的父项标识,获取它的第一个子项。最顶端的项没有父项,为空字符串。如果没有子项则返回空字符串。
获取最后一项:用于返回同一层次(即同属于一个父项)指定标识之后的子项标识。如不存在则返回空字符串。
获取前一项:用于返回同一层次指定标识项之前的项目。如果不存在返回空字符串。
获取父项:用于返回子项的父项,如果为空则为顶层项目。
获取路径:用于返回顶层至指定子项之间所有项的标识符字符串数组。
打开/关闭全部:用于展开或者关闭树形控件的所有节点。值为TRUE时展开所有节点,值为FALSE时关闭所有节点。
打开/关闭项:用于展开或者关闭指定项的子项。值为TRUE时展开子项。值为FALSE时关闭子项。
点到行列:用于返回像素点所在位置的标识和列,同时返回像素点是否在内容区域边界内和自定义符号内。
显示层次结构线:用于设置是否显示水平和垂直分隔线。若显示则能更清楚地显示出项目的层次结构。
3.树形控件的常用事件
树形控件中一些重要的事件为事件结构的编程提供了极大方便。如:
“编辑单元格”事件:编辑某个单元格是触发该事件,树形控件必须设置为可编辑的模式才能产生事件。
“双击”事件:双击树形控件时会发生此事件,并返回双击行的项目标识。
“项打开”事件:某个父项展开时发生的事件。
“项关闭”事件:某个父项关闭时发生的事件。
以上就可以实现树形控件的动态填充。动态填充的关键在于属性和方法的使用,其中方法节点尤为重要。下面通过一些具体范例简单介绍如何使用这些属性、方法和事件。
四、树形控件的一些应用方法
1.“删除项”和“添加多个项到末尾”方法
在树形控件填充之前,首先需要通过“删除项”方法删除树形控件中的原有项。“删除项”方法通常用于具体删除某个项。如果项目标识为空(默认)且“删除子项”输入参数设置为TRUE,则删除树形控件的所有项目。此方法多用于程序初始化时,清空树形控件。
如下图所示,“罗列文件夹与文件”函数连接的路径是“默认目录”函数,及LabVIEW.EXE文件所在目录,该函数返回指定文件下的所有文件夹及文件。图中使用了树形控件的“添加多个项目到末尾”方法,该方法的输入端子是簇数组,簇数组的元素为一个具体的项目。
树形控件项目的数据类型为LabVIEW内部自定义的簇,通过树形控件“添加多个项目至末尾”方法的快捷菜单建立常量函数,从数组中拖出一个簇元素,即可抽取这个自定义的簇类型。这是一个使用LabVIEW内部自定义类型的重要技巧。
图1-5 动态填充文件夹和文件名至树形控件
2.获取同辈项目方法
同辈项目是指具有相同父项的项目,查找同辈项目是树形控件的常用操作。树形控件提供了获取所有项目标识的属性,但没有提供获取同辈项目标识的属性和方法,需要编程实现。如下图所示,可以获取所有同辈的项目标识。
此VI的输入端子使用了树形控件引用,因此这个VI可以用于任何树形控件,首先使用“获取子项”方法取得指定了父项的首个子项,然后利用“获取下一个子项”方法,通过循环取得所有子项。如下图所示数组中“王某、范某、胡某”为父类“二班”的同辈项目。
图1-6 获取同辈项目标识VI
也可获取同辈项目标识VI创建为子VI,通过“事件结构的鼠标按下”以及“点到行列”方法获取父项标识,再通过调用该VI获取同辈中所有标识符。
3.自定义项目符号
LabVIEW本身为树形控件自定义项目符号提供了一个非常好的范例,如下图所示。
图1-7 树形控件自定义项目符号
以上学习就基本掌握了树形结构的使用,但需要熟练使用在项目中还需要仔细理解这些属性和方法。