我在窗体的Create事件中建立了树的结点,根结点是设计时指定的.为了让树的TreeNode结点除了显示其相应的标签内容外,我还要求其记录额外的信息,比如人员的编号"rycode",所以我写了一下代吗:
  PPersonRec = ^TPersonRec ;
  TPersonRec = record
    Fis_czy : string;
    Fzycode :string;
end;
procedure TfrmUser.FormCreate(Sender: TObject);
 var CurNode,TreeNode: TTreeNode;
    NoteTitle,ItemCaption:string;
    ListItem: TListItem;
    ColCount,i,j,m:integer;
    RecNum: integer;
    PersonRecPtr :PPersonRec;
begin
    New(PersonRecPtr); //建立记录类型的对象事例
    PersonRecPtr^.Fis_czy:='';
    PersonRecPtr^.Fzycode:='' ;
    //显示树
    TreeNode:=TreeView1.Items.GetFirstNode;
    qryZhiy.Close;
    qryZhiy.SQL.Clear;
    qryZhiy.SQL.Text:='select * from zhiydoc ';
    qryZhiy.Open;
    while not qryZhiy.Eof do
    begin
      NoteTitle :=qryZhiy.FieldValues['zyname'];
      PersonRecPtr^.Fzycode:=qryZhiy.FieldValues['zycode'];
      PersonRecPtr^.Fis_czy:=qryZhiy.FieldValues['is_czy'] ;
    //  CurNode  := TreeView1.Items.AddChild(TreeNode,Trim(NoteTitle));
      CurNode :=TreeView1.Items.AddChildObject(TreeNode,Trim(NoteTitle),PersonRecPtr);
      CurNode.ImageIndex:=5;
      CurNode.SelectedIndex :=5; //选择时显示的图片
      qryZhiy.Next;
    end;
    //显示列表
    qryZhiy.Close;
    qryZhiy.SQL.Clear;
    qryZhiy.SQL.Text:='select * from zhiydoc where beactive='+''''+'是'+'''';
    qryZhiy.Open;
    if qryZhiy.RecordCount>0 then
    begin
    while not qryZhiy.Eof do
    begin
       m:=2;
       ListItem :=ListView1.Items.Add;
       ListItem.Caption:=qryZhiy.FieldValues['zycode'];
        for ColCount:=0 to ListView1.Columns.Count-1 do
        begin
          ItemCaption:=qryZhiy.Fields.Fields[m].Value;
          ListItem.SubItems.Add(ItemCaption);
          Inc(m);
        end;
       qryZhiy.Next;
    end;
    end;end;我同样还要求当我右键单机某个结点时,读取我建立树时存储的'rycode'等信息,以便按rycode查找人员的所有其他信息显示到一个新的窗口执行修改等操作.针对次我写了一下代码:N3为PopUpMenu的一个子项procedure TfrmUser.N3Click(Sender: TObject);
var
    zycode:string;
begin  if TreeView1.Selected.IsFirstNode=false then
  begin
     frmUser.IsDblClick:=true ;  //用于控制人员维护界面的按钮状态
     zycode:=PPersonRec(TreeView1.Selected.Data)^.Fzycode;
     frmUserOper := TfrmUserOper.Create(Self);
     frmUserOper.ShowModal;
     frmUserOper.Free;
  end;end;
问题出现了:无论我右键单机选择那个树的结点,跟踪发现返回的zycode总是一个值,我都快晕了,我是个新手,恳请个位帮忙指点!

解决方案 »

  1.   

    你必须每次使用的时候重新声明,使用完毕后记得释放;
    给你一段代码:
    procedure TfrmStockFind.createTree;
    var
      MyRecPtr: PMyRec;
      AQuery:TADOQuery;
    begin
      tvFind.Items.Clear;
      ANode:=tvFind.Items.Add(nil,'查询方案');
      ANode.ImageIndex :=0;  AQuery:=TADOQuery.Create(nil);
      AQuery.Connection :=dmdb.ADOconn;
      with AQuery do
      begin
        Close;
        sql.Clear;
        sql.Text :='select * from cscxfa where ftype=''1''';
        open;
        first;
        while not eof do
        begin
          New(MyRecPtr); //申请空间
          MyRecPtr^.FID :=fieldbyname('fid').AsString;
          MyRecPtr^.FContent :=fieldbyname('fvalue').AsString;
          BNode:=tvFind.Items.AddChildObject(ANode,fieldbyname('fname').AsString,MyRecPtr);
          BNode.ImageIndex:=1;
          BNode.SelectedIndex :=7;
          MyRecPtr:=nil; //释放
          next;
        end;
      end;
      tvFind.TopItem.Expanded :=true;
    end;