Kalıcılığı ve Başlatmayı İyileştirme
Varsayılan olarak, denetimdeki kalıcılık ve başlatma işlemi üye işlevi tarafından DoPropExchange
işlenir. Tipik bir denetimde, bu işlev her özellik için bir tane olmak üzere birkaç PX_ işlevine (PX_Color
, PX_Font
vb.) çağrılar içerir.
Bu yaklaşım, başlatma, ikili biçimde kalıcılık ve bazı kapsayıcılar tarafından kullanılan "özellik-çanta" biçiminde kalıcılık için tek DoPropExchange
bir uygulamanın kullanılabilmesi avantajına sahiptir. Bu işlev, özellikler ve varsayılan değerleri hakkındaki tüm bilgileri tek bir yerde sağlar.
Ancak, bu genellik verimlilik pahasına gelir. PX_ işlevleri, doğal olarak daha doğrudan ama daha az esnek yaklaşımlardan daha az verimli olan çok katmanlı uygulamalar aracılığıyla esnekliklerini elde eder. Ayrıca, bir denetim varsayılan değeri bir PX_ işlevine geçirirse, varsayılan değerin mutlaka kullanılamayabileceği durumlarda bile bu varsayılan değerin her seferinde sağlanması gerekir. Varsayılan değerin oluşturulması önemsiz bir görevse (örneğin, değer bir ortam özelliğinden elde edildiğinde), varsayılan değerin kullanılmadığı durumlarda fazladan, gereksiz işler yapılır.
Denetiminizin işlevini geçersiz kılarak denetiminizin Serialize
ikili kalıcılık performansını geliştirebilirsiniz. Bu üye işlevinin varsayılan uygulaması işlevinize DoPropExchange
bir çağrı yapar. Geçersiz kılarak ikili kalıcılık için daha doğrudan bir uygulama sağlayabilirsiniz. Örneğin, şu DoPropExchange
işlevi göz önünde bulundurun:
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(""));
}
Bu denetimin ikili kalıcılığının performansını artırmak için işlevini aşağıdaki gibi geçersiz kılabilirsiniz Serialize
:
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;
}
}
Yerel dwVersion
değişken, denetimin yüklenen veya kaydedilen kalıcı durumunun sürümünü algılamak için kullanılabilir. CPropExchange::GetVersion çağrısı yapmak yerine bu değişkeni kullanabilirsiniz.
Bir BOOL özelliği için kalıcı biçimde biraz alan kazanmak (ve tarafından PX_Bool
üretilen biçimle uyumlu kalmasını sağlamak için) özelliğini aşağıdaki gibi BYTE olarak depolayabilirsiniz:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Yük durumunda, geçici bir değişkenin kullanıldığını ve ardından değerinin bir BYTE başvurusuna m_boolProp ataması yerine atandığını unutmayın. Atama tekniği, yalnızca bir bayt m_boolProp değiştirilmesine ve kalan baytların başlatılmamış olmasına neden olur.
Aynı denetim için, COleControl::OnResetState öğesini aşağıdaki gibi geçersiz kılarak denetimin başlatılmasını iyileştirebilirsiniz:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF, 0x00, 0x00);
m_StringProp.Empty();
}
ve OnResetState
geçersiz kılınmış olsa Serialize
da, DoPropExchange
özellik-çanta biçiminde kalıcılık için hala kullanıldığından işlevin bozulmadan tutulması gerekir. Kapsayıcının hangi kalıcılık mekanizmasını kullandığından bağımsız olarak, denetimin özelliklerini tutarlı bir şekilde yönetmesini sağlamak için bu işlevlerin üçünü de korumak önemlidir.