该如何实现呀,给点提示吧???? 在我的程序里,用了dxdblookupTreeview作为地址栏,工具栏里有一个‘返回’和‘前进‘按纽,我想点击‘返回’的时候,就退到上一次点击的地方,前进则相反请问该如何实现呀!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每选择一个Node就记录一下,用数组链表都可以,当然还要记住当前的位置然后设置selected就行了 类似这类的undo功能,通常都是用链表来实现,但是delphi提供了 TList 类,用它就简单了你只要把每次选择的 NodeList.Add(Node);就算保存了,如果后退只需要 读出来上一 List的元素就行了,当然你还需要进行删除维护;这个的好处就是undo能做到无限次; 为什么我在changing 事件中加入,会出错呢procedure TMain_Form.dxDBTreeView1Changing(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean);varnodeptr: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在窗口 创建的时候创建的并置空!! ……………………TList.Add()是方法,不能赋值地 以下代码为什么只能执行一次?再运行就会出现错误"could not convert of type ..."?求高手指教!! 怎样用delphi压缩access数据库? 请教ERP中的库存控制方法! 如何在指定目录中查找文件?(在线) QuickRep问题 : 一页的报表一预览成了150页?每页内容相同。 求助 DBGrid列与列之间进行比较的问题在经等(数据库为sql server,表为动态生成的),急急在线等 求和的问题?? 筛选DBGrid中的记录 用bde连接数据库时,怎样去掉登录框,可否通过编程实现。 关于TQuery的问题 菜鸟求助:关于WORD的问题
但是delphi提供了 TList 类,用它就简单了你只要把每次选择的 Node
List.Add(Node);就算保存了,
如果后退只需要 读出来上一 List的元素就行了,当然你还需要进行删除维护;这个的好处就是undo能做到无限次;
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在窗口 创建的时候创建的并置空!!