Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Por padrão, a persistência e a inicialização de um controlo são manipuladas pela função membro DoPropExchange. Em um controle típico, essa função contém chamadas para várias funções PX_ (PX_Color, PX_Font, e assim por diante), uma para cada propriedade.
Essa abordagem tem a vantagem de que uma única DoPropExchange implementação pode ser usada para inicialização, persistência no formato binário e persistência no chamado formato "property-bag" usado por alguns contêineres. Esta função fornece todas as informações sobre as propriedades e seus valores padrão em um local conveniente.
No entanto, esta generalidade é feita à custa da eficiência. As funções PX_ obtêm sua flexibilidade através de implementações multicamadas que são inerentemente menos eficientes do que abordagens mais diretas, mas menos flexíveis. Além disso, se um controle passa um valor padrão para uma função PX_ , esse valor padrão deve ser fornecido sempre, mesmo em situações em que o valor padrão pode não ser necessariamente usado. Se gerar o valor padrão for uma tarefa não trivial (por exemplo, quando o valor é obtido de uma propriedade ambiente), então trabalho extra e desnecessário será feito nos casos em que o valor padrão não for usado.
Você pode melhorar o desempenho de persistência binária do seu controle ao sobrescrever a função Serialize do seu controle. A implementação padrão desta função de membro faz uma chamada para sua DoPropExchange função. Ao substituí-lo, você pode fornecer uma implementação mais direta para persistência binária. Por exemplo, considere esta DoPropExchange função:
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(""));
}
Para melhorar o desempenho da persistência binária desse controle, você pode substituir a Serialize função da seguinte maneira:
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;
}
}
A dwVersion variável local pode ser usada para detetar a versão do estado persistente do controle que está sendo carregada ou salva. Você pode usar essa variável em vez de chamar CPropExchange::GetVersion.
Para salvar um pouco de espaço no formato persistente para uma propriedade BOOL (e mantê-la compatível com o formato produzido pela PX_Bool), você pode armazenar a propriedade como um BYTE, da seguinte maneira:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Observe que, no caso de carregamento, uma variável temporária é usada e, em seguida, seu valor é atribuído, em vez de transmitir m_boolProp para uma referência de BYTE . A técnica de casting resultaria em apenas um byte de m_boolProp sendo modificado, deixando os bytes restantes não inicializados.
Para o mesmo controle, você pode otimizar a inicialização do controle substituindo COleControl::OnResetState da seguinte maneira:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF, 0x00, 0x00);
m_StringProp.Empty();
}
Embora Serialize e OnResetState tenham sido substituídos, a função DoPropExchange deve ser mantida intacta porque ainda é usada para persistência no formato property-bag. É importante manter todas essas três funções para garantir que o controle gerencie suas propriedades de forma consistente, independentemente do mecanismo de persistência usado pelo contêiner.