Word自动化撤销、重做功能
功能需求:
在监督监理项目的Word报告模块中,要求实现对Word文件内容操作的撤销、重做功能。
实施方案:
采用备忘录模式实现。
要点一:备忘录模式
应用程序在每次操作之后都改变了他的状态。也就是说一个应用程序一旦被操作,它的状态就会被改变。如果要撤消到以前的状态,在应用程序运行的时候,我们必须存储它的状态。为了支持重做,我们还必须从当前的状态回到下一个状态。
为了实现撤消存储应用程序的状态以前的状态,为了实现重做存储应用程序的状态下一状态。解决方案就是维护应用程序的状态来实现撤销/重做。在实现中使用可两个栈。一个存放撤消操作的状态,另外一个存放重做操作的状态。执行撤消操作,撤消堆栈弹出 ,就能得到应用程序的前一个状态。执行重做操作,重做堆栈弹出,获取下一个状态。然后用它们来设置应用程序的状态。
所以,为了实现撤销、重做操作,关键问题就在于如何保存和维护应用程序运行中的各种状态。
要点二:采用复制到ClipBoard的对象作为操作状态进行记录
这一点与最初的想法不同。改变想法的主要原因是:Interop.Word下封装的Com对象,没有提供对序列化的支持,从而不能通过深度复制的办法保存操作状态。
使用状态的关键点:
(1) 实时记录状态。
- 每做一次工具栏上按钮的操作后,都将整个文档的内容选中,复制到剪贴板;
- 再由剪贴板获得RTF格式的字符串数据(RTF——>String);
- 包装成Memoto对象后,对该对象进行深度复制(序列化/反序列化),得到字符串数据的副本(String——>Memoto对象—>Memoto对象副本);
- 将该副本保存在撤销栈中。
(2) 撤销操作。
- 删除当前文档的所有内容;
- 撤销栈弹栈,获取前一状态对应的包装对象(Memoto对象——>String);
- 由该对象取回前一状态对应的RTF格式的字符串数据,在借助剪贴板,存为剪贴上采用Rtf格式的数据(String——>RTF);
- 从剪贴板上将内容复制待文档中,这样便实现了对前一状态的还原。
(3)重做操作。
与(2)同,此处从略。