Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103647960
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-04 23:40:19


     来源:赛迪网    作者:010032

树的简介

Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。

树的特有属性中如下几个较为重要:

多项选择(Muti-Seection):是否允许一次选中树的多个节点。如果不允许,那么选中第二个节点时,第一个被选中的节点会取消选择。

记录组(RecordGroup):指定生成树的记录组的名字。

简单介绍一下跟树相关的触发子(Buit-in):

FUNCTIONGET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeNODE,propertyNUMBER);

功能:取得树节点的属性:

◆其中property有如下几种:

◆NODE_STATE:EXPANDED_NODE(扩展节点)

◆COAPSED_NODE(收缩节点)

◆EAF_NODE(叶节点)--注:不能展开或收缩

◆NODE_DEPTH:既节点在树中的层级。

◆NODE_ABE:节点的显示文本

◆NODE_ICON:节点的图标

◆NODE_VAUE:节点的值。

例子:

DECARE

htreeITEM;

node_vaueVARCHAR2(100);

BEGIN

--得到树

htree:=Find_Item('tree_bock.htree3');

--得到当前选中节点的值

node_vaue:=Ftree.Get_Tree_Node_Property
(htree,:SYSTEM.TRIGGER_NODE,Ftree.NODE_VAUE);

...

END;

注释:其中:SYSTEM.TRIGGER_NODE指当前选中的树节点。

FUNCTIONGET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER);

功能:取得树的属性:

其中property有如下几种:

DATASOURCE

RECORD_GROUP

QUERY_TEXT

NODE_COUNT:返回树中节点的个数。

SEECTION_COUNT

AOW_EMPTY_BRANCHES

AOW_MUTI-SEECT

PROCEDURESET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeFTREE.NODE
,propertyNUMBER,vaueVARCHAR2);

功能:设置树节点的属性:

PROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,vaueVARCHAR2);

PROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,vaueRECORDGROUP);

功能:设置树的属性PROCEDUREPOPUATE_TREE(item_nameVARCHAR2);。

功能:清空树中已有数据,并根据记录组或数据查询重新生成树。

PROCEDUREADD_TREE_DATA(item_nameVARCHAR2,nodeFTREE.NODE,
offset_typeNUMBER,offsetNUMBER,data_sourceNUMBER,dataVARCHAR2);

功能:在指定节点下添加树中数据:

注:使用比较麻烦。

FUNCTIONFIND_TREE_NODE
(item_nameVARCHAR2,earch_stringVARCHAR2,s
earch_typeNUMBER,search_byNUMBER,search_rootNODE,start_pointNODE);

功能:找到显示文本或值符合search_string的节点。

参数:

search_type:FIND_NEXT

FIND_NEXT_CHID

Search_by:NODE_ABE

NODE_VAUE

Search_root:查询的根节点,一般是Ftree.ROOT_NODE

Start_point:查找的开始节点,一般是Ftree.ROOT_NODE

FUNCTIONADD_TREE_NODE(item_nameVARCHAR2,nodeFTREE.NODE,
offset_typeNUMBER,offsetNUMBER,stateNUMBER,abeVARCHAR2,
iconVARCHAR2,vaueVARCHAR2);

功能:添加树节点:

Offset_type:指定节点的分支类型,PARENT_OFFSET和SIBING_OFFSET

Offset:指定新节点的位置,

PARENT_OFFSET:1..N

AST_CHID

SIBING_OFFSET:NEXT_NODE

PREVIOUS_NODE

State:EXPANDED_NODE(扩展节点)

COAPSED_NODE(收缩节点)

EAF_NODE(叶节点)

PROCEDUREDEETE_TREE_NODE(item_nameVARCHAR2,nodeNODE);

功能:删除树节点FUNCTIONGET_TREE_NODE_PARENT(item_nameVARCHAR2,nodeNODE);

功能:得到指定节点的父节点FUNCTIONGET_TREE_SEECTION(item_nameVARCHAR2,seectionNUMBER);

功能:得到处于选中状态的节点。PROCEDURESET_TREE_SEECTION(item_nameVARCHAR2,nodeNODE,seection_typeNUMBER);

功能:指定单个节点的选中状态:

参数:

seection_type:SEECT_ON

SEECT_OFF

SEECT_TOGGE

FORM运行态时有关的触发器:

When-Tree-Node-Activated:
用户双击节点或在节点选中时按[ENTER]键时触发。

When-Tree-Node-Expanded:
节点展开或收缩时触发

When-Tree-Node-Seected:
当节点选中或取消选择时触发

生成树的方式

树控件一般单独放在一个控制块中(注:不能放在数据块中),在画布(CANVAS)上放置树很容易,并且,如无必要,树的属性也不需要设置。

生成树的方式有几种:

◆运行前通过设置记录组或数据查询属性来生成

◆通过ADD_TREE_DATA触发子来实现

◆运行态,通过ADD_TREE_NODE等触发子来实现

◆运行态,通过添加或删除记录组的数据元素来实现

分析:

对树直接操作:

描述:Find_Tree_Node找到指定节点,Add_Tree_Node来添加其下级节点。

缺点:编程较为复杂,操作不灵活,而且易出错。

优点:可以对添加节点等过程进行控制,实现一些特殊要求。

例子:

--dept_cur为取单位的CURSOR,emp_cur为取雇员的CURSOR

htree:=Find_Item('tree_view.tree_emp');

opendept_cur;

oop

fetchdept_curintoaa;

exitwhendept_cur%notfound;

de_node:=Ftree.Find_Tree_Node(htree,aa.kjmc,Ftree.FIND_NEXT,
Ftree.NODE_ABE,Ftree.ROOT_NODE,Ftree.ROOT_NODE);

--删除单位节点及其子节点

IFNOTFtree.ID_NU(de_node)then

Ftree.Deete_Tree_Node(htree,de_node);

ENDIF;

endoop;

cosedept_cur;

--根据用CURSOR取得的单位生成树的第一层节点

opendept_cur;

oop

fetchdept_curintoaa;

exitwhendept_cur%notfound;

new_node:=Ftree.Add_Tree_Node(htree,Ftree.ROOT_NODE,Ftree.parent_OFFSET,
Ftree.AST_CHID,Ftree.EXPANDED_NODE,aa.dname,'',aa.deptno);

endoop;

cosedept_cur;

--根据雇员CURSOR生成树的下层节点

openemp_cur;

oop

fetchemp_curintobb;

exitwhenemp_cur%notfound;

find_node:=Ftree.Find_Tree_Node(htree,bb.kjbh,Ftree.FIND_NEXT,

Ftree.NODE_vaue,Ftree.ROOT_node,Ftree.ROOT_NODE);

new_node:=Ftree.Add_Tree_Node(htree,find_node,Ftree.parent_OFFSET,
Ftree.AST_CHID,Ftree.EXPANDED_NODE,bb.ename,'',bb.empno);

endoop;

coseemp_cur;

--得到树的根节点

ss:=Ftree.get_tree_property(htree,FTREE.NODE_COUNT);

--循环,直到树的所有节点都展开

forjin1..ssOOP

exp_node:=Ftree.Find_Tree_Node(htree,'');

state:=Ftree.Get_Tree_Node_Property
(htree,j,Ftree.NODE_STATE);

IFstate=Ftree.COAPSED_NODETHEN

Ftree.Set_Tree_Node_Property
(htree,j,Ftree.NODE_STATE,Ftree.EXPANDED_NODE);

ENDIF;

ENDOOP;

动态记录组:

层次树所使用记录组的数据格式:

+—Car

|

-—Airpane

|—Boeing

|—Boeing


初始状态
层数
显示文本
图标


-1(收缩节点)
1
‘Car’
''
‘car’

0(叶节点)
2
'Honda'
''
'civic'

1(展开节点)
1
'Airpane'
''
'pane'

0
2
'Boeing'
''
'747'

0
2
'Boeing'
''
阅读(372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~