PB中TreeView控制元件的深度優化搜尋演算法程式
阿新 • • 發佈:2019-02-15
《計算機世界》2000年第11期B14版登載的“也談‘在PB的TreeView控制元件中實現自動查詢’” 一文中在實現對TreeView的搜尋查詢時,使用了兩個陣列來記錄資料,然後通過查詢資料元素來實現查詢。而本文通過樹的深度優先演算法來實現TreeView的查詢。
---- 由於PB的TreeView控制元件沒有提供查詢項的功能,因此本程式算是對此一缺憾的補缺。
---- 呼叫語法:
---- findtreeitem(tv_tree, findby, data)
---- 呼叫引數:
tv_tree: TreeView, 指明在tv_tree樹中查詢
findby: boolean, 指明查詢方式
false - 按標籤(Label)查詢
true - 按附加資料(data)查詢
data: any, 指明要查詢的內容
返回值:long型。若找到,返回找到的項的Handle;
若沒有找到,返回0;
若出錯,返回-1
---- 程式程式碼如下:
public function long findtreeitem(TreeView tv_tree,
boolean findby, any data);
long ll_hdl[]
integer li_cnt
treeviewitem lt_tvi
li_cnt = 1
ll_hdl[1] = tv_tree.FindItem(RootTreeItem!, 0)
do while li_cnt > 0
if tv_tree.GetItem(ll_hdl[li_cnt], lt_tvi)
= -1 then return -1
if findby then
if lt_tvi.data = data then
return ll_hdl[li_cnt]
end if
else
if lt_tvi.label = string(data) then
return ll_hdl[li_cnt]
end if
end if
if lt_tvi.children then
li_cnt ++
ll_hdl[li_cnt] = tv_tree.FindItem(
ChildTreeItem!, ll_hdl[li_cnt - 1])
else
ll_hdl[li_cnt] = tv_tree.FindItem(
NextTreeItem!, ll_hdl[li_cnt])
end if
do while ll_hdl[li_cnt] <= 0
li_cnt --
if li_cnt = 0 then exit
ll_hdl[li_cnt] = tv_tree.FindItem(
NextTreeItem!, ll_hdl[li_cnt])
loop
loop
return 0
end function
---- 由於PB的TreeView控制元件沒有提供查詢項的功能,因此本程式算是對此一缺憾的補缺。
---- 呼叫語法:
---- findtreeitem(tv_tree, findby, data)
---- 呼叫引數:
tv_tree: TreeView, 指明在tv_tree樹中查詢
findby: boolean, 指明查詢方式
false - 按標籤(Label)查詢
true - 按附加資料(data)查詢
data: any, 指明要查詢的內容
返回值:long型。若找到,返回找到的項的Handle;
若沒有找到,返回0;
若出錯,返回-1
---- 程式程式碼如下:
public function long findtreeitem(TreeView tv_tree,
boolean findby, any data);
long ll_hdl[]
integer li_cnt
treeviewitem lt_tvi
li_cnt = 1
ll_hdl[1] = tv_tree.FindItem(RootTreeItem!, 0)
do while li_cnt > 0
if tv_tree.GetItem(ll_hdl[li_cnt], lt_tvi)
= -1 then return -1
if findby then
if lt_tvi.data = data then
return ll_hdl[li_cnt]
end if
else
if lt_tvi.label = string(data) then
return ll_hdl[li_cnt]
end if
end if
if lt_tvi.children then
li_cnt ++
ll_hdl[li_cnt] = tv_tree.FindItem(
ChildTreeItem!, ll_hdl[li_cnt - 1])
else
ll_hdl[li_cnt] = tv_tree.FindItem(
NextTreeItem!, ll_hdl[li_cnt])
end if
do while ll_hdl[li_cnt] <= 0
li_cnt --
if li_cnt = 0 then exit
ll_hdl[li_cnt] = tv_tree.FindItem(
NextTreeItem!, ll_hdl[li_cnt])
loop
loop
return 0
end function