Partager via


Interface IOleParentUndoUnit (ocidl.h)

Permet aux unités d’annulation de contenir des unités d’annulation enfants. Par exemple, une action complexe peut être présentée à l’utilisateur final sous la forme d’une action d’annulation unique, même si un certain nombre d’actions distinctes sont impliquées. Toutes les actions d’annulation subordonnées sont contenues dans l’unité d’annulation parente de niveau supérieur.

Une unité d’annulation parente est initialement créée à l’aide de la méthode IOleUndoManager ::Open. L’ajout d’unités d’annulation doit toujours être effectué via le gestionnaire d’annulation. Les méthodes IOleParentUndoUnit ::Open et IOleParentUndoUnit ::Close sur les unités parentes finissent par être appelées par le gestionnaire d’annulation. Le rappel des unités parentes dans le gestionnaire d’annulation entraîne une récursivité infinie.

Lorsqu’une unité parente est ouverte, le gestionnaire d’annulation y ajoute des unités d’annulation en appelant IOleParentUndoUnit ::Add. Lorsque le gestionnaire d’annulation ferme un parent de niveau supérieur, l’unité d’annulation entière avec ses subordonnés imbriqués est placée au-dessus de la pile d’annulation.

Un parent d’activation doit être ouvert sur la pile avant que d’autres unités d’annulation puissent être ajoutées. Si l’un d’eux n’est pas ouvert, la pile doit être effacée à la place. Cela permet de s’assurer que les unités d’annulation sont ajoutées uniquement à la suite d’actions de l’utilisateur et non d’actions programmatiques. Par exemple, si votre application souhaite rendre le clic sur un certain bouton annulable, mais que cette même action est également exposée via le modèle objet. Cette action doit être annulée via l’interface utilisateur, mais pas le modèle objet, car vous ne pouvez pas restaurer l’état du code de script de l’utilisateur. Étant donné que le même code implémente la modification dans les deux cas, le code d’interface utilisateur qui gère le clic sur le bouton doit ouvrir un parent d’activation sur la pile, appeler le code approprié, puis fermer l’unité parente. Le code du modèle objet n’ouvre pas une unité parente, ce qui entraîne l’effacement de la pile d’annulation.

Un parent bloquant est utilisé lorsque vous ne souhaitez pas que votre code appelle un autre code dont vous savez qu’il peut essayer d’ajouter des unités d’annulation à la pile. Par exemple, vous devez utiliser un parent bloquant si vous appelez du code qui crée des unités d’annulation, que votre code externe a déjà créé et qui annule entièrement tout le comportement souhaité.

Un parent non activé est utilisé lorsque vous déclenchez un événement en réponse à une action de l’utilisateur. La pile est effacée uniquement si le gestionnaire d’événements a fait quelque chose qui a tenté de créer une unité d’annulation, mais si aucun gestionnaire n’existe, la pile d’annulation est conservée.

Si un objet doit créer une unité parente, il existe plusieurs cas à prendre en compte :

  • Pour créer une unité parente d’activation, l’objet appelle IOleUndoManager ::GetOpenParentState sur le gestionnaire d’annulation et vérifie la valeur de retour. Si la valeur est S_FALSE, l’objet crée le parent d’activation et l’ouvre. Si la valeur de retour est S_OK, un parent est déjà ouvert. Si le parent ouvert est bloqué (UAS_BLOCKED jeu de bits) ou un parent d’activation (UAS_BLOCKED et UAS_NOPARENTENABLE bits non définis), il n’est pas nécessaire de créer le parent d’activation. Si le parent actuellement ouvert est un parent de désactivation (UAS_NOPARENTENABLE jeu de bits), le parent d’activation doit être créé et ouvert pour réactiver l’ajout d’unités d’annulation. Notez que UAS_NORMAL a une valeur de zéro, ce qui signifie qu’il s’agit de l’absence de tous les autres bits et n’est pas un indicateur de bits qui peut être défini. Si vous comparez *pdwState à UAS_NORMAL, masquez les bits inutilisés de pdwState avec UAS_MASK pour permettre l’expansion future.
  • Pour créer un parent bloqué, l’objet appelle IOleUndoManager ::GetOpenParentState et recherche un parent ouvert déjà bloqué. S’il en existe un, il n’est pas nécessaire de créer le nouveau parent bloquant. Sinon, l’objet le crée et l’ouvre sur la pile.
  • Pour créer un parent de désactivation, l’objet appelle IOleUndoManager ::GetOpenParentState et recherche un parent ouvert bloqué ou en cours de désactivation. Si l’un ou l’autre existe, il n’est pas nécessaire de créer le nouveau parent. Sinon, l’objet crée le parent et l’ouvre sur la pile.
Dans le cas où les indicateurs UAS_NOPARENTENABLE et UAS_BLOCKED sont définis, l’indicateur le plus pertinent pour l’appelant doit être utilisé avec UAS_NOPARENTENABLE prioritaire. Par exemple, si un objet crée une unité d’annulation simple, il doit prêter attention à l’indicateur UAS_NOPARENTENABLE et effacer la pile d’annulation. S’il crée une unité parente d’activation, il doit prêter attention à l’indicateur UAS_BLOCKED et ignorer la création.

Lorsque l’unité d’annulation parente est marquée comme bloquée, elle ignore toutes les unités d’annulation qu’elle reçoit.

Héritage

L’interface IOleParentUndoUnit hérite de IOleUndoUnit. IOleParentUndoUnit a également les types de membres suivants :

Méthodes

L’interface IOleParentUndoUnit a ces méthodes.

 
IOleParentUndoUnit ::Add

Ajoute une unité d’annulation simple à la collection.
IOleParentUndoUnit ::Close

Ferme l'unité d'annulation parente spécifiée. (IOleParentUndoUnit.Close)
IOleParentUndoUnit ::FindUnit

Indique si l’unité spécifiée est un enfant de cette unité d’annulation ou de l’un de ses enfants, c’est-à-dire si l’unité spécifiée fait partie de la hiérarchie dans cette unité parente.
IOleParentUndoUnit ::GetParentState

Récupère les informations d’état sur l’unité d’annulation parente ouverte la plus interne. (IOleParentUndoUnit.GetParentState)
IOleParentUndoUnit ::Open

Ouvre une nouvelle unité d’annulation parente, qui fait partie de la pile d’annulation de l’unité conteneur.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête ocidl.h

Voir aussi

IOleUndoManager

IOleUndoUnit