listctrl:一起讨论一下listctrl如何实现撤销/恢复(undo/redo) 涅?来源: 发布时间:星期二, 2008年7月8日 浏览:37次 评论:0
程序临近收工,当时夸下的海口一个一个都在完善。唯一让我耿耿于怀的就是程序的撤销/恢复功能。
程序里有一个listctrl控件,对它进行编辑、删除、导入的操作,如何实现撤销/恢复? 我有两个思路: 1:每次操作前保存listctrl内容,写文件。通过读写文件实现撤销/恢复功能; 2:用CArray记录下每次操作的行的内容。要撤销/恢复,读CArray数组就行了。 各位大虾还有其它好点子没?一起讨论一下? 每次对它进行编辑、删除、导入的操作都进行记录,设计自定义结构体数组存储这些信息,数组的大小就是允许undo,redo的最大次数 然后设置一个操作的index,undo就-1,redo就+1 用一个双向链表之类的结构来记录操作,如果喜欢MFC可以用CList类。 没有既简单又高效的方法,任何方式都是可行的。 所以,基本思路就是,保存数据到指定结构,之后读取就可以。读写文件的方法不占内存但是可能速度会慢,其它方法占内存,呵呵 别保存无关数据,用不了多少内存。 我建一个单向链表,记录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
相关文章
读者评论
发表评论 |
