Udostępnij za pomocą


Obiekty danych i źródła danych: tworzenie i niszczenie

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 funkcji OnDrop. 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ę wklejania lub wklejania specjalnego, 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:

  1. Użytkownik wybiera niektóre dane.

  2. Użytkownik wybiera opcję Kopiuj (lub wytnij) z menu Edycja lub rozpoczyna operację przeciągania i upuszczania.

  3. W zależności od konstrukcji programu aplikacja tworzy albo obiekt typu COleDataSource, albo obiekt z klasy pochodnej od COleDataSource.

  4. Wybrane dane są wstawiane do źródła danych przez wywołanie jednej z funkcji w grupach COleDataSource::CacheData lub COleDataSource::DelayRenderData .

  5. Aplikacja wywołuje funkcję składową SetClipboard (lub funkcję składową DoDragDrop, jeśli jest to operacja przeciągania i upuszczania) należącej do obiektu utworzonego w kroku 3.

  6. 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ódłu dla klasy pochodnej każdej aplikacji CView, z wyjątkiem funkcji GetClipboardData i OnGetClipboardData. Te dwie funkcje znajdują się w implementacjach klas COleClientItem lub pochodnych od 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 przekazujesz źródło danych do obiektu OLE, na przykład wywołując COleDataSource::DoDragDrop, musisz wywołać 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 także

Obiekty danych i źródła danych (OLE)
Klasa COleDataObject
Klasa COleDataSource