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