一,我数据库中对应有字段推荐人手机和被推荐人手机号,一个推荐人可以对应多个推荐人,被推荐人也可以推荐多人,我写了一个递归过程对其实现,把它们的对应关系显示在TREEVIEE中,但是应该是访问服务器数据库时需要很多的时间,所以程序一直都反映不过来。我想问一下怎么样可以减少时间。
下面是我写的一个过程,应该没有问题:
procedure GetDirectories(Tree:TTreeView; introducer:string; Item:TTreeNode);
var
  SearchRec: TSearchRec;
  ItemTemp: TTreeNode;
begin
  Tree.Items.BeginUpdate;
  form1.ADOQuery1.SQL.Clear;
  form1.ADOQuery1.SQL.Text:='select * from tagy_agency where  introducer =:introducer and levelno=:level CONNECT BY PRIOR agencyId = fatherId';
  form1.ADOQuery1.Parameters.ParamByName('introducer').value:=trim(introducer);
  form1.ADOQuery1.Parameters.ParamByName('level').Value:=10;
  if not form1.ADOQuery1.Active then  form1.ADOQuery1.Open;
  if form1.ADOQuery1.recordcount>0 then
  begin
    form1.ADOQuery1.First;
    while not (form1.ADOQuery1.Eof) do
    begin
      Item := Tree.Items.AddChild(Item, form1.ADOQuery1.fieldbyname('agencyId').value);
      ItemTemp := Item.Parent;
      GetDirectories(Tree, introducer, Item);
      Item := ItemTemp;
      Tree.Items.AddChild(Item, form1.ADOQuery1.fieldbyname('agencyId').value);
      form1.ADOQuery1.Next;
    end;{loop end}
    Tree.Items.EndUpdate;
  end;二:我怎么样把上面的实现以生成一幅图片的形式显示出来。

解决方案 »

  1.   

    1.这个问题,关键在于减少客户端和服务端交互次数。一个办法是,直接将表中所有数据都取到客户端中,然后再根据条件过滤处没一层次的记录。这样效率绝对可以提示很多。还有一些网站的方式,是延迟加载,比如,第一次知识加载第一层,这个方法适合于网站应用,或者数据量实在太大的时候。
    2.图片的问题,你说得比较含糊
    1)如果只是TreeVew转换到图片上,那么简单,TreeView的Canvas可以Copy到Bmp的Canvas上。
    2)如果你要自己定义显示格式来画这个图的话。其实很简单,就是算好所有节点的位置,然后画就好了。复杂一点的就是,要做那种折叠效果:)
      

  2.   

    谢谢你,不过你可以把你的方法说详细一点吗?
    比如如何将表中所有数据都取都客户端,如何过滤每一层的记录
    还有延迟加载问题。
    我要自己定义显示格式来画这个图的话,该怎么画
    请恕我愚昧,可以给我一个DEMO,让我好理解一点吗?