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:
Der Benutzer wählt einige Daten aus.
Der Benutzer wählt "Kopieren" (oder "Ausschneiden") aus dem Menü "Bearbeiten" aus oder beginnt mit einem Drag-and-Drop-Vorgang.
Je nach Entwurf des Programms erstellt die Anwendung entweder ein
COleDataSource
-Objekt oder ein Objekt von einer Klasse, die von derCOleDataSource
abgeleitet wird.Die ausgewählten Daten werden in die Datenquelle eingefügt, indem eine der Funktionen in der
COleDataSource::CacheData
-Gruppe oderCOleDataSource::DelayRenderData
-Gruppe aufgerufen wird.Die Anwendung ruft die
SetClipboard
-Memberfunktion auf (bzw. dieDoDragDrop
-Memberfunktion, wenn es sich um einen Drag-and-Drop-Vorgang handelt), die zu dem in Schritt 3 erstellten Objekt gehört.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