在Oracle9i中FormBuilder使用树心得
文章作者 100test 发表时间 2007:07:02 12:15:49
来源 100Test.Com百考试题网
树的简介
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
|
src="/oracle/js/wxgg_oracle.js">