Objets de données et sources de données : création et destruction

Comme expliqué dans l’article Objets de données et sources de données (OLE), les objets de données et les sources de données représentent les deux côtés d’un transfert de données. Cet article explique la création et la destruction des objets et sources pour effectuer les transferts de données correctement, notamment :

Création d’objets de données

Les objets de données sont utilisés par l'application de destination : le client ou le serveur. Un objet de données dans l'application de destination est une extrémité d'une connexion entre l'application source et l'application de destination. Un objet de données dans l'application de destination permet d'accéder et d'interagir avec les données de la source de données.

Il existe deux cas fréquents où un objet de données est nécessaire. Lorsque les données sont déposées dans votre application à l’aide de la fonction Glisser-déposer représente le premier cas. Lorsque le collage ou le collage spécial est sélectionné dans le menu Edition représente le deuxième cas.

Dans le cas d’un glissement-dépôt, vous n’avez pas besoin de créer un objet de données. Un pointeur vers un objet de données existant est passé à votre fonction OnDrop. Cet objet de données est créé par le framework dans le cadre d'une opération Glisser-déplacer et sera également détruit par celui-ci. Ce n'est pas toujours le cas lorsque le collage est effectué par une autre méthode. Pour plus d’informations, consultez Destruction d’objets de données.

Si l'application effectue une opération de collage ou de collage spécial, vous devrez créer un objet COleDataObject et appeler ses fonctions membres AttachClipboard. Cette opération permet d'associer l'objet de données aux données dans le Presse-papiers. Vous pouvez ensuite utiliser cet objet de données dans votre fonction de collage.

Destruction d’objets de données

Si vous suivez le schéma décrit dans Création d’objets de données, la destruction d’objets de données est un aspect trivial des transferts de données. L'objet de données créé dans votre fonction de collage est détruit par MFC lorsque votre fonction de collage retourne son résultat.

Si vous suivez une autre méthode de gestion d'opérations de collage, assurez-vous que l'objet de données est détruit une fois l'opération de collage terminée. Tant que l’objet de données est détruit, il est impossible pour toute application de copier avec succès des données dans le Presse-papiers.

Création de sources de données

Les sources de données sont utilisées par la source de transfert de données, qui peut être le côté client ou le côté serveur du transfert des données. Une source de données dans l'application source est une extrémité d'une connexion entre l'application source et l'application de destination. Un objet de données dans l'application de destination est utilisé pour interagir avec les données de la source de données.

Les sources de données sont créées lorsqu'une application doit copier des données dans le Presse-papiers. Un scénario fonctionne comme suit :

  1. L'utilisateur sélectionne des données.

  2. L’utilisateur choisit Copier (ou Couper) dans le menu Modifier ou commence une opération de glisser-déplacer.

  3. Selon la conception du programme, l'application crée un objet COleDataSource ou un objet d'une classe dérivée de COleDataSource.

  4. Les données sélectionnées sont insérées dans la source de données en appelant l'une des fonctions dans les groupes COleDataSource::CacheData ou COleDataSource::DelayRenderData.

  5. L'application appelle la fonction membre SetClipboard (ou la fonction membre DoDragDrop s'il s'agit d'une opération de type Glisser-déplacer) qui appartient à l'objet créé à l'étape 3.

  6. S’il s’agit d’une opération Couper ou DoDragDrop retourne DROPEFFECT_MOVE, les données sélectionnées à l’étape 1 sont supprimées du document.

Ce scénario est implémenté par les exemples OLE MFC OCLIENT et HIERSVR. Recherchez la source de la classe dérivée de CView de chaque application pour toutes les fonctions sauf GetClipboardData et OnGetClipboardData. Ces deux fonctions figurent dans les implémentations des classes dérivées de COleClientItem ou COleServerItem. Ces exemples de programmes montrent bien la manière d'implémenter ces concepts.

Une autre situation dans laquelle vous pouvez créer un objet COleDataSource se produit si vous modifiez le comportement par défaut d’une opération Glisser-déposer. Pour plus d’informations, consultez l’article OLE Glisser-déplacer : Personnaliser l’article glisser-déplacer .

Destruction de sources de données

Les sources de données doivent être détruites par l’application actuellement chargée de ces derniers. Dans les situations où vous passez la source de données à OLE, par exemple en appelant COleDataSource ::D oDragDrop, vous devez appeler pDataSrc->InternalRelease. Par exemple :

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

Si vous n'avez pas remis votre source de données à OLE, vous êtes chargé de la détruire, comme pour tout objet C++ classique.

Pour plus d’informations, consultez Glisser-déplacer, Presse-papiers et manipulation d’objets de données et de sources de données.

Voir aussi

Objets de données et sources de données (OLE)
COleDataObject, classe
COleDataSource, classe