Condividi tramite


Persistenza e ottimizzare l'inizializzazione

Per impostazione predefinita, la persistenza e l'inizializzazione di un controllo sono gestite dalla funzione membro di DoPropExchange .In un controllo normale, 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 di 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_ ottengono la flessibilità con le 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 deve essere fornito ogni volta, anche nelle situazioni in cui il valore predefinito non è necessariamente essere utilizzato.Se generare 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 binarie della persistenza del controllo mediante l'override della funzione di Serialize del controllo.L'implementazione predefinita di questa funzione membro effettua una chiamata alla funzione di DoPropExchange .L'esecuzione dell'override di, è 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 serializzazione 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 il controllo caricato da o salvato.È possibile utilizzare questa variabile anziché chiamare CPropExchange::GetVersion.

Per salvare un poco spazio nel formato persistente per una proprietà di BOOL (e farlo 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 in caso di caricamento, una variabile temporanea viene utilizzato quindi il valore viene assegnato, invece di eseguire il cast m_boolProp a 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 la funzione viene utilizzata per la persistenza nel formato del contenitore di proprietà.È importante gestire tutte e tre le di queste funzioni per assicurarsi che il controllo gestisce coerente le relative proprietà, indipendentemente dal meccanismo di persistenza il contenitore utilizza.

Vedere anche

Concetti

Controlli ActiveX MFC: ottimizzazione