Пропустить событие удаления формы

Функция, которую я хочу реализовать, заключается в том, что когда пользователь решает удалить фигуру, я хочу, чтобы у него было предупреждающее сообщение с параметрами да или нет. Если они выбирают нет, я не хочу, чтобы фигура была удалена.

Единственное решение, которое я могу придумать, это блокировка удаления каждой фигуры и использование события OnBeforeShapeDelete. Если пользователь выбирает "да", защита от удаления удаляется. Если пользователь выберет "нет", он не будет удален, но меня раздражает, что этот пузырек защиты появляется каждый раз (можно ли его отключить?).

Так есть ли способ в событии OnBeforeShape, где я мог бы пропустить событие удаления формы? Или какие-то другие решения? Спасибо!

РЕДАКТИРОВАТЬ: ответил на мой собственный вопрос ниже.

4 ответа

События, начинающиеся с 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

Вы всегда будете иметь дело с выделением, а не с событиями удаления формы, поскольку это все, что всплывало для отменяемых событий, но вы можете легко перебрать свой выбор и определить, представляет ли он интересующую форму. Прослушивание может происходить на уровне приложения, документа (как указано выше) или страницы в зависимости от ваших потребностей.

Вы можете использовать

Application.DisplayAlerts = False

а потом

Application.DisplayAlerts = True

в форме события.

Итак, я узнал, что вы не можете предотвратить удаление фигуры с помощью BeforeDeleteEvent. Если фигура имеет LockDelete = 1, BeforeDeleteEvent не сработает. Таким образом, единственный способ удалить объект через окно сообщения - через форму пользовательского интерфейса, которая может быть вызвана кнопками или другими управляющими событиями.

       Private Function AxDrawingControl1_QueryCancelSelectionDelete(sender As 
   Object, e As AxMicrosoft.Office.Interop.VisOcx.EVisOcx_QueryCancelSelectionDeleteEvent) As Boolean Handles AxDrawingControl1.QueryCancelSelectionDelete

    Dim Shp As Shape, SelectedShapes As Visio.Selection

    Dim pg As Visio.Page = AxDrawingControl1.Window.Application.ActivePage

    SelectedShapes = e.selection
    For i = 1 To SelectedShapes.Count

        Shp = SelectedShapes(i)
        If MessageBox.Show("Do you want delete - " & Shp.Name, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then

            e.selection.Item(i).Delete()

        Else

        End If

    Next

    Return AxDrawingControl1_QueryCancelSelectionDelete = False

End Function
Другие вопросы по тегам