Partilhar via


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

Diagrama conceitual de um controle ligado 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

  1. Inicie um projeto do usando Assistente de controle ActiveX de MFC.

  2. Clique com o botão direito do mouse no nó da interface para o controle.

    Isso abre o menu de atalho.

  3. No menu de atalho, clique Adicionar e clique em Adicionar Propriedade.

  4. 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.

  5. 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

  1. Carregar o projeto do controle.

  2. 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.

  3. Carregar o projeto do controle.

  4. Clique com o botão direito do mouse no nó da interface para o controle.

    Isso abre o menu de atalho.

  5. No menu de atalho, clique Adicionar e clique em Adicionar Propriedade.

  6. Digite o nome da propriedade na caixa de Nome da propriedade . Use MyProp para este exemplo.

  7. Selecione um tipo de dados na caixa de listagem suspensa de Tipo de propriedade . Use short para este exemplo.

  8. Para Tipo de Implementação, clique Get/Set Methods.

  9. 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.

  10. Clique em Concluir.

  11. 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();
    }
    
  12. 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.

  13. 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;
    
  14. 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);
    }
    
  15. 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;
    
  16. Tornar a seguinte linha à última linha em DoPropExchange para funcionar:

    PX_String(pPX, _T("MyProp"), m_strText);
    
  17. 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();
    
  18. 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)

Conceitos

Controles ActiveX MFC