傲博编程知识库--总能找到您想要的

首页 »VC MFC 基础 » listctrl:一起讨论一下listctrl如何实现撤销/恢复(undo/redo) 涅? »正文

listctrl:一起讨论一下listctrl如何实现撤销/恢复(undo/redo) 涅?

来源: 发布时间:星期二, 2008年7月8日 浏览:37次 评论:0
程序临近收工,当时夸下的海口一个一个都在完善。唯一让我耿耿于怀的就是程序的撤销/恢复功能。

程序里有一个listctrl控件,对它进行编辑、删除、导入的操作,如何实现撤销/恢复?

我有两个思路:
1:每次操作前保存listctrl内容,写文件。通过读写文件实现撤销/恢复功能;
2:用CArray记录下每次操作的行的内容。要撤销/恢复,读CArray数组就行了。

各位大虾还有其它好点子没?一起讨论一下?


每次对它进行编辑、删除、导入的操作都进行记录,设计自定义结构体数组存储这些信息,数组的大小就是允许undo,redo的最大次数
然后设置一个操作的index,undo就-1,redo就+1
用一个双向链表之类的结构来记录操作,如果喜欢MFC可以用CList类。
没有既简单又高效的方法,任何方式都是可行的。
引用 3 楼 jameshooo 的回复:
没有既简单又高效的方法,任何方式都是可行的。

所以,基本思路就是,保存数据到指定结构,之后读取就可以。读写文件的方法不占内存但是可能速度会慢,其它方法占内存,呵呵
别保存无关数据,用不了多少内存。
引用 3 楼 jameshooo 的回复:
没有既简单又高效的方法,任何方式都是可行的。

我建一个单向链表,记录item项、数据组标志和操作标志(比如新增还是删除),再定义一个指针,作为链表的游标。

不过现在有个问题是,不用的时候,怎么全部清空它们?
用个循环跑到链表末尾,再逐个倒序free()?
引用 8 楼 liyang2049 的回复:
我建一个单向链表,记录item项、数据组标志和操作标志(比如新增还是删除),再定义一个指针,作为链表的游标。

不过现在有个问题是,不用的时候,怎么全部清空它们?
用个循环跑到链表末尾,再逐个倒序free()?

用CList类。或用STL里的LIST都行啊。

日志记录,恢复当前!
用指针记录下,每一次操作的内容
仔细研究了 一下 ,设计了一个双向链表,简单测试是可以实现撤销恢复。

可是现在在程序只里实现了撤销功能。
至于恢复,主要是思路有些乱。


假如说,现在
1添加一行数据,得到状态a;表格内容现在是1
2再添加一行数据,得到状态b;表格内容现在是1,2
3又添加一行数据,得到状态c;表格内容现在是1,2,3
4删除最后一行数据,得到状态d;表格内容现在是1,2
5在删除最后一行数据,得到状态e;表格内容现在是1

现在状态是e,执行撤销:
6执行一次,得到状态d。表格内容现在是1,2
7执行第2次,得到状态c;表格内容现在是1,2,3

8现在进行删除,得到状态f;表格内容现在是1,2

9好了,现在进行撤销操作,得到状态c;表格变为1,2,3
那么,现在能执行恢复吗,恢复到什么状态?
10 如果第9步是撤销,现在继续撤销,得到的状态是??

昏厥,思路非常乱~



撤销恢复列表项目,貌似没有那么简单。
可以简单的建立删除/新增条目。

那么,编辑条目怎么办??
撤销后恢复,恢复后继续操作。逻辑怕不好设置。

暂时没有想到一条链表的解决方案,估计两条链表可以完美解决删除/新增/编辑。
有空看看《设计模式》,应该有帮助。
用数据库的事务回滚处理,编辑完的直接存进去,但是不完全提交事务,如果要恢复,直接从数据库里重新读入数据不提交事务,直到点击保存,提交事务
你的第一种思路就行
。。。。。。。。。。。内容太短
用Memento模式. 楼主可参考一下.

大致如下:
class base
{
  virtual undo();
  virtual redo();
}
class Del:public base
{
数据:
  删除前的数据
  行号
  ....
操作: 
    undo();
    redo();
}
class Mod:public base
{
数据:
    修正前的数据
    修正后的数据
    行号
  ...
操作:
    undo();
    redo();
}

定义一个履历类,存放上面的类指针
class History
{
    CList <base*,base*> cUndo;
    Clist <base*,base*> cRedo
    Add(base *pbase );
}

Undo操作:从cUndo中取指针调用 pOper->undo();
Redo操作:从cRedo中取指针调用 pOper->redo();


可以用链表实现。
其实你的两种方法都可行

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: