記事「データ オブジェクトとデータ ソース (OLE)」で説明されているように、データ オブジェクトとデータ ソースはデータ転送の両側を表します。 この記事では、次のようなデータ転送を適切に実行するために、これらのオブジェクトとソースを作成および破棄するタイミングについて説明します。
データ オブジェクトの作成
データ オブジェクトは、クライアントまたはサーバーのいずれかの宛先アプリケーションによって使用されます。 移行先アプリケーションのデータ オブジェクトは、ソース アプリケーションと移行先アプリケーションの間の接続の 1 つの端です。 コピー先アプリケーションのデータ オブジェクトは、データ ソース内のデータにアクセスして操作するために使用されます。
データ オブジェクトが必要な場合は、2 つの一般的な状況があります。 最初の状況は、ドラッグ アンド ドロップを使用してアプリケーションでデータがドロップされる場合です。 2 つ目の状況は、[編集] メニューから [貼り付け] または [特別な貼り付け] が選択されている場合です。
ドラッグ アンド ドロップの状況では、データ オブジェクトを作成する必要はありません。 既存のデータ オブジェクトへのポインターが、 OnDrop
関数に渡されます。 このデータオブジェクトは、ドラッグアンドドロップ操作の一環としてフレームワークによって作成され、フレームワークによって破棄もされます。 貼り付けが別の方法で行われる場合、これは必ずしも当てはまるとは限りません。 詳細については、「 データ オブジェクトの破棄」を参照してください。
アプリケーションで特殊な貼り付け操作または貼り付け操作を実行している場合は、 COleDataObject
オブジェクトを作成し、その AttachClipboard
メンバー関数を呼び出す必要があります。 これにより、データ オブジェクトがクリップボード上のデータに関連付けられます。 その後、貼り付け関数でこのデータ オブジェクトを使用できます。
データ オブジェクトの破棄
「データ オブジェクトの作成」で説明されているスキームに従う場合、データ オブジェクトを破棄することは、データ転送の重要な側面です。 貼り付け関数で作成されたデータ オブジェクトは、貼り付け関数が返されるときに MFC によって破棄されます。
貼り付け操作を処理する別の方法に従う場合は、貼り付け操作の完了後にデータ オブジェクトが破棄されていることを確認します。 データ オブジェクトが破棄されるまで、アプリケーションがクリップボードにデータを正常にコピーすることはできません。
データ ソースの作成
データ ソースは、データ転送のソース (データ転送のクライアント側またはサーバー側) によって使用されます。 ソース アプリケーションのデータ ソースは、ソース アプリケーションと移行先アプリケーションの間の接続の 1 つの端です。 コピー先アプリケーションのデータ オブジェクトは、データ ソース内のデータを操作するために使用されます。
データ ソースは、アプリケーションがクリップボードにデータをコピーする必要があるときに作成されます。 一般的なシナリオは次のように実行されます。
ユーザーが一部のデータを選択します。
ユーザーが [編集] メニューから [コピー] (または [切り取り] ) を選択するか、ドラッグ アンド ドロップ操作を開始します。
アプリケーションは、プログラムの設計に応じて、
COleDataSource
オブジェクトまたはCOleDataSource
から派生したクラスのオブジェクトを作成します。選択したデータは、
COleDataSource::CacheData
またはCOleDataSource::DelayRenderData
グループのいずれかの関数を呼び出すことによって、データ ソースに挿入されます。アプリケーションは、手順 3 で作成したオブジェクトに属する
SetClipboard
メンバー関数 (または、ドラッグ アンド ドロップ操作の場合はDoDragDrop
メンバー関数) を呼び出します。切り取り操作の場合、または
DoDragDrop
がDROPEFFECT_MOVEを返す場合、手順 1 で選択したデータはドキュメントから削除されます。
このシナリオは、MFC OLE サンプル OCLIENT と HIERSVR によって実装されます。
CView
関数とGetClipboardData
関数以外のすべてのアプリケーションのOnGetClipboardData
派生クラスのソースを確認します。 これら 2 つの関数は、 COleClientItem
または COleServerItem
派生クラスの実装にあります。 これらのサンプル プログラムは、これらの概念を実装する方法の良い例を提供します。
ドラッグ アンド ドロップ操作の既定の動作を変更する場合は、 COleDataSource
オブジェクトを作成する必要があるもう 1 つの状況が発生します。 詳細については、「 OLE ドラッグ アンド ドロップ: ドラッグ アンド ドロップのカスタマイズ」 の記事を参照してください。
データ ソースの破棄
データ ソースは、現在そのデータ ソースを担当しているアプリケーションによって破棄される必要があります。
COleDataSource::D oDragDrop の呼び出しなど、データ ソースを OLE に渡す場合は、pDataSrc->InternalRelease
を呼び出す必要があります。 例えば次が挙げられます。
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();
}
}
データ ソースを OLE に渡していない場合は、一般的な C++ オブジェクトと同様に、データ ソースを破棄する必要があります。
詳細については、「 ドラッグ アンド ドロップ、 クリップボード、 およびデータ オブジェクトとデータ ソースの操作」を参照してください。
こちらも参照ください
データ オブジェクトとデータ ソース (OLE)
COleDataObject クラス
COleDataSource クラス