MFC ActiveX 控制項: 序列化
本文將告訴您如何將 ActiveX 控制項的序列化。序列化是讀取或寫入到持續性儲存媒體,如磁碟檔案的程序。(MFC) 程式庫提供內建支援序列化類別中的CObject。COleControl延伸至 ActiveX 控制項,透過屬性交換機制的使用這項支援。
覆寫由存取關聯式資料庫的 ActiveX 控制項的序列化 COleControl::DoPropExchange。這個函式,在載入時呼叫,並儲存的控制項物件,將儲存與成員變數或具變更通知的成員變數實作的所有屬性。
下列主題涵蓋有關序列化 ActiveX 控制項的主要問題:
實作DoPropExchange 函式來序列化控制項物件
自訂序列化處理序
實作版本支援
實作 DoPropExchange 函式
當您使用 ActiveX 控制項精靈來產生控制項專案時,數個預設處理常式函式會自動新增到控制項類別,其中包括的預設實作 COleControl::DoPropExchange。下列範例顯示使用 ActiveX 控制項精靈所建立的類別所加入的程式碼:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
如果您想要將屬性設為永久性,修改DoPropExchange藉由加入屬性交換函式的呼叫。下列範例示範的序列化自訂,則為 True 的 CircleShape 屬性,其中的 CircleShape 屬性都有預設值為 ,則為 TRUE:
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
下表列出可能的屬性交換函式可用來序列化控制項的屬性:
屬性交換函式 |
用途 |
---|---|
PX_Blob) |
將序列化為二進位大型物件 (BLOB) 資料屬性的型別。 |
PX_Bool) |
將序列化的布林值屬性的型別。 |
PX_Color) |
將序列化的型別色彩屬性。 |
PX_Currency) |
序列化一種型別 CY (貨幣) 的屬性。 |
PX_Double) |
序列化一種型別雙屬性。 |
PX_Font) |
序列化一字型型別屬性。 |
PX_Float) |
序列化一種型別浮點數屬性。 |
PX_IUnknown) |
序列化屬性型別的LPUNKNOWN。 |
PX_Long) |
序列化一種型別長屬性。 |
PX_Picture) |
將序列化為 「 圖片 」 屬性的型別。 |
PX_Short) |
序列化一種型別短屬性。 |
PX_String) |
序列化一種型別CString屬性。 |
PX_ULong) |
序列化一種型別 ULONG 屬性。 |
PX_UShort) |
序列化一種型別 USHORT 屬性。 |
如需有關這些屬性交換函式的詳細資訊,請參閱的持續性的 OLE 控制項的 在 MFC 參考手冊 》。
自訂預設的行為 DoPropExchange
預設實作的 DoPropertyExchange (如前一主題所示) 中,會呼叫基底類別COleControl。這將會序列化的屬性會自動支援的COleControl,這麼做會使用更多儲存空間比序列化控制項的自訂屬性。移除這個呼叫,可讓您只序列化那些屬性您認為重要的物件。當儲存或載入的控制項物件,除非您明確地加入已經實作的控制項的任何內建屬性狀態不會序列化 PX_ 呼叫它們。
實作版本支援
版本支援可讓修改過的 ActiveX 控制項來加入新的永續性屬性,而且仍然可以偵測並載入永續性控制項的較早版本所建立的狀態。若要讓控制項的版本可以使用其永續性資料的一部份,呼叫 COleControl::ExchangeVersion 在控制項的DoPropExchange函式。如果使用 ActiveX 控制項精靈建立 ActiveX 控制項,會自動插入這個呼叫。如果不需要版本支援,即可以予以移除。不過,在控制項大小的成本非常小 (4 個位元組) 的版本支援可提供額外的彈性。
如果不使用 ActiveX 控制項精靈建立控制項,加入呼叫到COleControl::ExchangeVersion插入下面這一行的開頭您DoPropExchange函式 (若要在呼叫之前COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
您可以使用任何DWORD做為版本號碼。ActiveX 控制項精靈所產生的專案使用 _wVerMinor 和 _wVerMajor 的預設值。這些都是專案的 ActiveX 控制項類別的實作檔中定義的全域常數。內的其餘部分您DoPropExchange函式,您就可以呼叫 CPropExchange::GetVersion 在任何時候,擷取您要儲存或擷取的版本。
在下列範例中,這個範例控制項的第 1 版都只能有"ReleaseDate"屬性。第 2 版,將"OriginalDate"屬性。如果控制項已經收到指示從舊的版本載入持續性狀態,會將成員變數初始化為新的屬性設為預設值。
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
}
else
{
if (pPX->IsLoading())
m_OriginalDate = 0;
}
...
}
將根據預設,控制項""舊資料轉換成最新的格式。比方說,如果控制項的版本 2 載入儲存於版本 1 的資料,它會寫入第 2 版格式一次儲存時。如果您想要將資料儲存在格式上一次讀取的控制項,則會傳遞 ,則為 FALSE 做為第三個參數呼叫時ExchangeVersion。這個第三個參數是選擇性的而且是 ,則為 TRUE 預設狀況下。