Пропустить событие удаления формы
Функция, которую я хочу реализовать, заключается в том, что когда пользователь решает удалить фигуру, я хочу, чтобы у него было предупреждающее сообщение с параметрами да или нет. Если они выбирают нет, я не хочу, чтобы фигура была удалена.
Единственное решение, которое я могу придумать, это блокировка удаления каждой фигуры и использование события 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