在我的程序里,用了dxdblookupTreeview作为地址栏,工具栏里有一个‘返回’和‘前进‘按纽,我想点击‘返回’的时候,就退到上一次点击的地方,前进则相反请问该如何实现呀!!!!

解决方案 »

  1.   

    每选择一个Node就记录一下,用数组链表都可以,当然还要记住当前的位置然后设置selected就行了
      

  2.   

    类似这类的undo功能,通常都是用链表来实现,
    但是delphi提供了 TList 类,用它就简单了你只要把每次选择的 Node
    List.Add(Node);就算保存了,
    如果后退只需要 读出来上一 List的元素就行了,当然你还需要进行删除维护;这个的好处就是undo能做到无限次;
      

  3.   

    为什么我在changing 事件中加入,会出错呢
    procedure TMain_Form.dxDBTreeView1Changing(Sender: TObject;
      Node: TTreeNode; var AllowChange: Boolean);var
    nodeptr:PNodeData;             //指针
    nodeid:integer;
    Query_ListNode:Tadoquery;
    xm:string;                    //项目
    NAtt:integer;
    lb:string;                   //类型
    bh: string;                  //编号
    desc:string  ;            //描述
    ListItem: TListItem;
    id:integer;
    iIcon:integer;
    dbtreenode:TdxDBTreeNodes;
    nFunc:string;
    p:pnodedata;
    begin dxDBLookupTreeView1.Text:=node.Text;
     //label2.Caption:=dxDBLookupTreeView1.Text;
     label2.Caption:=node.Text; nodeid:=dbtreenode.GetKeyFieldValue(node);
        // showmessage(inttostr(nodeid));
      //--------------------------------------------------
        //showmessage(node.Text);  
           new(p) ;
           p.nodeId:=nodeid;
           p.nodeCaption:=node.Text ;
           nCurrent:=treenodelist.Add(p);//这里出错       showmessage(inttostr(nCurrent));
     //----------------------------------------------------------   //showmessage(inttostr(nodeid)) ;
     Query_ListNode:=Tadoquery.Create(self);
     query_listnode.Connection:=dm.ADOConnection1;
     listview1.Items.Clear;
     with query_listnode do
       begin
        close;
        sql.Clear;
        sql.Add('select * from tree where ParentID=:nodeid');
        parameters.ParamByName('nodeid').Value:=nodeid;
        prepared;
        open ;
        if recordcount<>0 then
         begin
           first;
         while not eof do
            begin
              new(nodeptr);
              id:=fieldbyname('Nodeid').AsInteger;
              xm:=trim(fieldbyname('NodeCaption').AsString);
              nFunc:=trim(fieldbyname('Functions').AsString);
              bh:=trim(fieldbyname('DemandNo').AsString);
              iIcon:=fieldbyname('IconNo').AsInteger;
              nodeptr.nodeCaption:=xm;
              nodeptr.nodeId:=id;
              nodeptr.nodeFunc:=nFunc;
              desc:=trim(fieldbyname('NodeDesc').AsString);
              NAtt:=fieldbyname('NodeAtt').AsInteger;
              if NAtt=1 then
                 lb:='项目组'
               else
                 lb:='项目' ;         listitem:=listview1.Items.Add;
             listitem.Data:=nodeptr;
             listitem.Caption:=xm;
             listitem.ImageIndex:=iIcon ;
             listitem.SubItems.Add(bh);
             listitem.SubItems.Add(lb);
             listitem.SubItems.Add(desc);         next ;
            end;
          end;
         end;
    end;其中nCurrent是private类型的
    treenodelist在窗口 创建的时候创建的并置空!!
      

  4.   

    ……………………TList.Add()是方法,不能赋值地