если у меня не модальное окно и есть кнопка примерно с таким набором действий:
Я, относительно недавно, пришёл к выводу, что так делать не совсем корректно. Отсюда и возникают потом различные проблемы, типа этой. В чём именно некорректность - в AutoCAD практически любое изменение объекта чертежа происходит в рамках запущенной команды. В базовом AutoCAD я не встречал нарушений этого принципа, в Civil - ловил. Из-за этого, кстати, в Civil были некоторые проблемы.
Вот, например, есть палитра слоёв. Нажимаем кнопку "Создать слой" - запускается команда "-LAYER":
[Doc Event] : Command will Start : -LAYER
...
[Doc Event] : Command Ended : -LAYER
Что даёт такой подход:
- Не нужно никаких телодвижений для выполнения корректной отмены действий. Выполняется стандартная отмена последней команды. Если выполнять изменения вне команды, с отменой есть сложности.
- Команды всегда выполняются последовательно. Нет такого, что одновременно будут выполняться две команды и мешать друг другу. Я сейчас не имею в виду прозрачные команды, только основные.
- Нет проблем с обработкой событий. Всегда будет такой порядок: запущена команда - изменены объекты - завершена команда. Даже если потом другой код будет работать параллельно с нашим, он всегда корректно обработает ситуацию изменения объекта. Не возникнет непонятных ситуаций, когда не выполняется никакая команда, а объекты чертежа почему-то изменяются. Отловить такие изменения можно, но уже гораздо сложнее.
В своём "палитроплагине" мне удалось реализовать такой механизм, чтобы любое изменение объектов происходило через запуск команды. Принцип такой - при изменении пользователем каких-то данных в палитре происходит запоминание действий, которые нужно выполнить и отправка запроса на асинхронное выполнение команды, которая эти изменения будет выполнять. Как только AutoCAD будет готов выполнить эту команду, она запускается. Команда всегда одна и та же, но набор действий, который она выполняет, зависит от действий пользователя в палитре.
Как вам такая идея?