Compartilhar via


Objetos e origens de dados: criação e destruição

Conforme explicado no artigo Objetos de Dados e Fontes de Dados (OLE), objetos de dados e fontes de dados representam ambos os lados de uma transferência de dados. Este artigo explica quando criar e destruir esses objetos e fontes para executar suas transferências de dados corretamente, incluindo:

Criar objetos de dados

Os objetos de dados são usados pelo aplicativo de destino – o cliente ou o servidor. Um objeto de dados no aplicativo de destino é uma extremidade de uma conexão entre o aplicativo de origem e o aplicativo de destino. Um objeto de dados no aplicativo de destino é usado para acessar e interagir com os dados na fonte de dados.

Há duas situações comuns nas quais um objeto de dados é necessário. A primeira situação é quando os dados são soltos em seu aplicativo usando a operação “arrastar e soltar”. A segunda situação é quando Colar ou Colar Especial é escolhido no menu Editar.

Em uma situação do tipo "arrastar e soltar", você não precisa criar um objeto de dados. Um ponteiro para um objeto de dados existente será passado para sua função OnDrop. Esse objeto de dados é criado pela estrutura como parte da operação do tipo "arrastar e soltar" e também será destruído por ela. Nem sempre é o caso quando a colagem é feita por outro método. Para obter mais informações, confira Destruir objetos de dados.

Se o aplicativo estiver executando uma operação Colar ou Colar Especial, você deverá criar um objeto COleDataObject e chamar sua função membro AttachClipboard. Isso associa o objeto de dados aos dados na Área de Transferência. Em seguida, você pode usar esse objeto de dados em sua função Colar.

Destruir objetos de dados

Se você seguir o esquema descrito em Criar objetos de dados, destruir objetos de dados será um aspecto trivial das transferências de dados. O objeto de dados que foi criado em sua função Colar será destruído pelo MFC quando sua função Colar retornar.

Se você seguir outro método de tratamento de operações Colar, verifique se o objeto de dados será destruído após a conclusão da operação Colar. Até que o objeto de dados seja destruído, será impossível para qualquer aplicativo copiar dados com êxito para a Área de Transferência.

Criando fontes de dados

As fontes de dados são usadas pela origem da transferência de dados, que pode ser o lado do cliente ou o lado do servidor da transferência de dados. Uma fonte de dados no aplicativo de origem é uma extremidade de uma conexão entre o aplicativo de origem e o aplicativo de destino. Um objeto de dados no aplicativo de destino é usado para interagir com os dados na fonte de dados.

As fontes de dados são criadas quando um aplicativo precisa copiar dados para a Área de Transferência. Um cenário típico funciona assim:

  1. O usuário seleciona alguns dados.

  2. O usuário escolhe Copiar (ou Recortar) no menu Editar ou inicia uma operação do tipo "arrastar e soltar".

  3. Dependendo do design do programa, o aplicativo cria um objeto COleDataSource ou um objeto de uma classe derivada de COleDataSource.

  4. Os dados selecionados são inseridos na fonte de dados chamando uma das funções nos grupos COleDataSource::CacheData ou COleDataSource::DelayRenderData.

  5. O aplicativo chama a função membro SetClipboard (ou a função membro DoDragDrop, se esta for uma operação do tipo "arrastar e soltar") pertencente ao objeto criado na etapa 3.

  6. Se essa for uma operação Recortar ou DoDragDrop retornar DROPEFFECT_MOVE, os dados selecionados na etapa 1 serão excluídos do documento.

Esse cenário é implementado pelos exemplos de OLE OCLIENT e HIERSVR do MFC. Examine a origem de cada classe derivada de CView do aplicativo para todas as funções, exceto GetClipboardData e OnGetClipboardData. Essas duas funções estão nas implementações de classe derivadas COleClientItem ou COleServerItem. Esses programas de exemplo fornecem um bom exemplo de como implementar esses conceitos.

Uma outra situação em que talvez você queira criar um objeto COleDataSource ocorrerá se você estiver modificando o comportamento padrão de uma operação do tipo "arrastar e soltar". Para obter mais informações, consulte o artigo Arrastar e soltar do OLE: Personalizar “arrastar e soltar”.

Destruir fontes de dados

As fontes de dados devem ser destruídas pelo aplicativo atualmente responsável por elas. Em situações em que você entrega a fonte de dados ao OLE, como chamar COleDataSource::DoDragDrop, você precisa chamar pDataSrc->InternalRelease. Por exemplo:

void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
   UNREFERENCED_PARAMETER(pResult);

   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

   CMyDataSource* pDataSrc = new CMyDataSource();
   if (NULL != pDataSrc)
   {
      pDataSrc->Initialize(pNMLV, this);
      pDataSrc->DelayRenderData((CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
      pDataSrc->DoDragDrop();
      pDataSrc->InternalRelease();
   }
}

Se você não entregou sua fonte de dados ao OLE, será responsável por destruí-la, como com qualquer objeto C++ típico.

Para obter mais informações, consulte Arrastar e Soltar, Área de Transferência e Manipular Objetos de Dados e Fontes de Dados.

Confira também

Objetos e fontes de dados (OLE)
Classe COleDataObject
Classe COleDataSource