A
andyfing
Unregistered / Unconfirmed
GUEST, unregistred user!
我想对这颗树相应接点进行的(即其他字段操作,如添加,删除,子接点的统计等)
我应该传递相应字段给函数,再编写处理代码吗?
会不会太慢?
unit BuildTreeUnit;
interface
uses
DB, ADODB, ComCtrls;//感觉好象没什么作用
// 定义树结点对数据库表记录对应的结构体
type
PNode = ^TNode; //指针吗?
TNode = record
FID:integer; // 记录的ID号
FBM:TBookMark; // 定位记录的指针(书签)
end;
function BuildTree(DataSet: TADODataSet; TV: TTreeView; SelfField,SelfName,ParentField:String):boolean;
implementation
function BuildTree(DataSet: TADODataSet; TV: TTreeView; SelfField,SelfName,ParentField:String):boolean;
{ 以下子函数为在表中查找第一个PNode=AIndex的记录}//函数不用begin……end?
function FindKey(AIndex: integer; FFirst:boolean): boolean;//AIndex哪来的?FFIRST,又是传递的那的?
begin
Result:=DataSet.Locate(ParentField,AIndex,[loCaseInsensitive]);
end;
{ 以下函数在FindKey的基础上找出下一个符合的记录}
function FindNext(AIndex: integer): boolean;
begin
DataSet.Next;
if DataSet.Eof then
Result:=false
else
Result:=DataSet.FieldValues[ParentField]=AIndex;//=AINDEX是什么意思?DELPHI怎么有这样的格式?
if not Result then DataSet.Prior;
end;
{ 以下函数据构造当前结点的一级子树 }
function GetChildNode(index: integer; ANode: TTreeNode):integer;//index,anode?
var
MyNodeNode;
Node:TTreeNode;
begin
if FindKey(index,true) then
begin
new(MyNode);
with DataSet do
begin
MyNode^.FID :=FieldValues[SelfField];
MyNode^.FBM :=GetBookmark;//getbookmark是什么意思?哪里得到的书签?
end;
Node:=TV.Items.AddChild(ANode,DataSet.FieldValues[SelfName]);
Node.Data:=MyNode;
Result:=1;
while FindNext(index) do
begin
new(MyNode);
with DataSet do
begin
MyNode^.FID :=FieldValues[SelfField];
MyNode^.FBM :=GetBookmark;
end;
Node:=TV.Items.AddChild(ANode,DataSet.FieldValues[SelfName]);
Node.Data:=MyNode;
Result:=Result+1;
end;
end
else
Result:=0;
end;
{ 以下函数据以ANode 为结当,构造一棵属于自己的子树}
procedure BuildMe(AIndex: integer; ANode: TTreeNode);//ANODE是……
var
NodeNum:integer;
Node:TTreeNode;
i:integer;
begin
NodeNum:=GetChildNode(AIndex,ANode);
if NodeNum>0 then
begin
if ANode=nil then Node:=TV.Items.GetFirstNode
else
Node:=ANode.getFirstChild;
for i:=1 to NodeNum do
begin
BuildMe(PNode(Node.Data)^.FID,Node);
Node:=ANode.GetNextChild(Node);
end;
end;
end;
// 组合部份
begin
if (DataSet=nil) or (DataSet.Active =false) then
Result:=false
else if (TV=nil) then
Result:=false
else begin
TV.Items.Clear;
BuildMe(0,nil);
Result:=true;
end;
end;
end.
我应该传递相应字段给函数,再编写处理代码吗?
会不会太慢?
unit BuildTreeUnit;
interface
uses
DB, ADODB, ComCtrls;//感觉好象没什么作用
// 定义树结点对数据库表记录对应的结构体
type
PNode = ^TNode; //指针吗?
TNode = record
FID:integer; // 记录的ID号
FBM:TBookMark; // 定位记录的指针(书签)
end;
function BuildTree(DataSet: TADODataSet; TV: TTreeView; SelfField,SelfName,ParentField:String):boolean;
implementation
function BuildTree(DataSet: TADODataSet; TV: TTreeView; SelfField,SelfName,ParentField:String):boolean;
{ 以下子函数为在表中查找第一个PNode=AIndex的记录}//函数不用begin……end?
function FindKey(AIndex: integer; FFirst:boolean): boolean;//AIndex哪来的?FFIRST,又是传递的那的?
begin
Result:=DataSet.Locate(ParentField,AIndex,[loCaseInsensitive]);
end;
{ 以下函数在FindKey的基础上找出下一个符合的记录}
function FindNext(AIndex: integer): boolean;
begin
DataSet.Next;
if DataSet.Eof then
Result:=false
else
Result:=DataSet.FieldValues[ParentField]=AIndex;//=AINDEX是什么意思?DELPHI怎么有这样的格式?
if not Result then DataSet.Prior;
end;
{ 以下函数据构造当前结点的一级子树 }
function GetChildNode(index: integer; ANode: TTreeNode):integer;//index,anode?
var
MyNodeNode;
Node:TTreeNode;
begin
if FindKey(index,true) then
begin
new(MyNode);
with DataSet do
begin
MyNode^.FID :=FieldValues[SelfField];
MyNode^.FBM :=GetBookmark;//getbookmark是什么意思?哪里得到的书签?
end;
Node:=TV.Items.AddChild(ANode,DataSet.FieldValues[SelfName]);
Node.Data:=MyNode;
Result:=1;
while FindNext(index) do
begin
new(MyNode);
with DataSet do
begin
MyNode^.FID :=FieldValues[SelfField];
MyNode^.FBM :=GetBookmark;
end;
Node:=TV.Items.AddChild(ANode,DataSet.FieldValues[SelfName]);
Node.Data:=MyNode;
Result:=Result+1;
end;
end
else
Result:=0;
end;
{ 以下函数据以ANode 为结当,构造一棵属于自己的子树}
procedure BuildMe(AIndex: integer; ANode: TTreeNode);//ANODE是……
var
NodeNum:integer;
Node:TTreeNode;
i:integer;
begin
NodeNum:=GetChildNode(AIndex,ANode);
if NodeNum>0 then
begin
if ANode=nil then Node:=TV.Items.GetFirstNode
else
Node:=ANode.getFirstChild;
for i:=1 to NodeNum do
begin
BuildMe(PNode(Node.Data)^.FID,Node);
Node:=ANode.GetNextChild(Node);
end;
end;
end;
// 组合部份
begin
if (DataSet=nil) or (DataSet.Active =false) then
Result:=false
else if (TV=nil) then
Result:=false
else begin
TV.Items.Clear;
BuildMe(0,nil);
Result:=true;
end;
end;
end.