Interfaz IOleParentUndoUnit (ocidl.h)

Permite que las unidades de deshacer contengan unidades de deshacer secundarias. Por ejemplo, una acción compleja se puede presentar al usuario final como una única acción de deshacer, aunque haya una serie de acciones independientes implicadas. Todas las acciones de deshacer subordinadas se encuentran dentro de la unidad de deshacer primaria de nivel superior.

Inicialmente se crea una unidad de deshacer primaria mediante el método IOleUndoManager::Open. La adición de unidades de deshacer siempre debe realizarse a través del administrador de deshacer. Los métodos IOleParentUndoUnit::Open e IOleParentUndoUnit::Close en unidades primarias terminarán siendo llamados por el administrador de deshacer. Si las unidades primarias vuelven a llamar al administrador de deshacer, se producirá una recursividad infinita.

Mientras una unidad primaria está abierta, el administrador de deshacer agrega unidades de deshacer a ella mediante una llamada a IOleParentUndoUnit::Add. Cuando el administrador de deshacer cierra un elemento primario de nivel superior, toda la unidad de deshacer con sus subordinados anidados se coloca en la parte superior de la pila de deshacer.

Es necesario abrir un elemento primario de habilitación en la pila antes de que se puedan agregar otras unidades de deshacer. Si no está abierto, la pila debe borrarse en su lugar. Esto es para asegurarse de que las unidades de deshacer solo se agreguen como resultado de acciones de usuario y no de acciones mediante programación. Por ejemplo, si la aplicación quiere hacer clic en un botón determinado que no se puede deshacer, pero esa misma acción también se expone a través del modelo de objetos. Esa acción debe deshacerse a través de la interfaz de usuario, pero no el modelo de objetos porque no se puede restaurar el estado del código de script del usuario. Dado que el mismo código implementa el cambio en ambos casos, el código de interfaz de usuario que controla el clic del botón debe abrir un elemento primario de habilitación en la pila, llamar al código adecuado y, a continuación, cerrar la unidad primaria. El código del modelo de objetos no abriría una unidad primaria, lo que provocaba que se borrara la pila de deshacer.

Se usa un elemento primario de bloqueo cuando no desea que el código llame a otro código que sepa que puede intentar agregar unidades de deshacer a la pila. Por ejemplo, debe usar un elemento primario de bloqueo si llama al código que crea unidades de deshacer, que el código externo ya ha creado que deshacerá completamente todo el comportamiento deseado.

Cuando se desencadena un evento en respuesta a una acción del usuario, se usa un elemento primario que no habilita. La pila solo se borraría si el controlador de eventos hizo algo que intentó crear una unidad de deshacer, pero si no existe ningún controlador, se conservará la pila de deshacer.

Si un objeto necesita crear una unidad primaria, hay varios casos que se deben tener en cuenta:

  • Para crear una unidad primaria de habilitación, el objeto llama a IOleUndoManager::GetOpenParentState en el administrador de deshacer y comprueba el valor devuelto. Si el valor es S_FALSE, el objeto crea el elemento primario de habilitación y lo abre. Si el valor devuelto es S_OK, ya hay un elemento primario abierto. Si el elemento primario abierto está bloqueado (UAS_BLOCKED conjunto de bits) o si se habilita un elemento primario (UAS_BLOCKED y UAS_NOPARENTENABLE bits no establecidos), no es necesario crear el elemento primario de habilitación. Si el elemento primario abierto actualmente es un elemento primario deshabilitado (UAS_NOPARENTENABLE conjunto de bits), se debe crear y abrir el elemento primario de habilitación para volver a habilitar la adición de unidades de deshacer. Tenga en cuenta que UAS_NORMAL tiene un valor de cero, lo que significa que es la ausencia de todos los demás bits y no es una marca de bits que se puede establecer. Si compara *pdwState con UAS_NORMAL, enmascara los bits sin usar de pdwState con UAS_MASK para permitir la expansión futura.
  • Para crear un elemento primario bloqueado, el objeto llama a IOleUndoManager::GetOpenParentState y comprueba si hay un elemento primario abierto que ya está bloqueado. Si existe, no es necesario crear el nuevo elemento primario de bloqueo. De lo contrario, el objeto lo crea y lo abre en la pila.
  • Para crear un elemento primario deshabilitado, el objeto llama a IOleUndoManager::GetOpenParentState y comprueba si hay un elemento primario abierto bloqueado o deshabilitado. Si existe alguno, no es necesario crear el nuevo elemento primario. De lo contrario, el objeto crea el elemento primario y lo abre en la pila.
En caso de que se establezcan las marcas de UAS_NOPARENTENABLE y UAS_BLOCKED, se debe usar la marca más relevante para el autor de la llamada con UAS_NOPARENTENABLE teniendo prioridad. Por ejemplo, si un objeto crea una unidad de deshacer simple, debe prestar atención a la marca UAS_NOPARENTENABLE y borrar la pila de deshacer. Si crea una unidad primaria que habilita, debe prestar atención a la marca UAS_BLOCKED y omitir la creación.

Cuando la unidad de deshacer primaria está marcada como bloqueada, descarta las unidades de deshacer que recibe.

Herencia

La interfaz IOleParentUndoUnit hereda de IOleUndoUnit. IOleParentUndoUnit también tiene estos tipos de miembros:

Métodos

La interfaz IOleParentUndoUnit tiene estos métodos.

 
IOleParentUndoUnit::Add

Agrega una unidad de deshacer simple a la colección.
IOleParentUndoUnit::Close

Cierra la unidad de deshacer primaria especificada. (IOleParentUndoUnit.Close)
IOleParentUndoUnit::FindUnit

Indica si la unidad especificada es un elemento secundario de esta unidad de deshacer o uno de sus elementos secundarios, es decir, si la unidad especificada forma parte de la jerarquía de esta unidad primaria.
IOleParentUndoUnit::GetParentState

Recupera información de estado sobre la unidad de deshacer primaria abierta más internamente. (IOleParentUndoUnit.GetParentState)
IOleParentUndoUnit::Open

Abre una nueva unidad de deshacer primaria, que se convierte en parte de la pila de deshacer de la unidad contenedora.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado ocidl.h

Consulte también

IOleUndoManager

IOleUndoUnit