IOleParentUndoUnit 介面 (ocidl.h)
可讓復原單位包含子復原單位。 例如,即使涉及一些個別動作,也會將複雜的動作呈現給終端用戶作為單一復原動作。 所有次級復原動作都包含在最上層父復原單位內。
一開始會使用 IOleUndoManager::Open 方法建立父復原單位。 一律應該透過復原管理員完成復原單位的新增作業。 父單元上的 IOleParentUndoUnit::Open 和 IOleParentUndoUnit::Close 方法最終會由復原管理員呼叫。 讓父單位回呼復原管理員會導致無限遞歸。
當父單元開啟時,復原管理員會呼叫 IOleParentUndoUnit::Add 將復原單位新增至其中。 當復原管理員關閉最上層父系時,整個復原單位及其巢狀次級會放在復原堆疊的頂端。
必須先在堆疊上開啟啟用父代,才能新增任何其他復原單位。 如果未開啟堆疊,應該改為清除堆疊。 這是為了確保復原單位只會因為用戶動作而新增,而不是以程式設計方式執行。 例如,如果您的應用程式想要按兩下可復原的特定按鈕,但該相同的動作也會透過物件模型公開。 該動作應該可透過使用者介面復原,但無法復原物件模型,因為您無法還原使用者腳本程式代碼的狀態。 由於相同的程式代碼會在這兩種情況下實作變更,處理按鈕按兩下的 UI 程式代碼應該開啟堆疊上的啟用父代、呼叫適當的程式代碼,然後關閉父單位。 物件模型程式代碼不會開啟父單位,導致清除復原堆疊。
當您不想讓程式代碼呼叫其他您知道的程式代碼可能會嘗試將復原單位新增至堆疊時,就會使用封鎖父代。 例如,如果您呼叫建立復原單位的程式代碼,則應該使用封鎖父代,您的外部程式代碼已經建立,以完全復原所有所需的行為。
當您引發事件以回應用戶動作時,會使用非啟用父代。 只有在事件處理程式嘗試建立復原單位時,才會清除堆疊,但如果沒有任何處理程式存在,則會保留復原堆棧。
如果物件需要建立父單位,有數個案例需要考慮:
- 若要建立啟用父單元,物件會在復原管理員上呼叫 IOleUndoManager::GetOpenParentState ,並檢查傳回值。 如果值S_FALSE,則物件會建立啟用的父代並開啟它。 如果傳回值S_OK,則父系已經開啟。 如果開啟的父系已封鎖 (UAS_BLOCKED 位集) ,或啟用父系 (UAS_BLOCKED 且UAS_NOPARENTENABLE位未設定) ,則不需要建立啟用父系。 如果目前開啟的父系是停用父系 (UAS_NOPARENTENABLE 位集) ,則應該建立啟用父系並開啟以重新啟用新增復原單位。 請注意,UAS_NORMAL值為零,這表示它不存在所有其他位,而且不是可以設定的位旗標。 如果比較 *pdwState 與 UAS_NORMAL,請從 pdwState 與 UAS_MASK 遮罩未使用的位,以允許未來的擴充。
- 若要建立封鎖的父代,物件會呼叫 IOleUndoManager::GetOpenParentState ,並檢查已封鎖的開啟父系。 如果有的話,就不需要建立新的封鎖父代。 否則,物件會建立它,並在堆疊上開啟它。
- 若要建立停用父系,物件會呼叫 IOleUndoManager::GetOpenParentState ,並檢查已封鎖或停用的開啟父系。 如果其中一個存在,就不需要建立新的父代。 否則,物件會建立父代,並在堆疊上開啟它。
當父復原單位標示為封鎖時,它會捨棄它接收的任何復原單位。
繼承
IOleParentUndoUnit 介面繼承自 IOleUndoUnit。 IOleParentUndoUnit 也有下列類型的成員:
方法
IOleParentUndoUnit 介面具有這些方法。
IOleParentUndoUnit::Add 將簡單的復原單位新增至集合。 |
IOleParentUndoUnit::Close 關閉指定的父復原單位。 (IOleParentUndoUnit.Close) |
IOleParentUndoUnit::FindUnit 指出指定的單位是否為這個復原單位的子系或其子系之一,也就是說,如果指定的單位是這個父單位中階層的一部分, |
IOleParentUndoUnit::GetParentState 擷取最內部開啟父復原單位的狀態資訊。 (IOleParentUndoUnit.GetParentState) |
IOleParentUndoUnit::Open 開啟新的父復原單位,這會成為包含單位之復原堆疊的一部分。 |
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | ocidl.h |