objets de données et sources de données : Création et la 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 parties 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 des objets de données
Destruction des objets de données
Création de source de données
Destruction des sources de données
Création des objets de données
Les objets de données sont utilisés par l'application de destination — le client ou 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 est utilisé pour accéder et interagir avec les données de la source de données.
Il existe deux situations courantes où un objet de données est nécessaire. La première situation est lorsque les données sont déposées dans votre application à l'aide d'une glisser-déposer. La deuxième situation est lorsque le collage ou le collage spécial est sélectionné dans le menu Edition.
Dans une situation glisser-déposer, 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 de glisser-déposer 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 un collage ou une opération de collage spéciale, vous devez créer un objet COleDataObject et appeler ses fonctions membres AttachClipboard. Cela associe l'objet de données avec les données dans le presse-papiers. Vous pouvez ensuite utiliser cet objet de données dans votre fonction de collage.
Pour consulter un exemple montrant comment cela est effectué, consultez la fonction DoPasteItem dans le fichier de MAINVIEW.CPP qui fait partie de l'exemple OLE MFC OCLIENT. OCLIENT implémente une fonction qui effectue toutes les opérations de collage et appelle DoPasteItem de ses fonctions OnDrop, OnPaste, et OnPasteLink. Comme OnDrop un pointeur vers un objet de données qui lui est transmis, il passe le pointeur à DoPasteItem. OnPaste et OnPasteLink passent NULL pour ce paramètre, ordonnant à DoPasteItem de créer un objet de données et de l'attacher au presse papiers. Ce schéma sépare le code de collage de sorte qu'il vous suffit de le déboguer à un endroit, mais vous pouvez toujours l'utiliser pour les deux types d'opérations de collage.
Destruction des objets de données
Si vous suivez le schéma décrit dans Créer des objets de données, la destruction 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 source 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 :
L'utilisateur sélectionne des données.
L'utilisateur choisit Copier (ou Couper) dans le menu de Modifier ou commence une opération de glisser-déplacer.
Selon la création du programme, l'application crée un objet COleDataSource ou un objet d'une classe dérivée de COleDataSource.
Les données sélectionnées est insérée dans la source de données en appelant l'une des fonctions dans les groupes COleDataSource::CacheData ou COleDataSource::DelayRenderData.
L'application appelle la fonction membre SetClipboard (ou la fonction membre DoDragDrop s'il s'agit d'une opération de glisser-déplacer) qui appartient à l'objet créé à l'étape 3.
S'il s'agit d'une opération de 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é dans les exemples MFC OLE OCLIENT et HIERSVR. Recherchez la source pour chaque classe dérivée de CView de l'application pour toutes les fonctions sauf GetClipboardData et OnGetClipboardData. Ces deux fonctions sont dans les implémentations des classes dérivées de COleClientItem ou COleServerItem. Ces exemples de programmes sont un bon exemple de la manière d'implémenter ces concepts.
Une situation dans laquelle vous pouvez créer un objet COleDataSource se produit si vous modifiez le comportement par défaut d'une opération de glisser-déplacer. Pour plus d'informations, consultez l'article Faites glisser : Personnalisation.
Destruction des sources de données
Les sources de données doivent être détruites par l'application actuellement chargée de ces derniers. Dans les cas où vous remettez la source de données à OLE, comme lors de l'appel de COleDataSource::DoDragDrop, 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 classique C++.
Pour plus d'informations, consultez Glisser-déplacer, Presse-papiers, et Manipulation des objets de données et de sources de données.