Visio VBA复制/剪切/粘贴拦截

时间:2015-06-03 12:53:07

标签: visio-vba

我有另一个挑战。有没有人试图拦截复制/粘贴事件?我的目标是防止有人剪切/复制/粘贴已经在工作表上的形状。如果他们从模板上拖下来,那很好。我不能让它们复制现有的形状。为了使这更难一点,它只是我需要防止的形状。如果要复制文本,那很好。

我们有一个订单类型数据库,其中包含需要在Visio工作表上删除的项目。我不能使用shapeID,因为我需要能够从数据库更新形状,并且我不能将ID写回数据库,因为它违反了安全策略。我将两者绑在一起的方式是名为shapeKey的属性,该值在数据被删除时由数据库提供。

当用户需要从数据库刷新工作表时,我会通过形状进行交互,比较形状和数据库中的shapeKey。如果有匹配,我会更新其他属性。如果没有匹配,我想删除形状。如果用户复制形状,shapeKey也将被复制并导致问题。最后,他们可以从模板添加自己的形状,这些形状必须从删除过程中排除

我有两个选择:

  1. 禁用形状剪切/复制/粘贴
  2. 拦截复制/剪切,粘贴时更改属性,以便我知道它是用户粘贴的形状。这是首选,因为它更加用户友好
  3. 我只想到另一种可行的方式。有没有办法锁定形状,以防止复制?如果有锁,那还会锁定位置吗?用户需要能够处理大多数形状。
  4. 我考虑过捕获事件,但我找不到要查找的事件代码。我无法安装具有事件监视器的Visio SDK。显示器可能已向我显示了代码。这里有一些关于我认为是流程的伪代码。

    选项1

    if select item is a shape then
        msgbox "shape copying verboten. please us the stencil"
        clear selected item
    

    选项2

    capture the paste event
        if selected item is a shape then
            vsoShape.Cells("Prop.ShapeKey").Formula = Chr(34) & "protect" & Chr(34)
    

    图层可能有用。所有数据库控制的形状都可以在一个层上,所有用户的形状都在另一个层上,但之前我还没有使用过图层。那会有用吗?如何确定粘贴的任何形状都会进入用户图层?

1 个答案:

答案 0 :(得分:1)

谢谢大家!我确实找到了一个解决方案,它非常优雅。我在这里找到了这个想法并将其改为我需要的东西:

形状添加事件:https://msdn.microsoft.com/en-us/library/office/ff767288.aspx

以下是我提出的建议:

Private Sub Document_ShapeAdded(ByVal vsoShape As Visio.IVShape)
    If vsoShape.CellExistsU("Prop.ShapeName", 0) Then
        vsoShape.CellsU("Prop.ShapeName").Formula = Chr(34) & "ShapeName" & Chr(34)
    End If
End Sub

有趣的是,如果我通过VBA添加形状,它就不会触发。这对于我需要的东西来说是完美的,但我会认为掉落形状会增加一个形状。我只寻找一个属性,因为模板上的所有形状都不是来自数据库,对于那些对象,我不需要做任何事情。

这不是我预期的解决方案,但它的效果非常好。

相关问题