Ottimizzazione di persistenza e inizializzazione
Per impostazione predefinita, la persistenza e l'inizializzazione di un controllo vengono gestite dalla funzione membro di DoPropExchange. In un controllo comune, questa funzione contiene chiamate a diverse funzioni di PX_ (PX_Color, PX_Font, e così via), una per ogni proprietà.
Questo approccio offre il vantaggio che un'unica implementazione di DoPropExchange può essere utilizzata per l'inizializzazione, per la persistenza in formato binario e per la persistenza nel cosiddetto formato "del contenitore di proprietà" utilizzato da alcuni contenitori. Questa funzione fornisce tutte le informazioni sulle proprietà e i relativi valori predefiniti in una posizione comoda.
Tuttavia, questa generale non a scapito di efficienza. Le funzioni di PX_ ottenere la flessibilità con implementazioni a più livelli che sono implicitamente meno efficienti di più diretti, ma non il flessibili, approcci. Inoltre, se un controllo passa un valore predefinito a una funzione di PX_, quel valore predefinito è necessario specificare ogni volta, anche nelle situazioni in cui il valore predefinito non è necessariamente essere utilizzato. Se il valore predefinito è un'attività complessa, ad esempio quando il valore viene ottenuto da una proprietà di ambiente), il lavoro aggiuntivo e non viene eseguito nei casi in cui il valore predefinito non viene utilizzato.
È possibile migliorare le prestazioni del binario di persistenza del controllo mediante l'override della funzione di Serialize del controllo. L'implementazione predefinita della funzione membro effettua una chiamata alla funzione di DoPropExchange. Eseguire l'override del metodo, è possibile fornire un'implementazione più diretto per la persistenza binaria. Ad esempio, si consideri la funzione di DoPropExchange :
void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF,0x00,0x00));
PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}
Per migliorare le prestazioni di persistenza binaria del controllo, è possibile eseguire l'override della funzione di Serialize come segue:
void CMyAxOptCtrl::Serialize(CArchive& ar)
{
SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
SerializeExtent(ar);
SerializeStockProps(ar);
if (ar.IsLoading())
{
ar >> m_BoolProp;
ar >> m_ShortProp;
ar >> m_ColorProp;
ar >> m_StringProp;
}
else
{
ar << m_BoolProp;
ar << m_ShortProp;
ar << m_ColorProp;
ar << m_StringProp;
}
}
La variabile locale di dwVersion può essere utilizzata per rilevare la versione dello stato persistente del controllo che viene caricato o salvato. È possibile utilizzare questa variabile anziché chiamare CPropExchange::GetVersion.
Per salvare un poco spazio nel formato persistente per una proprietà di BOOL (e tenerla compatibile con il formato prodotto da PX_Bool), è possibile archiviare la proprietà come BYTE, come segue:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Si noti che nel caso di caricamento, una variabile temporanea viene utilizzato quindi il valore viene assegnato, invece di eseguire il cast m_boolProp su un riferimento di BYTE. La tecnica di cast comporterebbe un solo byte di m_boolProp modificato, lasciando i byte rimanenti non inizializzate.
Per lo stesso controllo, è possibile ottimizzare l'inizializzazione del controllo mediante l'override di COleControl::OnResetState come segue:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF,0x00,0x00);
m_StringProp.Empty();
}
Sebbene Serialize e OnResetState siano stati ignorati, la funzione di DoPropExchange deve essere tenuta invariata in quanto è ancora utilizzata per la persistenza nel formato del contenitore di proprietà. È importante gestire tutti e tre le di queste funzioni per assicurarsi che il controllo gestisce coerente le relative proprietà, indipendentemente dal meccanismo di persistenza il contenitore utilizza.