Os controles ActiveX MFC: Serialização
Este artigo discute como serializar um controle ActiveX.Serialização é o processo de leitura ou gravação em uma meio de armazenamento persistente, sistema autônomo um arquivo de disco.A biblioteca Microsoft Foundation Class (MFC) fornece suporte interno para serialização em classe CObject. COleControl estende esse suporte a controles ActiveX através do uso de um mecanismo de troca de propriedade.
Serialização para controles ActiveX é implementada por substituindo COleControl::DoPropExchange.Essa função, chamado durante o carregamento e salvamento do objeto de controle, armazena todas as propriedades implementadas com uma variável de membro ou uma variável de membro com notificação de alterar.
Os tópicos a seguir abordam as principais questões relacionadas à serialização de um controle ActiveX:
Implementação de DoPropExchange função para serializar o objeto de controle
Personalizar o processo de serialização
Implementando o suporte à versão
Implementar a função DoPropExchange
Quando você usar o Assistente de controle ActiveX para gerar o projeto de controle, várias funções do manipulador padrão são adicionadas automaticamente à classe de controle, incluindo a implementação padrão de COleControl::DoPropExchange.O exemplo a seguir mostra o código adicionado às classes criadas com o Assistente de controle ActiveX:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
Se desejar tornar persistente uma propriedade, modificar DoPropExchange adicionando uma telefonar para a função de troca de propriedade. O exemplo a seguir demonstra a serialização de uma propriedade booliano CircleShape personalizada, onde a propriedade CircleShape tem um valor padrão de TRUE:
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
A tabela a seguir lista funções de troca a propriedade possíveis que você pode usar para serializar as propriedades do controle:
Funções de troca de propriedade |
Objetivo |
---|---|
(PX_Blob) |
Serializa um tipo de propriedade de dados de objeto binário grande (BLOB, objeto binário EXTENSO). |
(PX_Bool) |
Serializa um tipo de propriedade booleana. |
(PX_Color) |
Serializa uma propriedade de tipo de cor. |
(PX_Currency) |
Serializa um tipo de CY propriedade (moeda). |
(PX_Double) |
Serializa um tipo de duplopropriedade . |
(PX_Font) |
Serializa uma tipo de propriedade. |
(PX_Float) |
Serializa um tipo de floatpropriedade . |
(PX_IUnknown) |
Uma propriedade do tipo serializaLPUNKNOWN. |
(PX_Long) |
Serializa um tipo de longopropriedade . |
(PX_Picture) |
Serializa um tipo de propriedade imagem. |
(PX_Short) |
Serializa um tipo de curtopropriedade . |
(PX_String) |
Serializa um tipo de CString propriedade. |
(PX_ULong) |
Serializa um tipo de ULONGpropriedade . |
(PX_UShort) |
Serializa um tipo de USHORTpropriedade . |
Para obter mais informações sobre essas funções de troca de propriedade, consulte Persistência de controles OLE in the Referência da MFC.
Personalizar o comportamento padrão do DoPropExchange
A implementação padrão de DoPropertyExchange (sistema autônomo mostrado no tópico anterior) faz uma telefonar para basear classe COleControl. Isso serializa o conjunto de propriedades automaticamente suportadas por COleControl, que usa mais espaço de armazenamento de serialização somente as propriedades personalizadas do controle. Remover esta telefonar permite que seu objeto serializar somente as propriedades que você considera importante.Estados qualquer propriedade ações implementou o controle não serão serializados quando salvar ou carregar o objeto de controle, a menos que você os adicione explicitamente PX_ chama para eles.
Implementando o suporte à versão
Suporte de versão permite que um controle ActiveX revisado adicionar novas propriedades persistentes e ainda ser capaz de detectar e carregar o estado persistente criado por uma versão anterior do controle.Para disponibilizar a versão do controle sistema autônomo parte de seus dados persistentes, telefonar COleControl::ExchangeVersion do controle DoPropExchange função. Essa telefonar é inserida automaticamente se o controle ActiveX foi criado usando o Assistente de controle ActiveX.Pode ser removido se o suporte à versão não for necessário.No entanto, o custo de dimensionar do controle é muito pequeno (4 bytes) para uma maior flexibilidade que oferece suporte à versão.
Se o controle não foi criado com o Assistente de controle ActiveX, adicione uma telefonar para COleControl::ExchangeVersion inserindo a seguinte linha no início do seu DoPropExchange função (antes da telefonar para COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
Você pode usar qualquer DWORD sistema autônomo o número de versão. Projetos criados pelo Assistente de controle ActiveX do ActiveX usar _wVerMinor and _wVerMajor sistema autônomo padrão.Esses são constantes global definidas no arquivo de implementação da classe de controle ActiveX do projeto.Dentro do seu restanteDoPropExchange função, você pode chamar CPropExchange::GetVersion a qualquer momento para recuperar a versão você está salvando ou recuperar.
No exemplo a seguir, versão 1 deste controle de exemplo tem apenas uma propriedade "ReleaseDate".Versão 2 adiciona uma propriedade "OriginalDate".Se o controle é instruído a carregar o estado persistente da versão antiga, ele inicializa a variável de membro para a nova propriedade para um valor padrão.
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
}
else
{
if (pPX->IsLoading())
m_OriginalDate = 0;
}
...
}
Por padrão, um controle "converte" dados antigos para o formato mais recente.Por exemplo, se um controle a versão 2 carrega os dados que foi salvo pela versão 1, ele gravará o formato da versão 2 quando ele for salvo novamente.Se você desejar que o controle para salvar dados no formato última leitura, passar FALSE sistema autônomo um terceiro parâmetro ao chamar ExchangeVersion. Neste terceiro parâmetro é opcional e é TRUE por padrão.