递归函数使用实例
一般用户可以忽略本节内容。
系统学习过编程的人,对于递归函数都很熟悉,所谓递归函数,就是函数的自我调用。
Foxtable内部函数也支持递归调用。
如果代码设计不当,出现无限递归,会导致堆栈溢出,使得Foxtbale直接崩溃退出。
本节的内容可以参考CaseStudy目录下的文件: 递归函数.Table
假定有一个表:
要生成下图所示的目录树,各节点的关系由“父键”和“键”两列的值决定:
而且要求双击某个节点,能将此节点及其子节点对应的行全部筛选出来。
设计步骤:
1、在内部函数中新建一个函数,名为AddChildren,代码为:
Dim
nd As WinForm.TreeNode = args(0)上述代码中,出现了调用AddChildren函数自身的代码(第8行):
Functions.Execute("AddChildren",cd,dt)
这种在函数自己调用自己的情况,就是常说的递归调用。
2、在窗口中加入一个目录树控件和一个按钮,按钮的代码为:
Dim
tr As
WinForm.TreeView
= e.Form.Controls("TreeView1")
Dim
nd As
WinForm.TreeNode
Dim
dt As
DataTable =
DataTables("表A")
tr.StopRedraw()
tr.Nodes.Clear
tr.Nodes.Add("全部")
For
Each dr
As DataRow
In dt.datarows
If
dr.IsNull("父键")
Then
nd
= tr.Nodes.Add(dr("键"),dr("标题"))
Functions.Execute("AddChildren",nd,dt)
End
If
Next
tr.ResumeRedraw()
单击此按钮,即可根据“父键”和“键”两列的值,生成目录树。
3、最后将目录树的NodeMouseDoubleClick事件代码设置为:
Dim
trv
As
WinForm.TreeView
=
e.Form.Controls("TreeView1")
Dim
key
As
String
=
e.Node.Name
Dim
ids
As
String
If
key
=
"全部"
Then
Tables("表A").Filter
=
""
Else
For Each
nd
As
WinForm.TreeNode
In
trv.AllNodes
Dim
pd
As
WinForm.TreeNode
=
nd
Do
If
pd.Name
=
key
Then
If
ids
>
""
Then
ids=
ids
&
","
End If
ids
=
ids
&
"'"
&
nd.name
&
"'"
Exit Do
Else
pd
=
pd.ParentNode
If
pd
Is Nothing Then
Exit Do
End If
End If
Loop
Next
Tables("表A").Filter
= "键 In ("
&
ids
&
")"
End If
这样要求双击某个节点,即可将此节点及其子节点对应的行全部筛选出来。