Поделиться через


Интерфейс IOleParentUndoUnit (ocidl.h)

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

Родительский блок отмены изначально создается с помощью метода IOleUndoManager::Open. Добавление единиц отмены всегда должно выполняться через диспетчер отмены. Методы IOleParentUndoUnit::Open и IOleParentUndoUnit::Close в родительских единицах в конечном итоге вызываются диспетчером отмены. Обратный вызов родительских единиц в диспетчер отмены приведет к бесконечной рекурсии.

Пока родительский блок открыт, диспетчер отмены добавляет в него блоки отмены, вызывая IOleParentUndoUnit::Add. Когда диспетчер отмены закрывает родительский элемент верхнего уровня, вся единица отмены с вложенными подчиненными помещается поверх стека отмены.

Перед добавлением любых других единиц отмены необходимо открыть в стеке. Если он не открыт, стек должен быть очищен. Это позволяет гарантировать, что блоки отмены добавляются только в результате действий пользователя, а не в результате программных действий. Например, если приложение хочет отменить нажатие определенной кнопки, но это же действие также предоставляется через объектную модель. Это действие должно быть невозможно отменить через пользовательский интерфейс, но не объектную модель, так как вы не можете восстановить состояние кода скрипта пользователя. Так как один и тот же код реализует изменение в обоих случаях, код пользовательского интерфейса, обрабатывающий нажатие кнопки, должен открыть в стеке включение родительского элемента, вызвать соответствующий код, а затем закрыть родительскую единицу. Код объектной модели не открывает родительскую единицу, что приводит к очистке стека отмены.

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

Неактивный родительский элемент используется при запуске события в ответ на действие пользователя. Стек будет очищен только в том случае, если обработчик событий выполнил попытку создать единицу отмены, но если обработчик не существует, стек отмены будет сохранен.

Если объекту необходимо создать родительскую единицу, следует учитывать несколько случаев:

  • Чтобы создать включенную родительскую единицу, объект вызывает IOleUndoManager::GetOpenParentState в диспетчере отмены и проверяет возвращаемое значение. Если значение равно S_FALSE, объект создает включение родительского элемента и открывает его. Если возвращаемое значение S_OK, то родительский объект уже открыт. Если открытый родительский элемент заблокирован (UAS_BLOCKED набор битов) или включает родительский элемент (UAS_BLOCKED и UAS_NOPARENTENABLE биты не заданы), то создавать включение родительского элемента не требуется. Если открытый родительский элемент является отключенным родительским элементом (UAS_NOPARENTENABLE набором битов), необходимо создать и открыть его, чтобы повторно включить добавление единиц отмены. Обратите внимание, что UAS_NORMAL имеет нулевое значение, что означает отсутствие всех остальных битов и не является флагом бита, который можно задать. При сравнении *pdwState с UAS_NORMAL замаскировать неиспользуемые биты из pdwState с помощью UAS_MASK, чтобы обеспечить дальнейшее расширение.
  • Чтобы создать заблокированный родительский объект, объект вызывает IOleUndoManager::GetOpenParentState и проверяет наличие открытого родительского элемента, который уже заблокирован. Если он существует, создавать новый блокирующий родительский элемент не требуется. В противном случае объект создает его и открывает в стеке.
  • Чтобы создать отключенный родительский объект, объект вызывает IOleUndoManager::GetOpenParentState и проверяет наличие открытого родительского элемента, который заблокирован или отключен. Если любой из них существует, создавать новый родительский элемент не требуется. В противном случае объект создает родительский объект и открывает его в стеке.
Если заданы флаги UAS_NOPARENTENABLE и UAS_BLOCKED, флаг, наиболее подходящий для вызывающей стороны, следует использовать с UAS_NOPARENTENABLE, имеющими приоритет. Например, если объект создает простую единицу отмены, ему следует обратить внимание на флаг UAS_NOPARENTENABLE и очистить стек отмены. Если создается включающий родительский блок, следует обратить внимание на флаг UAS_BLOCKED и пропустить создание.

Когда родительская единица отмены помечается как заблокированная, она удаляет все полученные единицы отмены.

Наследование

Интерфейс IOleParentUndoUnit наследуется от IOleUndoUnit. IOleParentUndoUnit также имеет следующие типы элементов:

Методы

Интерфейс IOleParentUndoUnit содержит следующие методы.

 
IOleParentUndoUnit::Add

Добавляет простой блок отмены в коллекцию.
IOleParentUndoUnit::Close

Закрывает указанный родительский модуль отмены. (IOleParentUndoUnit.Close)
IOleParentUndoUnit::FindUnit

Указывает, является ли указанная единица дочерним элементом данного блока отмены или одним из ее дочерних элементов, то есть является ли указанная единица частью иерархии в этой родительской единице.
IOleParentUndoUnit::GetParentState

Извлекает сведения о состоянии самой внутренней открытой родительской единицы отмены. (IOleParentUndoUnit.GetParentState)
IOleParentUndoUnit::Open

Открывает новый родительский блок отмены, который становится частью стека отмены содержащего его блока.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header ocidl.h

См. также раздел

IOleUndoManager

IOleUndoUnit