跳过形状删除事件

时间:2017-12-13 17:05:24

标签: vba visio visio-vba

我想要实现的功能是当用户决定删除一个形状时,我希望它们有一个带有是或否选项的警告消息。如果他们选择否,我不希望删除形状。

我能想出的唯一解决方案是锁定每个形状的删除并使用OnBeforeShapeDelete事件。如果用户选择“是”,则删除删除保护。如果用户选择“否”,它将不会删除,但我很生气,每次都会弹出保护气泡(可以关闭吗?)。

在OnBeforeShape事件中有没有办法可以跳过形状的删除事件?或任何其他解决方案?谢谢!

编辑: 我在下面回答了我自己的问题。

3 个答案:

答案 0 :(得分:3)

以QueryCancel开头的事件允许您入侵流。因此,例如,将此添加到ThisDocument将允许您不基于其PrimaryItem是否来自' Process'来删除选择。主:

Private Function Document_QueryCancelSelectionDelete(ByVal Selection As IVSelection) As Boolean
    Dim queryResult As Boolean
    Dim shp As Shape
    Set shp = Selection.PrimaryItem
    If Not shp Is Nothing Then
        If Not shp.Master Is Nothing Then
            If shp.Master.NameU = "Process" Then
                Dim res As VbMsgBoxResult
                res = MsgBox("Are you sure you want to delete '" & shp.NameID & "'?", vbYesNo, "Delete Process shape?")
                If Not res = vbYes Then
                    queryResult = True
                End If
            End If
        End If
    End If

    'Return True to cancel the event
    'Return False to let it continue
    Document_QueryCancelSelectionDelete = queryResult

End Function

您总是要处理选择,而不是将删除事件作为可取消事件的所有内容,但您可以轻松地遍历您的选择并确定是否它是一种有趣的形状。根据您的需要,可以在应用程序,文档(如上所述)或页面级别进行聆听。

答案 1 :(得分:2)

您可以使用

Application.DisplayAlerts = False

然后

Application.DisplayAlerts = True

在形状事件中。

答案 2 :(得分:0)

所以我了解到你无法阻止通过BeforeDeleteEvent删除形状。如果形状具有LockDelete = 1,则不会触发BeforeDeleteEvent。因此,通过消息框删除对象的唯一方法是通过按钮或其他控制事件触发的UI表单。