Controles de ActiveX MFC: serialização
Este artigo descreve como serializar um controle ActiveX.Serialização é o processo de leitura ou gravação em uma mídia de armazenamento persistente, como um arquivo de disco.A biblioteca Microsoft Foundation Class (MFC) fornece suporte interno para serialização na classe CObject.COleControlestende esse suporte para controles de ActiveX através de um mecanismo de troca de propriedade.
Serialização para controles de ActiveX é implementada, substituindo COleControl::DoPropExchange.Essa função, chamado durante o carregamento e salvar o objeto de controle, armazena todas as propriedades implementadas com uma variável de membro ou uma variável de membro com notificação de alteração.
Os tópicos a seguir abordam as principais questões relacionadas a serialização de um controle ActiveX:
Implementação de DoPropExchange função para serializar o objeto de controle
Personalizando o processo de serialização
Implementando o suporte à versão
Implementando a função DoPropExchange
Quando você usar o Assistente de controle de ActiveX para gerar o projeto de controle, várias funções de manipulador padrão são adicionadas automaticamente a 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 de ActiveX:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
Se você deseja tornar persistente uma propriedade, modificar DoPropExchange , adicionando uma chamada para a função de propriedade do exchange.O exemplo a seguir demonstra a serialização de uma propriedade booleana 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 as funções do exchange de propriedade possível que você pode usar para serializar as propriedades do controle:
Funções do exchange de propriedade |
Objetivo |
---|---|
(PX_Blob) |
Serializa um tipo de propriedade de dados do objeto binário grande (BLOB). |
(PX_Bool) |
Serializa um tipo de propriedade booleana. |
(PX_Color) |
Serializa uma propriedade de tipo de cor. |
(PX_Currency) |
Serializa um tipo de AC propriedade (moeda). |
(PX_Double) |
Serializa um tipo de double propriedade. |
(PX_Font) |
Serializa uma propriedade de tipo de fonte. |
(PX_Float) |
Serializa um tipo de float propriedade. |
(PX_IUnknown) |
Serializa uma propriedade do tipo LPUNKNOWN. |
(PX_Long) |
Serializa um tipo de longo propriedade. |
(PX_Picture) |
Serializa um tipo de propriedade Picture. |
(PX_Short) |
Serializa um tipo de curto propriedade. |
(PX_String) |
Serializa um tipo de CString propriedade. |
(PX_ULong) |
Serializa um tipo de ULONG propriedade. |
(PX_UShort) |
Serializa um tipo de USHORT propriedade. |
Para obter mais informações sobre essas funções do exchange de propriedade, consulte Persistência de OLE controles na Referência MFC.
Personalizar o comportamento padrão do DoPropExchange
A implementação padrão de DoPropertyExchange (como mostrado no tópico anterior) faz uma chamada para a classe base COleControl.Isso serializa o conjunto de propriedades automaticamente compatíveis com COleControl, que usa mais espaço de armazenamento que serializar apenas as propriedades personalizadas do controle.Remover esta chamada permite que seu objeto serializar apenas as propriedades que você considera importante.Estados qualquer propriedade ações implementou o controle não ser serializados quando salvar ou carregar o objeto de controle, a menos que adicione explicitamente PX_ chama para eles.
Implementando o suporte à versão
Suporte de versão permite um controle ActiveX revisado para 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 como parte de seus dados persistentes, chamada COleControl::ExchangeVersion no controle de DoPropExchange função.Esta chamada é inserida automaticamente se o controle de ActiveX foi criado usando o Assistente de controle de ActiveX.Pode ser removido se não for necessário suporte de versão.No entanto, o custo de tamanho 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 de ActiveX, adicione uma chamada para COleControl::ExchangeVersion , inserindo a seguinte linha no início do seu DoPropExchange função (antes da chamada para COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
Você pode usar qualquer DWORD como o número de versão.Usam projetos gerados pelo Assistente de controle de ActiveX _wVerMinor e _wVerMajor como padrão.Esses são constantes globais definidas no arquivo de implementação da classe de controle de ActiveX do projeto.No restante do seu DoPropExchange função, você pode chamar CPropExchange::GetVersion a qualquer momento para recuperar a versão que você salvar ou recuperar.
No exemplo a seguir, a versão 1 do exemplo de controle tem uma propriedade de "ReleaseDate".Versão 2 adiciona uma propriedade "OriginalDate".Se o controle é instruído para 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 de versão 2 carrega 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 como terceiro parâmetro ao chamar ExchangeVersion.Neste terceiro parâmetro é opcional e é TRUE por padrão.