procedure TFrmGoods.AddClass(AId:String;FatherNode:TTreeNode);
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.Connection:=DMFrm.DataModule1.ADOConn;
QryTmp.SQL.Add('select * from GoodsInfo');
QryTmp.SQL.Add('where ParID="'+AId+'"');
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('GoodsName').AsString); //创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('GoodsID').AsString;
myNode.Data:=myLabel; AddClass(QryTmp.fieldbyname('GoodsID').AsString,myNode); //递归调用过程
QryTmp.Next;
end;
// Treeview1.FullExpand;
QryTmp.Free;
end;
procedure TFrmGoods.FormCreate(Sender: TObject);
begin
AddClass('root',nil);
end;
当从另一窗体From1中调用显示FrmGoods时,速度较慢,请问该如何解决?
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.Connection:=DMFrm.DataModule1.ADOConn;
QryTmp.SQL.Add('select * from GoodsInfo');
QryTmp.SQL.Add('where ParID="'+AId+'"');
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('GoodsName').AsString); //创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('GoodsID').AsString;
myNode.Data:=myLabel; AddClass(QryTmp.fieldbyname('GoodsID').AsString,myNode); //递归调用过程
QryTmp.Next;
end;
// Treeview1.FullExpand;
QryTmp.Free;
end;
procedure TFrmGoods.FormCreate(Sender: TObject);
begin
AddClass('root',nil);
end;
当从另一窗体From1中调用显示FrmGoods时,速度较慢,请问该如何解决?
参考如下的代码,可以利用定位的方法,这样只要建立一个TQuery连接就行了:
怎样根据数据库的内容动态部门树 *****
主要解答者: zswangII 提交人: dulei115
感谢: dulei115
审核者: l_xiaofeng 社区对应贴子: 查看
-----------------------------------
数据库结构:
部门ID 部门名称 上级部门ID
1 总部门 -1
2 部门1 1
3 部门2 1
4 部门3 1
5 分部门1 2
6 分部门2 2
7 分部门3 2
8 子部门1 5
9 子部门1 5
---------------------------------------------------------------
(*//
标题:数据集处理成可视树
说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
设计:Zswang
日期:2002-05-20
支持:[email protected]
//*)
///////Begin Source
function DataSetToTreeNode(mDataSet: TDataSet;
mFieldNameParent: string; //父节点标识字段名
mFieldNameTreeText: string; //节点文本字段名
mFieldNameTreeId: string; //节点标识字段名
mTreeView: TTreeView; mTreeNode: TTreeNode;
mParentText: string): Boolean;
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).AsString);
vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
Result := True;
end;
///////End Source
///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
DataSetToTreeNode(Table1, 'ParentTreeId', 'TreeText', 'TreeId',
TreeView1, nil, 'NULL');
end;
///////End Source
TMyStruct=record
id:string;
...........
end;///////////////
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('GoodsID').AsString;
myNode.Data:=myLabel;
/////////////////////////
----------------------------->>>>>>>>>>>>>>>>>>>>>>>>
var
p:PMyStruct;
new(p);
p^.Id:=QryTmp.fieldbyname('GoodsID').AsString;
MyNode.Data:=p;