Aracılığıyla paylaş


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_Fontvb.) ç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.

Ayrıca bkz.

MFC ActiveX Denetimleri: İyileştirme