我用下面的语句得不到索要的值
Pryjg(treeview1.Selected.Data)^.bh;
这个语句我本来想得到,在treevieww里面,选择的那个就把相应的编号提取出来,但是现在得到的却是最后的值,而不是想要得,这个treeview与数据库相联系,个个数据已经显示出来了,我想现在的问题与数据库无关了吧?

解决方案 »

  1.   

    text是仅仅在节点里面存放一个值,我是存放了两个啊,用了个指针,Pryjg是
    我定义的一个record,里面有两个string,一个是名字,一个是编号
      

  2.   

    treeview1.Selected.Data也是一个指针啊!
      

  3.   

    不是,就是treeview,整个代码如下:
    type
    Pryjg = ^TPryjg;
    TPryjg = record
      name: string;
      bh: string;
    end;
    procedure TjgryFrm.FormCreate(Sender: TObject);
    var
      node,node1,nodenext : TTreeNode;
      myjg :Pryjg;
      myry :pryjg;
      myroot :pryjg;
      zw :string;
    begin
      new(myjg);
      new(myry);
      new(myroot);
      myroot.name:= '山东省税务机构人员';
      myroot.bh :='0000000000';
      treeview1.Items.Clear;
      node:=treeview1.Items.AddObject(nil,myroot.name,myroot);
      with dm.ADOQuery1 do
      begin
      close;
      sql.Clear;
      sql.Add('select * from jgsl');
      Open;
      end;
      dm.ADOQuery1.First;  while not dm.ADOQuery1.Eof do
      begin
      myjg.name := dm.ADOQuery1.fieldbyname('jg_mc').AsString;
      myjg.bh := dm.ADOQuery1.fieldbyname('jg_bh').AsString;
      node1:=treeview1.Items.AddChildObject(node,myjg.name,myjg);
      with dm.ADOQuery2 do
         begin
           close;
           sql.Clear;
           sql.Add('select * from rypb');
           Open;
         end;
      dm.ADOQuery2.First;
           while not dm.ADOQuery2.Eof do
           begin
           myry.name :=dm.ADOQuery2.fieldbyname('ry_mc').AsString;
           myry.bh := dm.ADOQuery2.fieldbyname('ry_bh').AsString;
           nodenext :=treeview1.Items.AddChildObject(node1,myry.name,myry);
           dm.ADOQuery2.next;
           end;
      dm.ADOQuery2.First;
      dm.ADOQuery1.next;
      end;
      dm.ADOQuery1.First;
      dm.ADOQuery2.First;
      treeview1.Refresh;
      pagecontrol1.ActivePage:=tabsheet1;
      ///////////////////////////////////////
      ///添加子项
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('select * from jszw');
      adoquery1.Open;
      adoquery1.First;
      dbcombobox1.Items.Clear;
      while not adoquery1.Eof do
        begin
          zw := adoquery1.fieldbyname('zw').AsString;
          DBComboBox1.Items.Add(zw);
          adoquery1.Next;
        end;
      ///////////////////////////////////////
      //dispose(myroot);
      //dispose(myjg);
      //dispose(myry);
    end;
    procedure TjgryFrm.TreeView1Change(Sender: TObject; Node: TTreeNode);
    var
      bh :string;
    begin
      //treeviewrefresh;
    //if treeview1.Selected.Level =2 then
      //begin
       bh:=pryjg(treeview1.Selected.Data)^.bh;
       showmessage(bh);
      //end;
      //dispose(myry);
    end;
      

  4.   

    你可以修改TTreeNode类代码,增加一个如ID的属性,记录数据库查询ID
    然后重新编译ComCtrls单元
      

  5.   

    这样写是不行
    不停的把数据纪录的值传给相同的指针
    再将指针传给Node的Data
    当然只有对应一条纪录
      

  6.   

    to  ScoutKing(失眠夜) :
    好像你说的是对的,不过,应该如何修改呢?
      

  7.   

    比较傻的解决办法:
    var
      iCount: Integer;
      saNode: array of pryjg;
      SetLength(saNode,ADOQuery1.RecordCount);
      ADOQuery1.First;
      iCount:= 0;
      while not ADOQuery1.Eof do
      begin
        New(saNode[iCount]);
        saNode[iCount].name:= ADOQuery1.fieldbyname('jg_mc').AsString;
        saNode[iCount].bh:= ADOQuery1.fieldbyname('jg_bh').AsString;
        node1:=treeview1.Items.AddChildObject(node,saNode[iCount].name,saNode[iCount]);
        Inc(iCount);
      end;
      

  8.   

    完全不用这样复杂,两棵树(T1,T2),T1.itms[i].text,存Nm,T2.itms[i].text存ID,然后在T1的onChange..事件中利用TTreeView的绝对索引同步T1h和T2.
    栽树时,两个树应该按照Nm,ID对应着同步的载成.
    (我原来有跟你一样的需求,也和你采用同样的解决办法,但是系统报内存错误.把D6 Help中的例题拉出来同样报内存错误)
      

  9.   

    那怎么在treeview改变的时候得到相应的bh?
      

  10.   

    OnChange事件保持原来的用法可以实现你要的效果
      

  11.   

    To netwei(菩提根) :
    呵呵,现在是只有两个 字段值
    如果以后遇到节点对应n个字段的时候怎么办呢?
    弄上n棵树?
      

  12.   

    to ScoutKing(失眠夜) :
    再change事件中,该怎么写?
      

  13.   

    就象你原来那样,差不多的:
    var
      bh :string;
    begin
      if (TreeView1.Selected<>nil)
      and (TreeView1.Selected.Level = 2) then
      begin
       bh:= pryjg(TreeView1.Selected.data)^.bh;
      end;
    end;另外,刚才上面的代码只是提供思路
    你自己还要把初始化树的代码改写
    这种解决办法我曾经用过,绝对可以实现你要的效果,自己多试一下吧