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时,速度较慢,请问该如何解决?

解决方案 »

  1.   

    重复创建TQuery,重复连接查询,影响速度。
    参考如下的代码,可以利用定位的方法,这样只要建立一个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
      

  2.   

    再问一个,如果我要保存各节点标识字段的值怎么办?像我上面用TLable行不行?
      

  3.   

    干嘛用TLabel。用个自定义结构灵活多了。PMyStruct=^TMyStruct;
    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;