Optimalizace trvalosti a inicializace
Ve výchozím nastavení se trvalost a inicializace v ovládacím prvku zpracovávají DoPropExchange
členské funkce. V typickém ovládacím prvku tato funkce obsahuje volání několika PX_ funkcí (PX_Color
PX_Font
atd.), jedna pro každou vlastnost.
Tento přístup má výhodu, že jednu DoPropExchange
implementaci lze použít pro inicializaci, trvalost v binárním formátu a trvalost v tzv. "property-bag" formátu používaném některými kontejnery. Tato funkce poskytuje všechny informace o vlastnostech a jejich výchozích hodnotách na jednom vhodném místě.
Tato generalita ale vychází z hlediska efektivity. Funkce PX_ získají flexibilitu prostřednictvím vícevrstevných implementací, které jsou ze své podstaty méně efektivní než přímé, ale méně flexibilní přístupy. Pokud navíc ovládací prvek předá výchozí hodnotu funkci PX_ , musí být tato výchozí hodnota zadána pokaždé, i v situacích, kdy nemusí být výchozí hodnota nutně použita. Pokud je vygenerováním výchozí hodnoty netriviální úkol (například když je hodnota získána z okolní vlastnosti), pak se nadbytečná práce provádí v případech, kdy se výchozí hodnota nepoužívá.
Výkon binární trvalosti ovládacího prvku můžete zlepšit přepsáním funkce ovládacího prvku Serialize
. Výchozí implementace této členské funkce volá vaši DoPropExchange
funkci. Přepsáním můžete poskytnout přímou implementaci binární trvalosti. Představte si například tuto DoPropExchange
funkci:
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(""));
}
Pokud chcete zvýšit výkon binární trvalosti tohoto ovládacího prvku, můžete funkci přepsat Serialize
následujícím způsobem:
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;
}
}
Místní dwVersion
proměnnou lze použít ke zjištění verze trvalého stavu ovládacího prvku, který se načítá nebo ukládá. Tuto proměnnou můžete použít místo volání CPropExchange::GetVersion.
Pokud chcete ušetřit trochu místa v trvalém formátu pro vlastnost BOOL (a zachovat ji kompatibilní s formátem vytvořeným PX_Bool
), můžete tuto vlastnost uložit jako BYTE takto:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Všimněte si, že v případě zatížení se použije dočasná proměnná a její hodnota se přiřadí, nikoli přetypování m_boolProp na odkaz BYTE . Technika přetypování by způsobila, že se upraví pouze jeden bajt m_boolProp , přičemž zbývající bajty nebudou inicializovány.
Pro stejný ovládací prvek můžete optimalizovat inicializaci ovládacího prvku přepsáním COleControl::OnResetState následujícím způsobem:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF, 0x00, 0x00);
m_StringProp.Empty();
}
I když Serialize
a OnResetState
byly přepsány, funkce by měla být zachována beze změny, DoPropExchange
protože se stále používá pro trvalost ve formátu kontejneru vlastností. Je důležité udržovat všechny tři z těchto funkcí, aby ovládací prvek spravovala jeho vlastnosti konzistentně bez ohledu na to, který mechanismus trvalosti kontejner používá.