Aracılığıyla paylaş


Kalıcılık ve başlatma en iyi duruma getirme

Varsayılan olarak, kalıcı ve denetiminde başlatma tarafından işlenmesini DoPropExchange üye işlevi. Tipik bir denetimde bu işlev çağrıları birkaç içeren px_ işlevler (PX_Color, PX_Font, vb.), her özellik için bir tane.

Bu yaklaşımın avantajı vardır, tek bir DoPropExchange uygulaması başlatma, ikili biçimde Kalıcılık ve süreklilik bazı kapsayıcılar tarafından kullanılan Malum "özelliği-bag" biçiminde kullanılabilir. Bu bir işlev özelliklerini ve varsayılan değerlerine uygun bir yerde tüm bilgileri sağlar.

Ancak, bu generality verimlilik pahasına gelir. px_ işlevleri doğası gereği daha az çok katmanlı uygulamaları aracılığıyla kendilerine esneklik daha doğrudan, ancak daha az esnek yaklaşım verimli alın. Ayrıca, bir denetim için varsayılan değer geçerse bir px_ işlev durumlarda varsayılan değer mutlaka kullanılamaz olduğunda bile, her zaman varsayılan değer sağlanmalıdır. Varsayılan değer oluşturma (örneğin, bir ortam özelliği değeri alındığında) yararlanmak kolay görev sonra ekstra, gereksiz iş varsayılan değeri olmayan kullanıldığı durumlarda yapılır.

Denetim 's geçersiz kılarak, denetimin ikili Kalıcılık performansını artırabilir Serialize işlevi. Bu üye işlevi varsayılan uygulama çağrısı yapar, DoPropExchange işlevi. Bunu geçersiz kılarak, daha doğrudan bir uygulama ikili Kalıcılık için sağlayabilir. Örneğin, bunu göz önünde DoPropExchange işlevi:

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ık performansını artırmak için geçersiz kılabilirsiniz Serialize gibi işlev:

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;
    }
}

dwVersion Yerel değişken kalıcı durumunu sürümü yüklü veya kaydedilmiş algılamak için kullanılabilir. Bu değişken yerine arama kullanabilirsiniz CPropExchange::GetVersion.

Kalıcı biçimde biraz kazanmak için bir bool özelliği (ve tarafından üretilen biçim ile uyumlu tutmak için PX_Bool), özellik olarak saklayabilirsiniz bir baytaşağıdaki gibi:

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

Çevrim yerine Yük durumunda geçici değişkeni kullanılır ve sonra değeri atanır unutmayın m_boolProp için bir bayt başvuru. Çevrim tekniği yalnızca bir baytlık içinde olacak m_boolProp değiştirilmesini, bırakarak kalan baytlar başlatılması geri alındı.

Aynı denetim için denetimin başlatma kılarak iyileştirebilirsiniz COleControl::OnResetState gibi:

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF,0x00,0x00);
   m_StringProp.Empty();
}

Ancak Serialize ve OnResetState geçersiz kılınmış, DoPropExchange işlevi tutulan sağlam çünkü hala kalıcı özellik paketi biçiminde için kullanılır. Hangi Kalıcılık bakılmaksızın konteyner düzeneğini denetim özelliklerini tutarlı bir şekilde, yöneten emin olmak için bu işlevlerin üç sağlamak önemlidir.

Ayrıca bkz.

Kavramlar

mfc ActiveX denetimleri: en iyileştirme