Interfaz IOleUndoManager (ocidl.h)

La interfaz IOleUndoManager permite a los contenedores implementar operaciones de deshacer y rehacer de varios niveles para las acciones que se producen dentro de los controles contenidos.

Herencia

La interfaz IOleUndoManager hereda de la interfaz IUnknown . IOleUndoManager también tiene estos tipos de miembros:

Métodos

La interfaz IOleUndoManager tiene estos métodos.

 
IOleUndoManager::Add

Agrega una unidad de deshacer simple a la colección. Mientras se abre una unidad de deshacer primaria, el administrador de deshacer agrega unidades de deshacer a ella llamando a IOleParentUndoUnit::Add.
IOleUndoManager::Close

Cierra la unidad de deshacer primaria especificada. (IOleUndoManager.Close)
IOleUndoManager::D iscardFrom

Indica al administrador de deshacer que descarte la unidad de deshacer especificada y todas las unidades de deshacer debajo de ella en la pila de deshacer o rehacer.
IOleUndoManager::Enable

Habilita o deshabilita el administrador de deshacer.
IOleUndoManager::EnumRedoable

Crea un objeto enumerador que el autor de la llamada puede usar para recorrer en iteración una serie de unidades de deshacer de nivel superior de la pila de rehacer.
IOleUndoManager::EnumUndoable

Crea un objeto enumerador que el autor de la llamada puede usar para recorrer en iteración una serie de unidades de deshacer de nivel superior de la pila de deshacer.
IOleUndoManager::GetLastRedoDescription

Recupera la descripción de la unidad de deshacer de nivel superior que está encima de la pila de rehacer.
IOleUndoManager::GetLastUndoDescription

Recupera la descripción de la unidad de deshacer de nivel superior que está encima de la pila de deshacer.
IOleUndoManager::GetOpenParentState

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

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

Indica al administrador de deshacer que invoque las acciones de deshacer a través de la pila de puesta al día, hasta e incluya la unidad de deshacer especificada.
IOleUndoManager::UndoTo

Indica al administrador de deshacer que invoque las acciones de deshacer a través de la pila de deshacer, hasta e incluya la unidad de deshacer especificada.

Comentarios

El control debe crear una unidad de deshacer con la interfaz IOleUndoUnit o una unidad de deshacer primaria con la interfaz IOleParentUndoUnit derivada de IOleUndoUnit. Ambas interfaces realizan la acción de deshacer y la unidad de deshacer primaria también pueden contener unidades de deshacer anidadas.

El administrador de deshacer proporciona un servicio centralizado de deshacer y rehacer. Administra las unidades de deshacer primarias y las unidades de deshacer simples en las pilas de deshacer y rehacer. Si un objeto está activo en la interfaz de usuario o no, puede depositar unidades de deshacer en estas pilas llamando a métodos en el administrador de deshacer.

A continuación, el administrador de deshacer centralizado tiene los datos necesarios para admitir la interfaz de usuario de deshacer y rehacer para la aplicación host y puede descartar la información de deshacer gradualmente a medida que la pila se llena.

El administrador de deshacer se implementa como un servicio y los objetos obtienen un puntero a IOleUndoManger desde la interfaz IServiceProvider . Normalmente, el contenedor lo implementa. El servicio administra dos pilas, la pila de deshacer y la pila de rehacer, cada una de las cuales contiene unidades de deshacer generadas por objetos incrustados o por la propia aplicación contenedora.

Normalmente, las unidades de deshacer se generan en respuesta a las acciones realizadas por el usuario final. Un objeto no genera acciones de deshacer para eventos mediante programación. De hecho, los eventos de programación deben borrar la pila de deshacer, ya que el evento mediante programación puede invalidar las suposiciones realizadas por las unidades de deshacer de la pila.

Cuando cambia el estado del objeto, crea una unidad de deshacer que encapsula toda la información necesaria para deshacer ese cambio. El objeto llama a los métodos del administrador de deshacer para colocar sus unidades de deshacer en la pila. A continuación, cuando el usuario final selecciona una operación Deshacer, el administrador de deshacer quita la unidad de deshacer superior de la pila, invoca su acción llamando a su método IOleUndoUnit::D o y, a continuación, lo libera. Cuando un usuario final selecciona una operación rehacer, el administrador de deshacer quita la unidad de puesta al día superior de la pila, invoca su acción llamando a su método IOleUndoUnit::D o y, a continuación, lo libera.

El administrador de deshacer tiene tres estados: el estado base, el estado de deshacer y el estado de puesta al día. Comienza en el estado base. Para realizar una acción desde la pila de deshacer, se coloca en el estado de deshacer, llama a IOleUndoUnit::D o en la unidad de deshacer y vuelve al estado base. Para realizar una acción desde la pila de rehacer, se coloca en el estado de puesta al día, llama a IOleUndoUnit::D o en la unidad de deshacer y vuelve al estado base.

Si el administrador de deshacer recibe una nueva unidad de deshacer mientras se encuentra en el estado base, coloca la unidad en la pila de deshacer y descarta toda la pila de rehacer. Mientras está en estado de deshacer, coloca las unidades entrantes en la pila de rehacer. Mientras está en estado de puesta al día, los coloca en la pila de deshacer sin vaciar la pila de rehacer.

El administrador de deshacer también permite a los objetos descartar la pila de deshacer o rehacer a partir de cualquier objeto de cualquiera de las pilas.

La aplicación host determina el ámbito de un administrador de deshacer. Por ejemplo, en una aplicación, el ámbito podría estar en el nivel de documento; se mantiene un administrador de deshacer independiente para cada documento; y deshacer se administran de forma independiente para cada documento. Sin embargo, otra aplicación mantiene un administrador de deshacer y, por lo tanto, un ámbito de deshacer para toda la aplicación.

Tratamiento de errores

Si se produce un error en una operación de deshacer y se deja el documento en un estado inestable, es algo que el administrador de deshacer, las unidades de deshacer y la propia aplicación tienen que trabajar juntos para evitarlo. Como resultado, hay ciertos requisitos en los que deben cumplirse las unidades de deshacer, el administrador de deshacer y la aplicación o el componente mediante deshacer.

Para realizar una deshacer, el administrador de deshacer llama a IOleUndoUnit::D o en una o varias unidades de deshacer que, a su vez, pueden contener más unidades. Si se produce un error en una unidad en algún lugar de la jerarquía, el error llegará finalmente al administrador de deshacer, que es responsable de intentar revertir el estado del documento a lo que estaba antes de la llamada a la última unidad de nivel superior. El administrador de deshacer realiza la reversión llamando a IOleUndoUnit::D o en la unidad que se agregó a la pila de rehacer durante el intento de deshacer. Si también se produce un error en la reversión, el administrador de deshacer se ve obligado a abandonar todo y volver a la aplicación. El administrador de deshacer indica si la reversión se realizó correctamente y la aplicación puede realizar diferentes acciones en función de esto, como reinicializar componentes para que estén en un estado conocido.

Todos los pasos para agregar una unidad de deshacer a la pila deben realizarse de forma atómica. Es decir, todos los pasos deben realizarse correctamente o ninguno de ellos debe realizarse correctamente.

La aplicación host que proporciona el administrador de deshacer decide qué acción realizar cuando se produce un error en la deshacer. Al menos, debe informar al usuario del error. El administrador de deshacer indicará a la aplicación host si la operación de deshacer se realizó correctamente y si el intento de reversión se realizó correctamente. En caso de que se produzca un error en la deshacer y revertir, la aplicación host puede presentar al usuario varias opciones, incluido el apagado inmediato de la aplicación.

Las unidades de deshacer simples no deben cambiar el estado de ningún objeto si devuelven un error. Esto incluye el estado de la pila de rehacer o deshacer si se realiza una puesta al día. También son necesarios para colocar una unidad correspondiente en la pila de rehacer o deshacer si se realizan correctamente. La aplicación debe ser estable antes y después de llamar a la unidad.

Las unidades de deshacer primarias tienen los mismos requisitos que las unidades simples, con una excepción. Si uno o varios elementos secundarios se realizaron correctamente antes del error de otro elemento secundario, la unidad primaria debe confirmar su unidad correspondiente en la pila de puesta al día y devolver el error a su elemento primario. Si ningún elemento secundario se realizó correctamente, la unidad primaria debe confirmar su unidad de puesta al día solo si ha realizado un cambio de estado que debe revertirse. Por ejemplo, supongamos que una unidad primaria contiene tres unidades sencillas. Las dos primeras se realizaron correctamente y agregaron unidades a la pila de puesta al día, pero se produjo un error en la tercera. En este momento, la unidad primaria confirma su unidad de puesta al día y devuelve el error.

Como efecto secundario, la unidad primaria nunca debe realizar cambios de estado que dependan del éxito de sus elementos secundarios. Esto hará que el comportamiento de reversión se interrumpa. Si una unidad primaria realiza cambios de estado, debe hacerlos antes de llamar a los elementos secundarios. Después, si se produce un error en el cambio de estado, no debe confirmar su unidad de puesta al día, no debe llamar a ningún elemento secundario y debe devolver el error a su elemento primario.

El administrador de deshacer tiene un requisito principal para el control de errores: para intentar revertir cuando se produce un error de deshacer o rehacer.

Objetos no compatibles

Los objetos que no admiten deshacer de varios niveles pueden causar problemas graves para un servicio de deshacer global. Puesto que no se puede confiar en el objeto para actualizar correctamente el administrador de deshacer, las unidades enviadas por otros objetos también son sospechosas, ya que sus unidades pueden depender del estado del objeto no compatible. Es posible que el intento de deshacer las unidades de un objeto compatible no se realice correctamente, ya que el estado del objeto no compatible no coincidirá.

Para detectar objetos que no admiten deshacer de varios niveles, compruebe el valor de OLEMISC_SUPPORTSMULTILEVELUNDO. Un objeto que puede participar en el servicio de deshacer global establece este valor.

Cuando un objeto sin este valor se agrega a un contexto de deshacer visible para el usuario, el procedimiento recomendado es deshabilitar la interfaz de usuario de deshacer para este contexto. Como alternativa, se puede presentar un cuadro de diálogo al usuario, preguntándoles si se intenta proporcionar compatibilidad parcial para deshacer, trabajando en torno al incumplimiento del nuevo objeto.

Además, los objetos no compatibles se pueden agregar a contenedores anidados. En este caso, el contenedor anidado debe notificar al administrador de deshacer que la deshacer ya no se puede admitir de forma segura mediante una llamada a IOleUndoManager::Enable con FALSE.

Requisitos

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

Consulte también

IOleParentUndoUnit

IOleUndoUnit