Как программно отследить удаление объекта

  • Автор темы Автор темы Cyrax
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Cyrax

Топикстартер
10 лет на форуме
Сообщения
588
Реакции
4
Задача: перед удалением некоторого объекта необходимо выполнить некоторые действия, зависящие от свойств удаляемого объекта.
Проблема в том, что имеется только одно событие, генерируемое при удалении объекта - SelectionChange.

Один из вариантов: в Document.History проверяем последнее действие. Если "удаление", то отменяем последнюю операцию, выполняем необходимые действия, затем удаляем объект. Проблема: в объектной модели Corel нет объекта History. Есть только методы Undo и ClearUndoList (может, ошибаюсь ?), с помощью которых вышеописанные операции не выполнишь.

Другой вариант. В обработчике SelectionChange постоянно заносим в свойства документа всю необходимую информацию о выделенном объекте, которая необходима для выполнения наших действий при удалении объекта. Также в свойствах документа сохраняем StaticID последнего выделенного объекта. В этом же обработчике проверяем, уменьшилось ли число объектов по сравнению с предыдущим вызовом обработчика. Если уменьшилось, то берём StaticID последнего выделенного объекта и проверяем его наличие в документе. Если его нет, значит он удалён => выполняем необходимые операции, используя сохранённую в документе информацию, связанную с удалённым объектом.

Есть ли более лаконичный и безопасный способ ?
 
Ответ: Как программно отследить удаление объекта

В обработчике SelectionChange постоянно заносим в свойства документа всю необходимую информацию о выделенном объекте, которая необходима для выполнения наших действий при удалении объекта.
Вы представляете, как будет тормозиться работа с документом?
 
Ответ: Как программно отследить удаление объекта

Вы представляете, как будет тормозиться работа с документом?
Ваше решение.
 
Ответ: Как программно отследить удаление объекта

IMHO, это не бейсиковская задача. Да и вообще, зачем лезть настолько в глубь системных функций?
 
Ответ: Как программно отследить удаление объекта

Втыкай в GlobalMacroStorage:
Код:
Dim WithEvents CurDoc As Document

Private Sub GlobalMacroStorage_WindowActivate(ByVal Doc As Document, ByVal Window As Window)
    Set CurDoc = Doc
End Sub

Private Sub GlobalMacroStorage_WindowDeactivate(ByVal Doc As Document, ByVal Window As Window)
    Set CurDoc = Nothing
End Sub

Private Sub CurDoc_ShapeDelete(ByVal Count As Long)
  MsgBox Count & " shape(s) deleted"
End Sub
Отлов типа удаленного объекта и т.п. делай сам
 
Ответ: Как программно отследить удаление объекта

Да. Всё-таки есть там эти события:
Document events
AfterExport
AfterPrint
AfterSave
BeforeExport
BeforePrint
BeforeSave
Close
LayerActivate
LayerChange
LayerCreate
LayerDelete
Open
PageActivate
PageChange
PageCreate
PageDelete
QueryClose
QueryExport
QueryPrint
QuerySave
SelectionChange
ShapeChange
ShapeCreate
ShapeDelete
ShapeDistort
ShapeMove
ShapeTransform
Было бы ещё лучше c ShapeBeforeDelete...

---------------------------------------------------------------
Поскольку эти события генерируются также и при выполнении макросов, то необходимо отличать операции, выполняемые пользователем, и операции, выполняемые макросом.
Можно ли как-то проверить, выполняется ли в данный момент макрос ? Либо иным способом идентифицировать операции, выполняемые пользователем непосредственно ? Иначе придётся в начале и в конце каждого макроса прописывать дополнительный код, что очень неудобно.
 
Ответ: Как программно отследить удаление объекта

Можно не позволять пользователю взаимодействовать с программой во время выполнения макроса, что, заодно, и ускорит его. Можно завести устанавливаемые-снимаемые флаги выполнения и т.д. и т.п.
 
Ответ: Как программно отследить удаление объекта

Можно не позволять пользователю взаимодействовать с программой во время выполнения макроса
Я имею ввиду то, что макросы сами выполняют операции удаления, изменения и пр. В ходе выполнения некоторых макросов происходят сотни удалений, изменений и пр. Т.е. необходимо (если это возможно в Corel) в обработчике события произвести проверку: обработчик сработал на действие пользователя или на операцию, выполняемую макросом. Обработчик должен срабатывать только на действие пользователя.
Можно ввести флаги (либо просто обнулять/восстанавливать объектную переменную Set curDoc = Nothing). Но эти строки придётся прописывать в начале и в конце каждого макроса. Это сделать можно, но придётся постояно следить, в каких процедурах эти строки должны присутсоввать, в каких - нет (т.к. во вложенных процедурах ничего делать не нужно, манипуляция флагами или переменной curDoc должны происходить только во внешних процедурах-макросах).
Хотелось бы эту проверку выполнять в коде обработчиков средствами Corel'а (без дополнительного кода в тексте процедур-макросов) - если обработчик сработал на действие пользователя, то выполняем код обработчика, иначе - Exit Sub. Так было бы проще (хотя на вызов обработчика тоже уходит процессорное время).
 
Статус
Закрыто для дальнейших ответов.