データ オブジェクトとデータ ソース : 作成と破棄
「データ オブジェクトとデータ ソース (OLE)」で説明されているように、データ オブジェクトとデータ ソースは、データの転送先と転送元を表します。 ここでは、データ転送時のオブジェクトとソースの作成時期と破棄時期について説明します。
データ オブジェクトの作成
データ オブジェクトの破棄
データ ソースの作成
データ ソースの破棄
データ オブジェクトの作成
データ オブジェクトは転送先のアプリケーション (クライアントまたはサーバー) で使われます。 転送先アプリケーションにおけるデータ オブジェクトは、転送元アプリケーションと転送先アプリケーションの接続の一方の端になります。 転送先アプリケーションのデータ オブジェクトは、データ ソースにアクセスしてデータを操作するために使われます。
データ オブジェクトは、主に次の 2 つの状況で必要になります。 1 つは、ドラッグ アンド ドロップを使ってアプリケーションにデータをドロップする場合です。 もう 1 つは、[編集] メニューの [貼り付け] または [形式を選択して貼り付け] が選択された場合です。
ドラッグ アンド ドロップ操作の場合は、データ オブジェクトを作成する必要はありません。 既存のデータ オブジェクトへのポインターが、アプリケーションの関数 OnDrop に渡されます。 このデータ オブジェクトは、フレームワークによってドラッグ アンド ドロップ操作の一環として作成され、破棄されます。 ただし、貼り付けが別の方法で行われると、異なる場合があります。 詳細については、「データ オブジェクトの破棄」を参照してください。
[貼り付け] コマンドまたは [形式を選択して貼り付け] コマンドを処理する場合は、COleDataObject オブジェクトを作成し、そのメンバー関数 AttachClipboard を呼び出します。 この関数は、データ オブジェクトとクリップボードのデータを関連付けます。 その後、貼り付けを行う関数でこのデータ オブジェクトを使用できるようになります。
この例については、MFC OLE サンプル プログラム OCLIENT の MAINVIEW.CPP ファイルにある関数 DoPasteItem を参照してください。 OCLIENT サンプル プログラムにはすべての貼り付け処理を行う関数があり、関数 OnDrop、OnPaste、および OnPasteLink から関数 DoPasteItem を呼び出します。 OnDrop はデータ オブジェクトへのポインターを受け取り、DoPasteItem にそのポインターを渡します。 これに対して、OnPaste と OnPasteLink の場合は NULL を渡し、DoPasteItem は、渡されたポインターからデータ オブジェクトを作成し、クリップボードに関連付けます。 これによって貼り付け用のコードが分離されるので、各貼り付けコマンドで共有できるようになり、デバッグ時も 1 か所を調べるだけで済みます。
データ オブジェクトの破棄
「データ オブジェクトの作成」で説明した方式では、データ オブジェクトの破棄はデータ転送の一環として行われます。 貼り付け用の関数で作成されたデータ オブジェクトは、この関数から戻るときに MFC によって破棄されます。
別の方法で貼り付け操作を実現する場合は、貼り付けの後で必ずデータ オブジェクトを破棄してください。 データ オブジェクトが破棄されないうちは、どのアプリケーションもデータをクリップボードにコピーできません。
データ ソースの作成
データ ソースは転送元のアプリケーション (クライアントまたはサーバー) で使われます。 転送元アプリケーションにおけるデータ ソースは、転送元アプリケーションと転送先アプリケーションの接続の一方の端になります。 転送先アプリケーションのデータ オブジェクトは、データ ソースのデータを操作するために使われます。
データ ソースは、アプリケーションがデータをクリップボードに転送するときに作成されます。 通常、次の操作が行われます。
ユーザーがデータを選択します。
ユーザーが [編集] メニューの [コピー] または [切り取り] をクリックするか、ドラッグ アンド ドロップ操作を開始します。
COleDataSource オブジェクト、または COleDataSource の派生クラスのオブジェクトが作成されます。プログラムのデザインに応じて作成するオブジェクトが異なります。
関数 COleDataSource::CacheData または COleDataSource::DelayRenderData 系列の関数を呼び出して、選択されたデータをデータ ソースに挿入します。
操作手順 3. で作成されたオブジェクトのメンバー関数 SetClipboard (ドラッグ アンド ドロップの場合はメンバー関数 DoDragDrop) を呼び出します。
切り取りを行った場合、または DoDragDrop 関数が DROPEFFECT_MOVE を返した場合は、操作手順 1. で選択されたデータがドキュメントから削除されます。
以上の操作が OCLIENT と HIERSVR の両 MFC OLE サンプル プログラムで実現されています。 CView の派生クラスのソース コードで、関数 GetClipboardData と OnGetClipboardData 以外の部分を参照してください。 この 2 つの関数は、COleClientItem または COleServerItem の派生クラスで実装されます。 これらのサンプル プログラムは、これまでに述べた概念の実現例です。
ドラッグ アンド ドロップの既定の動作を変更する場合も、COleDataSource オブジェクトを作成する必要があります。 詳細についてを参照してください、ドラッグ アンド ドロップ:カスタマイズ記事。
データ ソースの破棄
データ ソースの破棄は、データ ソースを管理しているアプリケーションで必ず行います。 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)」、「クリップボードのトピック」、および「データ オブジェクトとデータ ソース : 操作」を参照してください。