Datenobjekte und Datenquellen: Erstellen und Zerstören

Wie im Artikel Data Objects and Data Sources (OLE) erläutert, stellen Datenobjekte und Datenquellen beide Seiten einer Datenübertragung dar. In diesem Artikel wird erläutert, wann diese Objekte und Quellen erstellt und zerstört werden, um die Datenübertragungen ordnungsgemäß durchführen zu können, einschließlich:

Erstellen von Datenobjekten

Datenobjekte werden von der Zielanwendung verwendet, wobei es sich entweder um den Client oder Server handelt. Ein Datenobjekt in der Zielanwendung ist ein Ende der Verbindung zwischen der Quellanwendung und der Zielanwendung. Ein Datenobjekt in der Zielanwendung wird verwendet, um auf die Daten in der Datenquelle zuzugreifen und damit zu interagieren.

Es gibt zwei häufige Situationen, in denen ein Datenobjekt erforderlich ist. Die erste Situation: Daten werden mithilfe von Drag & Drop in Ihrer Anwendung abgelegt. Die zweite Situation: Im Menü „Bearbeiten“ wird die Option „Einfügen“ oder „Inhalte einfügen“ ausgewählt.

In einer Drag-and-Drop-Situation müssen Sie kein Datenobjekt erstellen. Ein Zeiger auf ein vorhandenes Datenobjekt wird an die OnDrop-Funktion übergeben. Dieses Datenobjekt wird vom Framework als Teil des Drag-and-Drop-Vorgangs erstellt und auch durch es zerstört. Dies ist nicht immer der Fall, wenn das Einfügen mit einer anderen Methode erfolgt. Weitere Informationen finden Sie unter "Zerstören von Datenobjekten".

Wenn die Anwendung einen „Einfügen“- oder „Inhalte einfügen“-Vorgang durchführt, sollten Sie ein COleDataObject-Objekt erstellen und seine AttachClipboard-Memberfunktion aufrufen. Hierdurch wird das Datenobjekt den Daten in der Zwischenablage zugeordnet. Sie können dieses Datenobjekt dann in Ihrer Einfügefunktion verwenden.

Löschen von Datenobjekten

Wenn Sie dem unter Erstellen von Datenobjekten beschriebenen Schema folgen, ist das Zerstören von Datenobjekten ein trivialer Aspekt der Datenübertragung. Das beim Einfügen erstellte Datenobjekt wird von MFC zerstört, wenn die Einfügefunktion zurückkehrt.

Wenn Sie eine andere Methode für Einfügeoperationen anwenden, stellen Sie sicher, dass das Datenobjekt nach Abschluss des Einfügevorgangs zerstört wird. Solange das Datenobjekt nicht zerstört ist, kann keine Anwendung Daten in die Zwischenablage kopieren.

Erstellen von Datenquellen

Datenquellen werden von der Quelle der Datenübertragung verwendet, bei der es sich entweder um die Clientseite oder die Serverseite der Datenübertragung handelt. Eine Datenquelle in der Quellanwendung ist ein Ende der Verbindung zwischen der Quellanwendung und der Zielanwendung. Ein Datenobjekt in der Zielanwendung wird verwendet, um auf die Daten in der Datenquelle zuzugreifen und damit zu interagieren.

Datenquellen werden erstellt, wenn eine Anwendung Daten in die Zwischenablage kopieren muss. Ein typisches Szenario sieht folgendermaßen aus:

  1. Der Benutzer wählt einige Daten aus.

  2. Der Benutzer wählt "Kopieren" (oder "Ausschneiden") aus dem Menü "Bearbeiten" aus oder beginnt mit einem Drag-and-Drop-Vorgang.

  3. Je nach Entwurf des Programms erstellt die Anwendung entweder ein COleDataSource-Objekt oder ein Objekt von einer Klasse, die von der COleDataSource abgeleitet wird.

  4. Die ausgewählten Daten werden in die Datenquelle eingefügt, indem eine der Funktionen in der COleDataSource::CacheData-Gruppe oder COleDataSource::DelayRenderData-Gruppe aufgerufen wird.

  5. Die Anwendung ruft die SetClipboard-Memberfunktion auf (bzw. die DoDragDrop-Memberfunktion, wenn es sich um einen Drag-and-Drop-Vorgang handelt), die zu dem in Schritt 3 erstellten Objekt gehört.

  6. Wenn es sich um einen Ausschneiden-Vorgang handelt oder DoDragDrop DROPEFFECT_MOVE zurückgibt, werden die in Schritt 1 ausgewählten Daten aus dem Dokument gelöscht.

Dieses Szenario wird von den MFC OLE-Beispielen OCLIENT und HIERSVR implementiert. Suchen Sie in der Quelle nach der von CView abgeleiteten Klasse der einzelnen Anwendungen, außer nach den Funktionen GetClipboardData und OnGetClipboardData. Diese beiden Funktionen befinden sich in den Implementierungen der von COleClientItem oder COleServerItem abgeleiteten Klassen. Diese Programme sind ein gutes Beispiel dafür, wie diese Konzepte implementiert werden können.

Eine andere Situation, in der Sie möglicherweise ein COleDataSource-Objekt erstellen möchten, besteht dann, wenn Sie das Standardverhalten eines Drag-and-Drop-Vorgangs ändern. Weitere Informationen finden Sie im OLE-Ziehen und -Ablegen: Anpassen des Artikels "Ziehen und Ablegen ".

Löschen von Datenquellen

Datenquellen müssen von der Anwendung zerstört werden, die derzeit für sie verantwortlich ist. In Situationen, in denen Sie die Datenquelle an OLE übergeben, z. B. das Aufrufen von COleDataSource::D oDragDrop, müssen Sie aufrufen pDataSrc->InternalRelease. Beispiel:

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

Wenn Sie die Datenquelle nicht an OLE übergeben haben, sind Sie verantwortlich dafür, sie zu zerstören, wie dies bei jedem typischen C++-Objekt der Fall ist.

Weitere Informationen finden Sie unter Ziehen und Ablegen, Zwischenablage und Bearbeiten von Datenobjekten und Datenquellen.

Siehe auch

Datenobjekte und Datenquellen (OLE)
COleDataObject-Klasse
COleDataSource-Klasse