Obiekty danych i źródła danych: tworzenie i likwidacja
Jak wyjaśniono w artykule Obiekty danych i źródła danych (OLE), obiekty danych i źródła danych reprezentują obie strony transferu danych. W tym artykule wyjaśniono, kiedy utworzyć i zniszczyć te obiekty i źródła w celu prawidłowego wykonywania transferów danych, w tym:
Tworzenie obiektów danych
Obiekty danych są używane przez aplikację docelową — klienta lub serwera. Obiekt danych w aplikacji docelowej to jeden koniec połączenia między aplikacją źródłową a aplikacją docelową. Obiekt danych w aplikacji docelowej służy do uzyskiwania dostępu do danych w źródle danych i interakcji z nimi.
Istnieją dwie typowe sytuacje, w których potrzebny jest obiekt danych. Pierwsza sytuacja polega na tym, że dane są porzucane w aplikacji przy użyciu przeciągania i upuszczania. Drugą sytuacją jest wybranie pozycji Wklej lub Wklej specjalne z menu Edycja.
W sytuacji przeciągania i upuszczania nie trzeba tworzyć obiektu danych. Wskaźnik do istniejącego obiektu danych zostanie przekazany do OnDrop
funkcji. Ten obiekt danych jest tworzony przez strukturę w ramach operacji przeciągania i upuszczania, a także zostanie zniszczony przez nią. Nie zawsze jest tak, gdy wklejanie jest wykonywane przez inną metodę. Aby uzyskać więcej informacji, zobacz Niszczenie obiektów danych.
Jeśli aplikacja wykonuje operację specjalną wklejania lub wklejania, należy utworzyć COleDataObject
obiekt i wywołać jego AttachClipboard
funkcję składową. Spowoduje to skojarzenie obiektu danych z danymi w Schowku. Następnie możesz użyć tego obiektu danych w funkcji wklejania.
Niszczenie obiektów danych
Jeśli zastosujesz się do schematu opisanego w temacie Tworzenie obiektów danych, niszczenie obiektów danych jest prostym aspektem transferów danych. Obiekt danych utworzony w funkcji wklejania zostanie zniszczony przez MFC po powrocie funkcji wklejania.
Jeśli wykonasz inną metodę obsługi operacji wklejania, upewnij się, że obiekt danych zostanie zniszczony po zakończeniu operacji wklejania. Dopóki obiekt danych nie zostanie zniszczony, nie będzie można pomyślnie skopiować danych do Schowka przez każdą aplikację.
Tworzenie źródeł danych
Źródła danych są używane przez źródło transferu danych, które może być klientem lub po stronie serwera transferu danych. Źródło danych w aplikacji źródłowej to jeden koniec połączenia między aplikacją źródłową a aplikacją docelową. Obiekt danych w aplikacji docelowej służy do interakcji z danymi w źródle danych.
Źródła danych są tworzone, gdy aplikacja musi skopiować dane do Schowka. Typowy scenariusz działa w następujący sposób:
Użytkownik wybiera niektóre dane.
Użytkownik wybiera opcję Kopiuj (lub wytnij) z menu Edycja lub rozpoczyna operację przeciągania i upuszczania.
W zależności od projektu programu aplikacja tworzy
COleDataSource
obiekt lub obiekt z klasy pochodzącej zCOleDataSource
klasy .Wybrane dane są wstawiane do źródła danych przez wywołanie jednej z funkcji w grupach
COleDataSource::CacheData
lubCOleDataSource::DelayRenderData
.Aplikacja wywołuje
SetClipboard
funkcję składową (lubDoDragDrop
funkcję składową, jeśli jest to operacja przeciągania i upuszczania) należąca do obiektu utworzonego w kroku 3.Jeśli jest to operacja wycinania lub
DoDragDrop
zwraca DROPEFFECT_MOVE, dane wybrane w kroku 1 zostaną usunięte z dokumentu.
Ten scenariusz jest implementowany przez przykłady MFC OLE OCLIENT i HIERSVR. Przyjrzyj się źródle dla klasy pochodnej każdej aplikacji CView
dla wszystkich GetClipboardData
funkcji i OnGetClipboardData
. Te dwie funkcje znajdują się w COleClientItem
implementacjach klas pochodnych lub lub COleServerItem
. Te przykładowe programy stanowią dobry przykład implementacji tych pojęć.
Jedna inna sytuacja, w której można utworzyć COleDataSource
obiekt, występuje, jeśli modyfikujesz domyślne zachowanie operacji przeciągania i upuszczania. Aby uzyskać więcej informacji, zobacz artykuł Przeciąganie i upuszczanie OLE: dostosowywanie przeciągania i upuszczania .
Niszczenie źródeł danych
Źródła danych muszą zostać zniszczone przez obecnie odpowiedzialną aplikację. W sytuacjach, w których źródło danych przekazuje się do obiektu OLE, na przykład wywołanie elementu COleDataSource::D oDragDrop, należy wywołać metodę pDataSrc->InternalRelease
. Przykład:
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();
}
}
Jeśli źródło danych nie zostało przekazane ole, odpowiadasz za jego zniszczenie, podobnie jak w przypadku dowolnego typowego obiektu C++.
Aby uzyskać więcej informacji, zobacz Przeciąganie i upuszczanie, Schowek i manipulowanie obiektami danych i źródłami danych.
Zobacz też
Obiekty danych i źródła danych (OLE)
Klasa COleDataObject
Klasa COleDataSource