IOleUndoManager インターフェイス (ocidl.h)
IOleUndoManager インターフェイスを使用すると、コンテナーは、包含コントロール内で発生するアクションに対して、複数レベルの元に戻す操作とやり直し操作を実装できます。
継承
IOleUndoManager インターフェイスは、IUnknown インターフェイスから継承されます。 IOleUndoManager には、次の種類のメンバーもあります。
メソッド
IOleUndoManager インターフェイスには、これらのメソッドがあります。
IOleUndoManager::Add 単純な元に戻す単位をコレクションに追加します。 親の元に戻す単位が開いている間、元に戻すマネージャーは IOleParentUndoUnit::Add を呼び出して元に戻す単位を追加します。 |
IOleUndoManager::Close 指定した親元に戻す単位を閉じます。 (IOleUndoManager.Close) |
IOleUndoManager::D iscardFrom 元に戻すマネージャーに、指定した元に戻す単位とその下にあるすべての元に戻す単位を元に戻すまたはやり直しスタックに破棄するように指示します。 |
IOleUndoManager::Enable 元に戻すマネージャーを有効または無効にします。 |
IOleUndoManager::EnumRedoable 呼び出し元が再実行スタックから一連の最上位の元に戻す単位を反復処理するために使用できる列挙子オブジェクトを作成します。 |
IOleUndoManager::EnumUndoable 元に戻すスタックから一連の最上位の元に戻す単位を反復処理するために呼び出し元が使用できる列挙子オブジェクトを作成します。 |
IOleUndoManager::GetLastRedoDescription やり直しスタックの上にある最上位の元に戻す単位の説明を取得します。 |
IOleUndoManager::GetLastUndoDescription 元に戻すスタックの上にある最上位の元に戻す単位の説明を取得します。 |
IOleUndoManager::GetOpenParentState 最も内側の開いている親の元に戻す単位に関する状態情報を取得します。 (IOleUndoManager.GetOpenParentState) |
IOleUndoManager::Open 新しい親の元に戻す単位を開きます。このユニットは、その元に戻すユニットの元に戻すスタックの一部になります。 |
IOleUndoManager::RedoTo 元に戻す操作を元に戻すマネージャーに指示し、指定した元に戻す単位までやり直しスタックから元に戻す操作を呼び出します。 |
IOleUndoManager::UndoTo 元に戻す操作を元に戻す操作を元に戻す操作を元に戻すように、元に戻す操作を元に戻す操作を元に戻す操作を元に戻す前に、指定した元に戻す単位を含めます。 |
注釈
コントロールは、 IOleUndoUnit インターフェイスを使用して元に戻す単位を作成するか、IOleUndoUnit から派生した IOleParentUndoUnit インターフェイスを使用して親 の元に戻す単位を作成する必要があります。 これらのインターフェイスはいずれも元に戻す操作を実行し、親の元に戻す単位には入れ子になった元に戻す単位を追加で含めることができます。
元に戻すマネージャーは、一元化された元に戻すおよびやり直しサービスを提供します。 元に戻すスタックとやり直しスタックの親元に戻す単位と簡単な元に戻す単位を管理します。 オブジェクトが UI アクティブかどうかに関係なく、元に戻すマネージャーでメソッドを呼び出すことによって、これらのスタックに元に戻す単位を入金できます。
その後、一元化された元に戻すマネージャーには、ホスト アプリケーションの元に戻すユーザー インターフェイスとやり直しユーザー インターフェイスをサポートするために必要なデータがあり、スタックがいっぱいになると、元に戻す情報を徐々に破棄できます。
元に戻すマネージャーはサービスとして実装され、オブジェクトは IServiceProvider インターフェイスから IOleUndoManger へのポインターを取得します。 通常、コンテナーによって実装されます。 このサービスは、元に戻すスタックとやり直しスタックの 2 つのスタックを管理します。それぞれに、埋め込みオブジェクトまたはコンテナー アプリケーション自体によって生成された元に戻す単位が含まれています。
元に戻す単位は、通常、エンド ユーザーが実行したアクションに応答して生成されます。 オブジェクトは、プログラムイベントに対して元に戻す操作を生成しません。 実際、プログラムイベントではスタック上の元に戻す単位によって行われた仮定が無効にされる可能性があるため、プログラムイベントは元に戻すスタックをクリアする必要があります。
オブジェクトの状態が変更されると、その変更を元に戻すために必要なすべての情報をカプセル化する元に戻すユニットが作成されます。 オブジェクトは、元に戻すマネージャーのメソッドを呼び出して、元に戻す単位をスタックに配置します。 次に、エンド ユーザーが元に戻す操作を選択すると、元に戻すマネージャーはスタックから一番上の元に戻す単位を取得し、 IOleUndoUnit::D o メソッドを呼び出してアクションを呼び出し、解放します。 エンド ユーザーがやり直し操作を選択すると、元に戻すマネージャーは、スタックから最上位の再実行単位を取得し、 IOleUndoUnit::D o メソッドを呼び出してアクションを呼び出し、解放します。
元に戻すマネージャーには、基本状態、元に戻す状態、やり直し状態の 3 つの状態があります。 これは、基本状態で開始されます。 元に戻すスタックから操作を実行するには、元に戻す状態になり、元に戻す単位で IOleUndoUnit::D o を呼び出し、基本状態に戻ります。 やり直しスタックからアクションを実行するには、やり直し状態になり、元に戻す単位で IOleUndoUnit::D o を呼び出し、基本状態に戻ります。
元に戻すマネージャーは、基本状態の間に新しい元に戻す単位を受け取った場合、元に戻すスタックにユニットを配置し、やり直しスタック全体を破棄します。 元に戻す状態の間は、受信ユニットをやり直しスタックに配置します。 やり直し状態の間は、やり直しスタックをフラッシュせずに元に戻すスタックに配置します。
また、元に戻すマネージャーを使用すると、オブジェクトは、いずれかのスタック内の任意のオブジェクトから元に戻すスタックまたはやり直しスタックを破棄できます。
ホスト アプリケーションは、元に戻すマネージャーのスコープを決定します。 たとえば、1 つのアプリケーションでは、スコープがドキュメント レベルである可能性があります。ドキュメントごとに個別の元に戻すマネージャーが保持されます。および undo は、ドキュメントごとに個別に管理されます。 ただし、別のアプリケーションでは、アプリケーション全体に対して 1 つの元に戻すマネージャー、つまり 1 つの元に戻すスコープが保持されます。
エラー処理
元に戻す操作が失敗し、ドキュメントを不安定な状態にしておくことは、元に戻すマネージャー、元に戻す単位、およびアプリケーション自体がすべて連携して回避する必要があります。 その結果、元に戻す単位、元に戻すマネージャー、および元に戻すを使用するアプリケーションまたはコンポーネントが準拠している必要がある特定の要件があります。
元に戻す操作を実行するために、元に戻すマネージャーは、1 つ以上の元に戻す単位に対して IOleUndoUnit::D o を呼び出し、さらに多くの単位を含めることができます。 階層内のどこかのユニットが失敗した場合、エラーは最終的に元に戻すマネージャーに到達します。これは、ドキュメントの状態を最後の最上位ユニットへの呼び出しの前の状態にロールバックする操作を行う役割を担います。 元に戻すマネージャーは、元に戻す試行中に再実行スタックに追加されたユニットで IOleUndoUnit::D o を呼び出してロールバックを実行します。 ロールバックも失敗した場合、元に戻すマネージャーは強制的にすべてを破棄し、アプリケーションに戻ります。 元に戻すマネージャーはロールバックが成功したかどうかを示します。アプリケーションは、コンポーネントを再初期化して既知の状態になるようにするなど、これに基づいてさまざまなアクションを実行できます。
スタックに元に戻す単位を追加するすべての手順は、アトミックに実行する必要があります。 つまり、すべてのステップが成功するか、どのステップも成功しない必要があります。
元に戻すマネージャーを提供するホスト アプリケーションは、元に戻す操作が失敗したときに実行する操作を決定します。 少なくとも、ユーザーにエラーを通知する必要があります。 ホスト アプリケーションは、元に戻すが成功したかどうか、および試行されたロールバックが成功したかどうかを元に戻すマネージャーによって伝えられます。 元に戻す操作とロールバックに失敗した場合、ホスト アプリケーションは、アプリケーションを直ちにシャットダウンするなど、いくつかのオプションをユーザーに表示できます。
単純な元に戻す単位は、エラーが返された場合、オブジェクトの状態を変更することはできません。 これには、やり直しを実行する場合はやり直しスタックまたは元に戻すスタックの状態が含まれます。 また、成功した場合は、対応するユニットをやり直しまたは元に戻すスタックに配置する必要があります。 アプリケーションは、ユニットが呼び出される前と後に安定している必要があります。
親の元に戻す単位は、単純単位と同じ要件を持ちますが、1 つの例外があります。 別の子の障害が発生する前に 1 つ以上の子が成功した場合、親ユニットは対応するユニットを再実行スタックにコミットし、その障害を親に返す必要があります。 子が成功しなかった場合、親ユニットはロールバックが必要な状態変更を行った場合にのみ、再実行ユニットをコミットする必要があります。 たとえば、親単位に 3 つの単純な単位が含まれているとします。 最初の 2 つは成功し、再実行スタックにユニットを追加しましたが、3 番目のユニットは失敗しました。 この時点で、親ユニットは再実行ユニットをコミットし、エラーを返します。
副作用として、親ユニットは、子の成功に依存する状態変更を行うべきではありません。 これを行うと、ロールバック動作が中断します。 親ユニットが状態を変更する場合は、子を呼び出す前に行う必要があります。 その後、状態の変更が失敗した場合は、再実行ユニットをコミットせず、子を呼び出さないでください。また、エラーを親に返す必要があります。
元に戻すマネージャーには、元に戻す操作またはやり直しが失敗した場合にロールバックを試みるための 1 つの主な要件があります。
非準拠オブジェクト
複数レベルの元に戻すことがサポートされていないオブジェクトは、グローバルな元に戻すサービスに重大な問題を引き起こす可能性があります。 オブジェクトは元に戻すマネージャーを適切に更新するために依存できないため、他のオブジェクトによって送信された単位も疑われます。これは、その単位が非準拠オブジェクトの状態に依存している可能性があるためです。 非準拠オブジェクトの状態が一致しないため、準拠しているオブジェクトの単位を元に戻そうとしても成功しない可能性があります。
複数レベルの元に戻すことがサポートされていないオブジェクトを検出するには、OLEMISC_SUPPORTSMULTILEVELUNDO値をチェックします。 グローバル元に戻すサービスに参加できるオブジェクトは、この値を設定します。
この値のないオブジェクトをユーザーが表示できる元に戻すコンテキストに追加する場合は、このコンテキストの元に戻すユーザー インターフェイスを無効にすることをお勧めします。 または、ユーザーにダイアログを表示し、部分的な元に戻すサポートを提供するかどうかを尋ね、新しいオブジェクトの非準拠を回避することもできます。
さらに、非準拠オブジェクトを入れ子になったコンテナーに追加できます。 この場合、入れ子になったコンテナーは、 IOleUndoManager::Enable を FALSE で呼び出すことで、元に戻すことが安全にサポートされなくなったことを元に戻すマネージャーに通知する必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | ocidl.h |