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的指標。 它通常是由容器實作。 服務會管理兩個堆疊:復原堆疊和重做堆疊,每個堆疊都包含內嵌物件或容器應用程式本身所產生的復原單位。
復原單位通常是為了回應終端使用者所採取的動作而產生。 物件不會產生程式設計事件的復原動作。 事實上,程式設計事件應該清除復原堆疊,因為程式設計事件可能會使堆疊上的復原單位所做的假設失效。
當物件的狀態變更時,它會建立復原單位,封裝復原該變更所需的所有資訊。 物件會呼叫復原管理員中的方法,將其復原單位放在堆棧上。 然後,當使用者選取復原作業時,復原管理員會從堆棧取出最上方的復原單位,藉由呼叫其 IOleUndoUnit::D o 方法叫用其動作,然後釋放它。 當用戶選取 Redo 作業時,復原管理員會從堆疊取下頂端重做單位、呼叫其 IOleUndoUnit::D o 方法叫用其動作,然後釋放它。
復原管理員有三種狀態:基底狀態、復原狀態和取消復原狀態。 它會以基底狀態開始。 若要從復原堆疊執行動作,它會自行進入復原狀態、在復原單位上呼叫 IOleUndoUnit::D oo ,然後回到基底狀態。 若要從重做堆疊執行動作,它會自行進入重做狀態、在復原單位上呼叫 IOleUndoUnit::D o, 並回到基底狀態。
如果復原管理員在基底狀態時收到新的復原單位,它會將單位放在復原堆疊上,並捨棄整個重做堆棧。 當它處於復原狀態時,它會將傳入單位放在重做堆疊上。 當它處於重做狀態時,它會將它們放在復原堆疊上,而不會排清重做堆疊。
復原管理員也允許物件捨棄從任一堆疊中的任何對象開始的復原或重做堆疊。
主應用程式會決定復原管理員的範圍。 例如,在一個應用程式中,範圍可能位於檔層級;會針對每個文件維護個別的復原管理員;和復原是針對每個文件獨立管理。 不過,另一個應用程式會維護整個應用程式的一個復原管理員,以及一個復原範圍。
錯誤處理
復原作業失敗,且讓檔處於不穩定狀態是復原管理員、復原單位和應用程式本身必須一起運作才能避免的事項。 因此,復原單位、復原管理員,以及使用復原的應用程式或元件必須符合某些需求。
若要執行復原,復原管理員會在一或多個復原單位上呼叫 IOleUndoUnit::D o ,進而包含更多單位。 如果階層中某個位置的單位失敗,錯誤最終會到達復原管理員,負責嘗試將檔的狀態回復到呼叫最後一個最上層單位之前的狀態。 復原管理員會在復原嘗試期間,於新增至重做堆疊的單位上呼叫 IOleUndoUnit::D o 來執行 復原。 如果復原也失敗,則復原管理員會強制放棄所有專案並返回應用程式。 復原管理員會指出復原是否成功,而且應用程式可以根據此動作採取不同的動作,例如重新初始化元件,使其處於已知狀態。
將復原單位新增至堆疊的所有步驟都應該以不可部分完成的方式執行。 也就是說,所有步驟都必須成功,否則所有步驟都不應該成功。
提供復原管理員的主應用程式會決定復原失敗時要採取的動作。 至少應該通知用戶失敗。 復原管理員會告知主應用程式復原是否成功,以及嘗試復原是否成功。 如果復原和復原失敗,主應用程式可以向用戶顯示數個選項,包括立即關閉應用程式。
簡單復原單位在傳回失敗時,不得變更任何物件的狀態。 這包括執行重做時重做堆疊或復原堆疊的狀態。 如果重做成功,也需要它們將對應的單位放在重做或復原堆疊上。 呼叫單元之前和之後,應用程式應該保持穩定。
父復原單位的需求與簡單單位相同,但有一個例外狀況。 如果在另一個子系失敗之前成功一或多個子系,父單位必須在重做堆棧上認可其對應的單位,並將失敗傳回給其父系。 如果沒有子系成功,則父單位只有在已進行需要復原的狀態變更時,才應該認可其重做單位。 例如,假設父單位包含三個簡單單位。 前兩個成功,並將單位新增至重做堆棧,但第三個單位失敗。 此時,父單位會認可其重做單位,並傳回失敗。
做為副作用,父單位絕對不應該變更相依於其子系成功的狀態變更。 這樣做會導致復原行為中斷。 如果父單位進行狀態變更,則應該在呼叫任何子系之前執行這些變更。 然後,如果狀態變更失敗,它不應該認可重做單位,它不應該呼叫任何子系,而且應該將失敗傳回給其父系。
復原管理員有錯誤處理的主要需求:在復原或重做失敗時嘗試復原。
不符合規範的物件
不支援多層級復原的物件可能會導致全域復原服務的嚴重問題。 由於無法依賴 對象來正確更新復原管理員,其他物件所提交的任何單位也會有疑問,因為它們的單位可能依賴不符合規範的物件狀態。 嘗試復原相容對象的單位可能不會成功,因為不符合規範物件中的狀態不相符。
若要偵測不支援多層級復原的物件,請檢查OLEMISC_SUPPORTSMULTILEVELUNDO值。 可以參與全域復原服務的物件會設定此值。
當沒有這個值的物件加入至用戶可見的復原內容時,最佳做法是停用此內容的復原使用者介面。 或者,可能會向使用者顯示對話框,詢問他們是否嘗試提供部分復原支援,以因應新物件的不符合規範。
此外,不相容的物件也可以新增至巢狀容器。 在此情況下,巢狀容器必須通知復原管理員,藉由呼叫 IOleUndoManager::Enable with FALSE,無法再安全地支持復原。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | ocidl.h |