Controles ActiveX MFC: usando associação de dados em um controle ActiveX
Um dos usos mais avançados de controles ActiveX é a associação de dados, que permite que uma propriedade do controle se associa com um campo específico em um base de dados. Quando um usuário modifica dados nesta propriedade associada, o controle notifica o base de dados e solicitará que o campo de registro seja atualizado. O base de dados notifica o controle de êxito ou a falha da solicitação.
Este artigo abrange o lado do controle da tarefa. Implementar as interações de associação de dados com o base de dados é responsabilidade do contêiner do controle. Como você gerencia as interações de base de dados do contêiner está além do escopo desta documentação. Como você se prepara o controle para a associação de dados é explicado no restante deste artigo.
Diagrama conceitual de um controle associada a dados
A classe de COleControl fornece duas funções de membro que fazem a associação de dados em processo fácil para implementar. A primeira função, BoundPropertyRequestEdit, é usada para solicitar permissão para alterar o valor da propriedade. BoundPropertyChanged, a segunda função, é chamado depois que o valor da propriedade tiver sido modificado com êxito.
Este artigo abrange os seguintes tópicos:
Criando uma propriedade de estoque Bindable
Criando um Bindable obter/define o método
Criando uma propriedade de estoque Bindable
É possível criar uma propriedade de estoque associada a dados, embora seja mais provável que devem bindable obter/define o método.
Dica
As propriedades de estoque têm os atributos de bindable e de requestedit por padrão.
Para adicionar uma propriedade de estoque bindable usando o assistente para adicionar propriedade
Inicie um projeto do usando Assistente de controle ActiveX de MFC.
Clique com o botão direito do mouse no nó da interface para o controle.
Isso abre o menu de atalho.
No menu de atalho, clique Adicionar e clique em Adicionar Propriedade.
Selecione uma das entradas na lista suspensa de PropriedadeNome . Por exemplo, você pode selecionar Texto.
Como Texto é uma propriedade de estoque, os atributos de bindable e de requestedit são verificados nele.
Selecione as seguintes caixas de seleção da guia de IDL Attributes : displaybind e defaultbind para adicionar atributos à definição da propriedade em .IDL arquivo de projeto. Esses atributos fazem o controle visíveis ao usuário e fazem à propriedade de estoque a propriedade bindable padrão.
Neste momento, o controle pode exibir dados de uma fonte de dados, mas o usuário não poderá atualizar campos de dados. Se você deseja que o controle também para poder atualizar dados, altere a função de OnOcmCommandOnOcmCommand para saber como segue:
#ifdef _WIN32
WORD wNotifyCode = HIWORD(wParam);
#else
WORD wNotifyCode = HIWORD(lParam);
#endif
if(wNotifyCode==EN_CHANGE)
{
if(!BoundPropertyRequestEdit(DISPID_TEXT))
{
SetNotSupported();
}
else
{
GetText();
// Notify container of change
BoundPropertyChanged(DISPID_TEXT);
}
}
return 0;
Agora você pode criar o projeto, que registrará o controle. Quando você insere o controle em uma caixa de diálogo, as propriedades de Campo de dados e de Fonte de dados terão sido adicionadas e agora você pode selecionar uma fonte de dados e um campo para exibir no controle.
Criando um Bindable obter/define o método
Além de um associada a dados obter/define o método, você também pode criar propriedade de estoque bindable.
Dica
Esse procedimento supõe que você tenha um projeto do controle ActiveX que controlam as subclasses o windows.
Para adicionar um bindable consiga/define o método usando o assistente para adicionar propriedade
Carregar o projeto do controle.
Na página de Control Settings , selecione uma classe da janela para o controle à subclasse. Por exemplo, você talvez queira encerrar a subclasse um controle de EDIÇÃO.
Carregar o projeto do controle.
Clique com o botão direito do mouse no nó da interface para o controle.
Isso abre o menu de atalho.
No menu de atalho, clique Adicionar e clique em Adicionar Propriedade.
Digite o nome da propriedade na caixa de Nome da propriedade . Use MyProp para este exemplo.
Selecione um tipo de dados na caixa de listagem suspensa de Tipo de propriedade . Use short para este exemplo.
Para Tipo de Implementação, clique Get/Set Methods.
Selecione as seguintes caixas de seleção na guia de atributos de IDL: bindable, requestedit, displaybind, e defaultbind para adicionar atributos à definição da propriedade em .IDL arquivo de projeto. Esses atributos fazem o controle visíveis ao usuário e fazem à propriedade de estoque a propriedade bindable padrão.
Clique em Concluir.
Modifique o corpo da função de SetMyProp de modo que contém o seguinte código:
if(!BoundPropertyRequestEdit(1)) { SetNotSupported(); return; } else { if(AmbientUserMode()) // SendMessage only at run-time { _stprintf_s(m_strText.GetBuffer(10), 10, _T("%d"), newVal); SetWindowText(m_strText); m_strText.ReleaseBuffer(); } else { InvalidateControl(); } // Signal a property change // This is the MFC equivalent of OnChanged() BoundPropertyChanged(1); SetModifiedFlag(); }
O parâmetro passado às funções de BoundPropertyChanged e de BoundPropertyRequestEdit é o dispid de propriedade, que é o parâmetro passado ao atributo id () da propriedade no arquivo de .IDL.
Modifique a função de OnOcmCommand assim que contém o seguinte código:
#ifdef _WIN32 WORD wNotifyCode = HIWORD(wParam); #else WORD wNotifyCode = HIWORD(lParam); #endif if(wNotifyCode==EN_CHANGE) { if(!BoundPropertyRequestEdit(DISPID_TEXT)) { SetNotSupported(); } else { GetText(); // Notify container of change BoundPropertyChanged(DISPID_TEXT); } } return 0;
Modifique a função de OnDraw de modo que contém o seguinte código:
if(!AmbientUserMode()) { // Draw the Text property at design-time pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->DrawText(m_strText, -1, (LPRECT)&rcBounds, DT_LEFT | DT_TOP | DT_SINGLELINE); } else { DoSuperclassPaint(pdc, rcBounds); }
A seção pública do arquivo de cabeçalho o arquivo de cabeçalho para a sua classe de controle, adicione as seguintes definições (construtores) para variáveis de membro:
CString m_strText; short m_nMyNum;
Tornar a seguinte linha à última linha em DoPropExchange para funcionar:
PX_String(pPX, _T("MyProp"), m_strText);
Modifique a função de OnResetState de modo que contém o seguinte código:
COleControl::OnResetState(); // Resets defaults found in DoPropExchange m_strText = AmbientDisplayName();
Modifique a função de GetMyProp de modo que contém o seguinte código:
if(AmbientUserMode()) { GetWindowText(m_strText); m_nMyNum = (short)_ttoi(m_strText); } return m_nMyNum;
Agora você pode criar o projeto, que registrará o controle. Quando você insere o controle em uma caixa de diálogo, as propriedades de Campo de dados e de Fonte de dados terão sido adicionadas e agora você pode selecionar uma fonte de dados e um campo para exibir no controle.
Consulte também
Referência
Controles de dados associados (ADO e RDO)