我有另一个挑战。有没有人试图拦截复制/粘贴事件?我的目标是防止有人剪切/复制/粘贴已经在工作表上的形状。如果他们从模板上拖下来,那很好。我不能让它们复制现有的形状。为了使这更难一点,它只是我需要防止的形状。如果要复制文本,那很好。
我们有一个订单类型数据库,其中包含需要在Visio工作表上删除的项目。我不能使用shapeID,因为我需要能够从数据库更新形状,并且我不能将ID写回数据库,因为它违反了安全策略。我将两者绑在一起的方式是名为shapeKey的属性,该值在数据被删除时由数据库提供。
当用户需要从数据库刷新工作表时,我会通过形状进行交互,比较形状和数据库中的shapeKey。如果有匹配,我会更新其他属性。如果没有匹配,我想删除形状。如果用户复制形状,shapeKey也将被复制并导致问题。最后,他们可以从模板添加自己的形状,这些形状必须从删除过程中排除
我有两个选择:
我考虑过捕获事件,但我找不到要查找的事件代码。我无法安装具有事件监视器的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)
图层可能有用。所有数据库控制的形状都可以在一个层上,所有用户的形状都在另一个层上,但之前我还没有使用过图层。那会有用吗?如何确定粘贴的任何形状都会进入用户图层?
答案 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添加形状,它就不会触发。这对于我需要的东西来说是完美的,但我会认为掉落形状会增加一个形状。我只寻找一个属性,因为模板上的所有形状都不是来自数据库,对于那些对象,我不需要做任何事情。
这不是我预期的解决方案,但它的效果非常好。