Word自动化撤销、重做功能

 

功能需求:

在监督监理项目的Word报告模块中,要求实现对Word文件内容操作的撤销、重做功能。

 

实施方案:

采用备忘录模式实现。

要点一:备忘录模式

应用程序在每次操作之后都改变了他的状态。也就是说一个应用程序一旦被操作,它的状态就会被改变。如果要撤消到以前的状态,在应用程序运行的时候,我们必须存储它的状态。为了支持重做,我们还必须从当前的状态回到下一个状态。

为了实现撤消存储应用程序的状态以前的状态,为了实现重做存储应用程序的状态下一状态。解决方案就是维护应用程序的状态来实现撤销/重做。在实现中使用可两个栈。一个存放撤消操作的状态,另外一个存放重做操作的状态。执行撤消操作,撤消堆栈弹出 ,就能得到应用程序的前一个状态。执行重做操作,重做堆栈弹出,获取下一个状态。然后用它们来设置应用程序的状态。

所以,为了实现撤销、重做操作,关键问题就在于如何保存和维护应用程序运行中的各种状态。

 

要点二:采用复制到ClipBoard的对象作为操作状态进行记录

  这一点与最初的想法不同。改变想法的主要原因是:Interop.Word下封装的Com对象,没有提供对序列化的支持,从而不能通过深度复制的办法保存操作状态。

  使用状态的关键点:

(1)       实时记录状态。

  1. 每做一次工具栏上按钮的操作后,都将整个文档的内容选中,复制到剪贴板;
  2. 再由剪贴板获得RTF格式的字符串数据(RTF——>String);
  3. 包装成Memoto对象后,对该对象进行深度复制(序列化/反序列化),得到字符串数据的副本(String——>Memoto对象—>Memoto对象副本);
  4. 将该副本保存在撤销栈中。

 

 

 

(2)       撤销操作。

  1. 删除当前文档的所有内容;
  2. 撤销栈弹栈,获取前一状态对应的包装对象(Memoto对象——>String);
  3. 由该对象取回前一状态对应的RTF格式的字符串数据,在借助剪贴板,存为剪贴上采用Rtf格式的数据(String——>RTF);
  4. 从剪贴板上将内容复制待文档中,这样便实现了对前一状态的还原。
   

 

 

(3)重做操作。

     与(2)同,此处从略。

posted @ 2012-06-13 14:08  prepat  阅读(2381)  评论(0编辑  收藏  举报