目标:
Treeview中显示表中员工姓名(已实现),但同时希望能够保存员工id,以便在点击某个节点后可以根据id 显示出此员工相关的值(因为姓名不是主键,怕有重复会出错)。我试了selectedindex/stateindex等属性都不可以保存,请问如何做?

解决方案 »

  1.   

    一直都是通过stateindex来保存的!
    你的代码贴出来看看!
    顺带关注有没有更好的方法!
      

  2.   

    自定义一个指针,使用TreeNote的Data属性,相保存多少个字段的信息都可以了:)
    我刚使用了,很方便:)
      

  3.   

    我用了data,可是不行
    我根据帮助的例子这样写的,可还是有问题:
     with tvLX do begin
            Items.clear;
            myNode:=Items.Add(nil, '全体离休人员');
            with SalaryDM.qrylxInfo do begin
                Open; First;
                while not eof do begin
                    MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
                    MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
                    Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
                    myNode.Data := MyRecPtr;  //问题在这里
                    Next;
                end;
            end;
        end;
    可以显示,我F8 也可以跟踪到id指针变量的变化,但所有项的data值都是表末尾的那个id值,请帮我看看。
      

  4.   

    给你段代码看看:
    Connection := DataMod.ado_cnn;
          SQL.Add(strSql);
          Prepared := True;
          //ShowMessage(SQL.Text);
          Open;
          First;
          //第一个小区
          New(myPoint);
          myPoint.AString := 'borough';
          myPoint.AInteger := FieldByName('borough_id').AsInteger;
          tnBorough := Atvw.Items.AddObject(nil,FieldByName('borough_name').AsString,myPoint);
          MakeImageIndex(tnBorough,nSelectNo,nSelectYes);
          //楼宇
          New(myPoint);
          myPoint.AString := 'building';
          myPoint.AInteger := FieldByName('building_id').AsInteger;
          tnBuilding := Atvw.Items.AddChildObject(tnBorough,FieldByName('building_name').AsString,myPoint);
          MakeImageIndex(tnBuilding,nSelectNo,nSelectYes);
    end;我的指针定义是:
    type
       PWznRec = ^TWznRec;
       TWznRec = record
          AString  : string;
          AInteger : Integer;
          ABoolean : Boolean;
       end;
      

  5.   

    你增加时先要申请个指针,AddChildObject就已经制定了这个指针,就没必要在增加出问题的那句话了。还有,申请的指针在不要忘记释放。
      

  6.   

    每增加一个结点都要重新申请指针,给你改改:
     with tvLX do begin
            
            Items.clear;
            myNode:=Items.Add(nil, '全体离休人员');
            with SalaryDM.qrylxInfo do begin
                Open; First;
                while not eof do begin
                    new(MyRecPtr);/////////每次都要重新申请,否则就会出现所有的指针都指向循环最后一个,因为是同一个指针 。
                    MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
                    MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
                    Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
    //                myNode.Data := MyRecPtr;  //问题在这里                    这句不需要
                    Next;
                end;
            end;
        end;
    //////////
      

  7.   

    这个指针申请了,是不需要释放的!
    TreeView会帮你释放的!
      

  8.   

    在申请指针的时候!
    try
        new(MyRecPtr);
        MyRecPtr^.EmpName := fieldByName('EmpName').AsString;
        MyRecPtr^.EmpID := fieldByName('EmpID').AsInteger ;
        Items.AddChildObject(myNode, MyRecPtr^.EmpName , MyRecPtr);
    except
        FreeMem(MyRecPtr);
    end;
    出了异常,手动释放。没出异常,不用管他。
    不过就为了保存一个整形值,stateindex足够!