发现data数据指向的数字不是no 而是name的数据。并且,很乱套,也不是当前节点应该对应的那个name.
procedure TForm1.Button1Click(Sender: TObject);
var
  no,pno,t:string;
  mylabel:TLabel;
  name:string;
  node:TTreeNode;
  i,j:Integer;
begin
  TreeView1.Items.Clear;
  con1.Open;
  while not ds1.Eof do
  begin
    no:=ds1.Fields[0].AsString;
    name:=ds1.Fields[1].AsString;
    j:=ds1.Fields[2].AsInteger;
    if j=0 then
      node:=TreeView1.Items.AddObject(nil,name,PChar(no))
    else
      node:=TreeView1.Items.AddChildObject(TreeView1.Items[j-1],name,PChar(no));
  end;
end;

解决方案 »

  1.   

    no是数字字符串吧?
    把两处PChar(no)替换成Pointer(StrtoInt(no))试试
      

  2.   


    {新建一个项目试一下:}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      no : string;
    begin
      no := '010203';
      Self.TreeView1.Items.AddChildObject(nil, 'ClickMe', Pointer(StrtoInt(Format('%.6d',[StrtoInt(no)]))));
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      Showmessage(Format('%.6d',[integer(Self.TreeView1.Selected.Data)]));
    end;
      

  3.   

    汗,代码格式里不支持变色。重发:procedure TForm1.Button1Click(Sender: TObject);
    var
      no : string;
    begin
      no := '010203';
      Self.TreeView1.Items.AddChildObject(nil, 'ClickMe', Pointer(StrtoInt(Format('%.6d',[StrtoInt(no)]))));
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      Showmessage(Format('%.6d',[integer(Self.TreeView1.Selected.Data)]));
    end;
      

  4.   

    我的意思是,我要保证这个 010101正确的,到时候有些可能是 100101的,这样到时候,我还原就比较麻烦了。我建树的意思是这样的  id       name      aaa
    01       aaaaa     0
    0101     aaaaa     1
    0102     aaaaa     1
    02       aaaaa     0
    0201     aaaaa     4
    020101   aaaaa     5
    我要把 name 保存在 node.text中。想把id保存在data中。有没有什么方便方法?或者说像在C#里面一样node.name里面可以保存的
      

  5.   

    你说的方法可以实现,不过生成的数字有点问题,因为我的层次比较大,用int不够 要用int64你能考虑一下我上面说的情况吗?最好不要转化成INT64
      

  6.   

    如果不打算将数字字符串转换为Integer存放在TreeNode.Data里,
    而是希望TreeNode.Data指向每个数字字符串,那你需要一个字符串列表,这对资源的开销是个考验,这个思路并不可取。建议还是改变一下思路,从010203、01、101111这些字串的规律中找突破
      

  7.   

    一般是定义个记录,把记录指针赋给data,不容易出错
      

  8.   

    还有一种做法是这样的。用了一个Tlabel 每个DATA指向一个LABEL,然后用caption来存储
        node:=TreeView1.Items.Add(nil,name);
        mylabel:=TLabel.Create(Self);
       mylabel.Caption:=no;
       node.Data:=mylabel;
    ShowMessage(TLabel(TreeView1.Selected.Data).Caption);