Visio中的Undo和Redo
1.Visio默认Undo和Redo操作是可用的,Appliacation中的UndoEnabled标志Undo和Redo操作是否可用。
m_Visio.Window.Application.UndoEnabled = True
当 Microsoft Visio 启动时,UndoEnabled 属性的值为 True。将 UndoEnabled 属性的值设置为 False 会停止在内存中收集撤消信息,并清除现有的撤消信息。
2.Visio中启动事务,结束事务
Dim vsoTextShape As Visio.Shape
Dim UndoScopeID1 As Long
UndoScopeID1 = m_Visio.Window.Application.BeginUndoScope("添加文本形状")
Set vsoTextShape = m_Visio.Window.Application.ActiveWindow.Page.DrawRectangle(X2, Y2, X2 + 1, Y2 - 0.5)
vsoTextShape.TextStyle = "Normal"
vsoTextShape.LineStyle = "Text Only"
vsoTextShape.FillStyle = "Text Only"
vsoTextShape.CellsSRC(visSectionCharacter, 0, visCharacterColor).FormulaU = "2"
vsoTextShape.CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "8 pt"
vsoTextShape.Characters = "两个输出不可连接"
m_Visio.Window.Application.EndUndoScope UndoScopeID1, True
这样在Undo和Redo操作时,添加文本形状,则以一个整体进行Undo和Redo记录操作,而不会把单元格属性等改变进行单独记录。
3.Visio中撤销所有的Undo队列,Application.PurgeUndo
m_Visio.Window.Application.PurgeUndo
4.操作排队开始事件和结束事件
Private Sub vsoApplication_EnterScope(ByVal app As Visio.IVApplication, ByVal nScopeID As Long, ByVal bstrDescription As String)
'排队内部命令开始时,或当自动化客户端通过使用BeginUndoScope方法打开一个作用域。
' MsgBox (bstrDescription)
End Sub Private Sub vsoApplication_ExitScope(ByVal app As Visio.IVApplication, ByVal nScopeID As Long, ByVal bstrDescription As String, ByVal bErrOrCancelled As Boolean)
'排队内部命令结束时,或当自动化客户端通过使用EndUndoScope方法退出范围。
' MsgBox (bstrDescription)
End Sub
5.清空消息队列事件
Private Sub vsoApplication_VisioIsIdle(ByVal app As Visio.IVApplication) End Sub
Visio 将不断地处理其消息队列中的消息。当其消息队列为空时:
Visio 将执行自己的空闲时间处理。
Visio 将告知 Microsoft Visual Basic for Applications 来执行它的空闲时间处理。
如果消息队列仍然为空,Visio 将触发 VisioIsIdle 事件。
如果消息队列仍然为空,Visio 将调用 WaitMessage,这是对 Microsoft Windows 的调用,在将新消息添加到 Visio 消息队列中之前,将不会返回。
客户端程序可以使用 VisioIsIdle 事件作为执行自己的后台处理的信号。
VisioIsIdle 事件与标准的计时器事件并不等效。需要定期调用的客户端程序应使用标准的计时器技术,因为 Visio 处于空闲状态的持续时间(调用 WaitMessage)不可预测。但是对于只监控 Visio 活动的客户端程序,使用 VisioIsIdle 事件便已足够,因为在WaitMessage 返回到 Visio 之前,自上次触发 VisioIsIdle 事件以来不能有任何 Visio 活动。
6.确定是否调用事件处理程序之间的EnterScope事件和作用域的ExitScope事件 Application.IsInScope
代表范围 ID 的常量以 visCmd 为前缀并由 Visio 类型库声明。您也可以使用由 BeginUndoScope 方法返回的 ID。
您可以在 CellChanged 事件处理程序中使用此属性来确定单元格更改是否是特定操作的结果。
7.确定引起事件触发的范围 ID Application.CurrentScope
Private WithEvents vsoApplication As Visio.Application
Private lngScopeID As Long Public Sub ScopeActions() Dim vsoShape As Visio.Shape 'Set the module level application variable to
'trap Application level events.Set vsoApplication = Application 'Begin a scope, set the module level variable.lngScopeID = Application.BeginUndoScope("Draw Shapes") 'Draw three shapes.Set vsoShape = ActivePage.DrawRectangle(1, 2, 2, 1)
ActivePage.DrawOval 3, 4, 4, 3
ActivePage.DrawLine 4, 5, 5, 4 'Change a cell (which would trigger a cell changed event).vsoShape.Cells("Width").Formula = 5 'End and commit this scope.Application.EndUndoScope lngScopeID, True End Sub Private Sub vsoApplication_CellChanged(ByVal Cell As IVCell) 'Check to see if this cell change is the result of something
'happening within the scope.If vsoApplication.IsInScope(lngScopeID) Then
Debug.Print Cell.Name & " changed in scope "; lngScopeID
End If End Sub Private Sub vsoApplication_EnterScope(ByVal app As IVApplication, _
ByVal nScopeID As Long, _
ByVal bstrDescription As String) If vsoApplication.CurrentScope = lngScopeID Then
Debug.Print "Entering current scope " & nScopeID
Else
Debug.Print "Enter Scope " & bstrDescription & "(" & nScopeID & ")"
End If End Sub Private Sub vsoApplication_ExitScope(ByVal app As IVApplication, _
ByVal nScopeID As Long, _
ByVal strDescription As String, _
ByVal bErrOrCancelled As Boolean) If vsoApplication.CurrentScope = lngScopeID Then
Debug.Print "Exiting current scope " & nScopeID
Else
Debug.Print "ExitScope " & bstrDescription & "(" & nScopeID & ")"
End If End Sub
如果范围没有打开,则返回 visScopeIDInvalid (-1)。范围 ID 可以是对应于 Visio 命令的内部 Microsoft Visio 范围 ID,也可以是由 BeginUndoScope 方法传递给自动化客户机的外部范围 ID。
如果 EnterScope 事件已经触发而 ExitScope 事件却尚未触发,则事件的接收方会认为范围处于打开状态。
要确定事件队列的触发是与应用程序内部的特定范围相关,还是与自动化客户机打开或关闭的范围相关,请使用 IsInScope 属性。
8.Undo和Redo操作
m_Visio.Window.Application.Undo
m_Visio.Window.Application.Redo
使用 Undo 方法一次取消撤消单元的一个动作。
代码可以调用 Undo 方法的次数取决于代码是否在打开的撤消单元范围内执行。在下列任一情况下,代码将在打开的撤消单元范围内运行:
由 Microsoft Visio 用户界面调用宏或加载项。
事件处理程序响应 Visio 事件而不是 VisioIsIdle 事件。
在用户创建的撤消范围中。
如果代码不打开的撤消单元范围内执行的它可以对目前 Visio 撤消堆栈上的每个撤消单元调用Undo方法。您可以设置在撤消堆栈上的最大单位数 (20 是默认值) 上的选项对话框的高级选项卡 (单击文件选项卡,然后单击选项)。如果将Undo方法的调用次数超过堆栈上的撤消单元的数字,不执行任何操作, Undo方法不会引发异常。
如果代码是在打开的撤消单元范围内执行的,它可以对打开的撤消单元中的每个操作调用一次 Undo 方法。如果另外还要调用 Undo 方法,它将引发异常并且不执行任何动作。例如,如果宏中的代码执行两个操作,它可以调用 Undo 方法两次。当该宏第三次调用 Undo方法时,Undo 方法将引发异常。
从撤消单元范围内调用 Undo 方法的代码不能调用 Redo 方法来取消动作。仅当不存在打开的撤消单元时,才可以调用 Redo 方法。
如果 Visio 实例当前正在执行撤消或恢复操作,Undo 方法也将引发异常。要确定 Visio 实例是否正在撤消或恢复,请使用 IsUndoingOrRedoing 属性。
您可以从 VisioIsIdle 事件处理程序调用 Undo 方法,因为仅当 IsUndoingOrRedoing 属性为 False 时才能触发 VisioIsIdle 事件。您也可以从非 Visio 实例调用的代码(例如,从 Visual Basic 编辑器或外部程序调用的代码)调用 Undo 方法。
您可以撤消大多数动作,但不能撤消全部。使用 Redo 方法来取消 Undo 方法的效果。
Visio中的Undo和Redo的更多相关文章
- 数据库中的undo日志、redo日志
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- 理解数据库中的undo日志、redo日志、检查点
数据库存放数据的文件,本文称其为data file. 数据库的内容在内存里是有缓存的,这里命名为db buffer.某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间.对这个数据的 ...
- Oracle 中UNDO与REDO的差别具体解释
一 为了更清楚的看出2者差别,请看下表: UNDO ...
- 命令模式-实现undo和redo
这次实验主要是实现多次redo和undo,即程序的撤回和恢复,这里只实现加法的撤回和恢复. 程序的撤回和恢复就是由所使用的软件来记录操作步骤,可以将数据恢复到某个操作状态. 撤回这个指令很常见,Win ...
- Oracle Undo 和 Redo
1. REDO(重做信息) Redo log file(重做日志文件),是数据库的事务日志. Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件 ...
- 带你从0到1实现canvas的undo和redo功能
不知不觉又到了周末,又到了Fly写文章的日子,今天给大家介绍下一个web中很常见的功能, 就是撤销和复原这样一个功能,对于任何一个画图软件,或者是建模软件.没有撤销和复原.这不是傻了对啊吧,所以本篇文 ...
- Visio中添加、移动或删除形状上的连接点的方法
Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...
- Maya cmds pymel scriptJob() 和 undoInfo() 在回调中撤销(undo)
Maya cmds pymel scriptJob() 和 undoInfo() 在回调中撤销(undo) def myEventFun(): cmds.undoInfo(stateWithoutFl ...
- Visio中方向键不能移动物件而是滚动画布
不知怎么的, 我的Visio中按方向键不能移动目标对象, 效果却是移动整个画布. 上网查了一下, 找到了原因. 因为不知怎么的错按了键盘上的Scroll Lock键, 再按一下就好了. 参考资 ...
随机推荐
- php post提交xml文件
<?php header("Content-type: text/xml;"); // xml code demo $xmlData = '<?xml version= ...
- 转自 阿里云技术文档的 centos + PHP 环境 搭建
产品亮点 1.基于阿里云CentOS7.2镜像 2.采用yum方式安装,软件安装均为默认目录,未作任何修改. 3.采用经典LAMP组合,拓展性强,资源丰富,解决方案较多 4.附带PhpMyadmin和 ...
- elasticsearch 5.x 系列之三 mapping 映射的时候的各个字段的设置
首先看来创建一个mapping 来show show: curl -XPUT "master:9200/zebra_info?pretty" -H 'Content-Type: a ...
- python查询mysql数据
>>>cur.execute("select * from 表名") >>>lines=cur.fetchall() >>>f ...
- 贪心算法之Huffman
Huffman编码,权重越大,离根节点越大.所以就是不断的选取两个最小的树,然后组成一颗新树,加入集合,然后去除已选的两棵树.不断的循环,直到最后的树的集合只剩下一棵,则构建完成,最后输出Huffma ...
- CSS3不一样的下拉选择框
本例中包含两个下拉选择框的动画示例,本例中并未使用select标签.本例中第一个案例也可用于标题.导航栏等位置. 案例一: html布局 <div class="content&quo ...
- Django admin操作
无名小妖 昵称:无名小妖园龄:1年6个月粉丝:22关注:1 +加关注 搜索 常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 Python(1) python3 ...
- Qt用委托绘制需要的图形的步骤
1.拷贝一份option: QStyleOptionViewItemV4 opt = option; 2.获取到widget,也是通过QStyleOptionViewItem &option ...
- error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj
前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...
- RevealTrans图片切换效果
RevealTrans 更新时间:2013-06-01 17:11:59 | RevealTrans兼容性:IE5.5+ 语法: filter : progid:DXImageTransform.Mi ...