程序临近收工,当时夸下的海口一个一个都在完善。唯一让我耿耿于怀的就是程序的撤销/恢复功能。程序里有一个listctrl控件,对它进行编辑、删除、导入的操作,如何实现撤销/恢复?我有两个思路:
1:每次操作前保存listctrl内容,写文件。通过读写文件实现撤销/恢复功能;
2:用CArray记录下每次操作的行的内容。要撤销/恢复,读CArray数组就行了。各位大虾还有其它好点子没?一起讨论一下?

解决方案 »

  1.   

    每次对它进行编辑、删除、导入的操作都进行记录,设计自定义结构体数组存储这些信息,数组的大小就是允许undo,redo的最大次数
    然后设置一个操作的index,undo就-1,redo就+1
      

  2.   

    用一个双向链表之类的结构来记录操作,如果喜欢MFC可以用CList类。
      

  3.   

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

  4.   

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

  5.   

    仔细研究了 一下 ,设计了一个双向链表,简单测试是可以实现撤销恢复。可是现在在程序只里实现了撤销功能。
    至于恢复,主要是思路有些乱。
    假如说,现在
    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,38现在进行删除,得到状态f;表格内容现在是1,29好了,现在进行撤销操作,得到状态c;表格变为1,2,3
     那么,现在能执行恢复吗,恢复到什么状态?
    10 如果第9步是撤销,现在继续撤销,得到的状态是??昏厥,思路非常乱~
      

  6.   

    用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();