你是乎没有结点被选中:
procedure tform1.calacanodemoney(anode:ttreenode);
  var
    achild:ttreenode;
    adata,cdata:tmydata;
    scale:real;
  begin
//    在这里加一句试试
    treeview.selected:=treeveiw.topitem;

解决方案 »

  1.   

    第一个节点被选中了呀
    procedure TForm1.CalacMoney;
      var
      aNode : TTreeNode;
      aData : TMyData;
    begin
      aNode :=TreeView1.Items.GetFirstNode;//找到第一个顶结点
      

  2.   

    procedure tform1.calacanodemoney(anode:ttreenode);
      var
        achild:ttreenode;
        adata,cdata:tmydata;
        scale:real;
      begin
       achild:=anode.getfirstchild;
       while achild<>nil do
       begin
        Case (aNode.level) of
        0: scale := 0.5;
        1: scale := 0.4;
        2: scale := 0.3;
        3: scale := 0.2;
       end;
         achild:=anode.getfirstchild;  // 这里也是
         while achild<>nil do        // 这里去掉才对,要不然你这个递归不对
    //了,因为已经有一个循环了,直接可以判断有没有子节点了,如果有则进入递归
          begin                      // 和这里 
            if achild.haschildren then calacanodemoney(achild);
            adata.ps:=adata.ps+tmydata(achild.data).ps*scale;
            achild:=achild.getnextsibling;
          end;     //还有这里
      end;
      

  3.   

    各位再帮我看看
    procedure  tform1.CalacMoney;
    ……
      aNode :=TreeView1.Items.GetFirstNode;//找到第一个顶结点
      while aNode <> nil do//原来,从这里跳出去,不执行递归了
    ……什么怪问题哟
      

  4.   

    你可是这样
    for i:=0 to treeview1.items.count-1 do
    begin
      aNode:=treeview1.items[i];
      .......
    end;
      

  5.   

    我测试了一下,anode应该不会是空值。可能没有更新表所造成的,有知道怎么用的吗?
      

  6.   

    你在button1 里面 屏蔽掉 后面的calmoney
    先运行buildtree 看看是不是生成 树了?看你后面的calmoney 应该没有什么问题的
      

  7.   

    运行buildtree绝对生成树了,
    但是label2.caption:=inttostr(cdata.ps);
    显示为0让我百思不得其解