次の方法で共有


データ オブジェクトとデータ ソース : 操作

更新 : 2007 年 11 月

データ オブジェクトまたはデータ ソースを作成すると、データの挿入や削除、データ形式の列挙など、多くの共通操作を実行できます。ここでは、このような共通操作を行うための手法について説明します。ここでは、次の内容について説明します。

  • データ ソースへのデータの挿入

  • データ オブジェクト内のデータ形式の判定

  • データ オブジェクトからのデータの読み出し

データ ソースへのデータの挿入

データをデータ ソースに挿入する方法は、データがすぐに与えられるのか、必要に応じて与えられるのか、また、どのような方法でデータが与えられるのかによって異なります。次の方法があります。

データをすぐに与える (即時レンダリング)

  • 関数 COleDataSource::CacheGlobalData をクリップボードのデータ形式ごとに繰り返し呼び出します。クリップボードのデータ形式、データ領域へのハンドル、およびデータを記述する FORMATETC 構造体 (省略可) を渡します。

    または

  • STGMEDIUM 構造体を直接扱う場合は、COleDataSource::CacheGlobalData の代わりに COleDataSource::CacheData を呼び出します。

データを必要に応じて与える (遅延レンダリング)

この情報は上級者が対象です。

  • 関数 COleDataSource::DelayRenderData をクリップボードのデータ形式ごとに繰り返し呼び出します。クリップボードのデータ形式、およびデータを記述する FORMATETC 構造体 (省略可) を渡します。データが必要になると、フレームワークによって関数 COleDataSource::OnRenderData が呼び出されます。この関数をオーバーライドする必要があります。

    または

  • CFile オブジェクトを使ってデータを与える場合は、関数 COleDataSource::DelayRenderData の代わりに、関数 COleDataSource::DelayRenderFileData を呼び出します。データが必要になると、フレームワークによって関数 COleDataSource::OnRenderFileData が呼び出されます。この関数をオーバーライドする必要があります。

データ オブジェクト内のデータ形式の判定

ユーザーがデータを貼り付ける前に、クリップボード上のデータ形式をアプリケーションで扱うことができるかどうかを判定する必要があります。アプリケーションでは、次の処理を行います。

  1. COleDataObject オブジェクトと FORMATETC 構造体を作成します。

  2. データ オブジェクトのメンバ関数 AttachClipboard を呼び出して、データ オブジェクトをクリップボード上のデータに関連付けます。

  3. 以下のいずれかを実行します。

    • 必要なデータ形式が 1 つか 2 つしかない場合は、データ オブジェクトのメンバ関数 IsDataAvailable を呼び出します。アプリケーションがサポートしているデータ形式の数に比べ、クリップボード上のデータがサポートしているデータ形式の方が多い場合は時間を節約できます。

      または

    • データ オブジェクトのメンバ関数 BeginEnumFormats を呼び出して、クリップボード上のデータの形式の列挙を開始します。次に、アプリケーションがサポートしているデータ形式が返されるか、すべてのデータ形式が列挙されるまで、GetNextFormat を繰り返し呼び出します。

ON_UPDATE_COMMAND_UI を使うと、ここで [編集] メニューの [貼り付け] コマンド、および場合によっては [形式を選択して貼り付け] コマンドも選択できます。この場合は、関数 CMenu::EnableMenuItem または CCmdUI::Enable を呼び出します。コンテナ アプリケーションでメニュー項目について行う処理とその時期の詳細については、「メニューとリソース : コンテナの変更点」を参照してください。

データ オブジェクトからのデータの取得

データ形式が決まれば、続いてデータ オブジェクトからデータを取得できます。ユーザーがデータを配置する位置を決めると、アプリケーションは適切な関数を呼び出します。次の 3 つの媒体からデータを読み出すことができます。

媒体

呼び出す関数

グローバル メモリ (HGLOBAL)

COleDataObject::GetGlobalData

ファイル (CFile)

COleDataObject::GetFileData

STGMEDIUM 構造体 (IStorage)

COleDataObject::GetData

通常、クリップボードのデータの形式に応じて、媒体が決まります。たとえば、CF_EMBEDDEDSTRUCT オブジェクトは必ず IStorage 媒体に格納されるので、STGMEDIUM 構造体を使います。したがって、STGMEDIUM 構造体を受け入れる唯一の関数である GetData を使用します。

クリップボードのデータ形式が IStream 媒体または HGLOBAL 媒体に格納されている場合は、データを参照する CFile ポインタがフレームワークから提供されます。アプリケーションでは、このポインタを使って、ファイルからデータをインポートする場合と同じようにデータを読み出します。これは、データ ソースの関数 OnRenderData および OnRenderFileData に対するクライアント側のインターフェイスです。

このような処理を行うと、ユーザーは、同じ形式のほかのデータの場合と同じように、データをドキュメントに挿入できるようになります。

さらに詳しくは次のトピックをクリックしてください

参照

概念

データ オブジェクトとデータ ソース (OLE)

参照

COleDataObject クラス

COleDataSource クラス