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.
Este artigo descreve como serializar um controle ActiveX. A 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.
COleControl estende esse suporte aos controles ActiveX por meio do uso de um mecanismo de troca de propriedades.
Importante
ActiveX é uma tecnologia herdada que não deve ser usada para novos desenvolvimentos. Para obter mais informações sobre tecnologias modernas que substituem o ActiveX, consulte Controles ActiveX.
A serialização para controlos ActiveX é implementada substituindo COleControl::DoPropExchange. Esta função, chamada durante o carregamento e salvamento do objeto de controle, armazena todas as propriedades implementadas com uma variável membro ou uma variável membro com notificação de alteração.
Os tópicos a seguir abordam os principais problemas relacionados à serialização de um controle ActiveX:
Implementando
DoPropExchangea função para serializar seu objeto de controle
Implementando a função DoPropExchange
Quando você usa o Assistente de controle ActiveX para gerar o projeto de controle, várias funções de manipulador padrão são adicionadas automaticamente à classe de controle, incluindo a implementação padrão de COleControl::D oPropExchange. 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 você quiser tornar uma propriedade persistente, modifique DoPropExchange adicionando uma chamada à função de troca de propriedade. O exemplo a seguir demonstra a serialização de uma propriedade Boolean 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 possíveis funções de troca de propriedade que você pode usar para serializar as propriedades do controle:
| Funções de troca de propriedade | Propósito |
|---|---|
| PX_Blob( ) | Serializa uma propriedade de dados do tipo BLOB (Binary Large Object). |
| PX_Bool( ) | Serializa uma propriedade do tipo Booleano. |
| PX_Color( ) | Serializa uma propriedade de cor de tipo. |
| PX_Currency( ) | Serializa uma propriedade do tipo CY (moeda). |
| PX_Double( ) | Serializa uma propriedade do tipo double. |
| PX_Font( ) | Serializa uma propriedade do tipo de fonte. |
| PX_Float( ) | Serializa uma propriedade do tipo float. |
| PX_IUnknown( ) | Serializa uma propriedade do tipo LPUNKNOWN. |
| PX_Long( ) | Serializa uma propriedade do tipo long. |
| PX_Picture( ) | Serializa uma propriedade de tipo Picture. |
| PX_Short( ) | Serializa uma propriedade do tipo short. |
| PXstring( ) | Serializa uma propriedade do tipo CString. |
| PX_ULong( ) | Serializa uma propriedade do tipo ULONG . |
| PX_UShort( ) | Serializa uma propriedade do tipo USHORT. |
Para obter mais informações sobre essas funções de intercâmbio de propriedades, consulte Persistência de controles OLE na Referência MFC.
Personalizando 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 COleControlbase. Isso serializa o conjunto de propriedades suportadas automaticamente pelo COleControl, que usa mais espaço de armazenamento do que serializar apenas as propriedades personalizadas do controle. A remoção dessa chamada permite que seu objeto serialize apenas as propriedades que você considera importantes. Qualquer propriedade padrão que tenha sido implementada pelo controlo não será serializada ao guardar ou carregar o objeto de controlo, a menos que você adicione explicitamente chamadas de PX_ para elas.
Implementação do suporte à versão
O suporte de versão permite que um controle ActiveX revisado adicione novas propriedades persistentes e ainda seja capaz de detetar e carregar o estado persistente criado por uma versão anterior do controle. Para disponibilizar a versão de um controle como parte de seus dados persistentes, chame COleControl::ExchangeVersion na função do DoPropExchange controle. Esta chamada é inserida automaticamente se o controlo ActiveX tiver sido criado utilizando o Assistente de Controlo ActiveX. Ele pode ser removido se o suporte à versão não for necessário. No entanto, o custo no tamanho do controle é muito pequeno (4 bytes) para a flexibilidade adicional que o suporte de versão oferece.
Se o controlo não foi criado com o Assistente de Controlo ActiveX, adicione uma chamada para COleControl::ExchangeVersion inserindo a seguinte linha no início da sua função DoPropExchange (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 da versão. Projetos gerados pelo Assistente de Controle ActiveX usam _wVerMinor e _wVerMajor como padrão. Estas são constantes globais definidas no arquivo de implementação da classe de controle ActiveX do projeto. Dentro do restante da sua DoPropExchange função, você pode chamar CPropExchange::GetVersion a qualquer momento para recuperar a versão que você está salvando ou recuperando.
No exemplo a seguir, a versão 1 desse controle de exemplo tem apenas uma propriedade "ReleaseDate". A versão 2 adiciona uma propriedade "OriginalDate". Se o controle for instruído a carregar o estado persistente da versão antiga, ele inicializará 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 a versão 2 de um controle carregar dados que foram salvos pela versão 1, ele gravará o formato da versão 2 quando for salvo novamente. Se você quiser que o controle salve dados no formato de última leitura, passe FALSE como um terceiro parâmetro ao chamar ExchangeVersion. Este terceiro parâmetro é opcional e é TRUE por padrão.