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