Objetos e origens de dados: criação e destruição
Como explicado no artigo Objetos de dados e fontes de dados (OLE), os objetos de dados e as fontes de dados representam os dois lados de uma transferência de dados. Este artigo explica quando criar e destruir esses objetos e fontes para executar corretamente as transferências de dados, incluindo:
Criando objetos de dados
Objetos de dados de destruição
Criando fontes de dados
Fontes de dados de destruição
Criando objetos de dados
Os objetos de dados são usados pelo aplicativo de destino — o cliente ou 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 em que um objeto de dados é necessário. A primeira situação é quando os dados são descartados no seu aplicativo usando o arraste e remoção. A segunda situação é quando a pasta ou o especiais de pasta são escolhidos no menu de edição.
Em uma situação de arrastar e soltar, você não precisa criar um objeto de dados. Um ponteiro para um objeto de dados existente será passado à função de OnDrop . Esse objeto de dados é criado pela estrutura como parte da operação arrastar-e-soltar e também será destruído por ele. Isso não é sempre o caso quando colar é feito por outro método. Para obter mais informações, consulte Objetos de dados de destruição.
Se o aplicativo estiver executando uma pasta ou uma operação especial de pasta, você deve criar um objeto de COleDataObject e chamar sua função de membro de AttachClipboard . Isso vincula o objeto de dados com os dados na área de transferência. Você pode usar esse objeto de dados na função da pasta.
Para obter um exemplo de como isso é feito, consulte a função de DoPasteItem no arquivo de MAINVIEW.CPP que faz parte do exemplo OCLIENTMFC OLE. OCLIENT implementa uma função que executa todas as operações de colagem e chama DoPasteItem de seus OnDrop, OnPaste, e as funções de OnPasteLink . Como OnDrop tem um ponteiro para um objeto de dados passado a ele, passa o ponteiro sobre a DoPasteItem. OnPaste e passagem nulo de OnPasteLink para esse parâmetro, informando a DoPasteItem para criar um objeto de dados e anexá-lo à área de transferência. Esse esquema separa o código de pasta para que você só precisa depurar-lo em um local, mas você ainda pode usá-lo para ambos os tipos de operações de pasta.
Objetos de dados de destruição
Se você seguir o esquema descrito em Criando objetos de dados, destruir os objetos de dados é um aspecto trivial das transferências de dados. O objeto de dados que foi criado na função da pasta será destruído por MFC quando sua função da pasta retorna.
Se você seguir outro método de operações de pasta de manipulação, certifique-se de que o objeto de dados será destruído depois que a operação de pasta está cheio. Até que o objeto de dados foi destruído, será impossível para que qualquer aplicativo copia com êxito dados para a área de transferência.
Criando fontes de dados
As fontes de dados são usadas pela origem de transferência de dados, que pode ser o cliente ou o lado do servidor de 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 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 é executado como este:
O usuário seleciona alguns dados.
O usuário pode escolher Copiar (ou Recortar) no menu de Editar ou inicia uma operação de arrastar e soltar.
Dependendo do design do programa, o aplicativo cria um objeto de COleDataSource ou um objeto de uma classe derivada de COleDataSource.
Os dados selecionados são inseridos na fonte de dados chamando uma das funções nos grupos de COleDataSource::CacheData ou de COleDataSource::DelayRenderData .
O aplicativo chama a função de membro de SetClipboard (ou a função de membro de DoDragDrop se esta é uma operação de arrastar e soltar) que pertencem ao objeto criado na etapa 3.
Se esta é uma operação de Recortar ou DoDragDrop retorna DROPEFFECT_MOVE, os dados selecionados na etapa 1 são excluídos do documento.
Este cenário é implementado pelos exemplos OCLIENT e HIERSVRMFC OLE. Examine a origem para CViewde cada aplicativo - classe derivada para todas as funções de GetClipboardData e de OnGetClipboardData . Essas duas funções estão em COleClientItem ou em COleServerItem- implementações da classe derivada. Esses programas de exemplo fornece um bom exemplo de como implementar esses conceitos.
Outra uma situação em que talvez você queira criar um objeto de COleDataSource ocorre se você estiver alterando o comportamento padrão de uma operação de arrastar e soltar. Para obter mais informações, consulte o artigo de Arraste e solte: Personalizar .
Fontes de dados de destruição
Fontes de dados devem ser destruídas pelo aplicativo atualmente responsável por eles. Em situações em que você entrega a fonte de dados para 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 a fonte de dados para OLE, você é responsável para destrui-lo, como com qualquer objeto típico C++.
Para obter mais informações, consulte Arraste e solte, Área de transferência, e Objetos de fontes de dados e manipulação de dados.