データ オブジェクトとデータ ソース : 操作
更新 : 2007 年 11 月
データ オブジェクトまたはデータ ソースを作成すると、データの挿入や削除、データ形式の列挙など、多くの共通操作を実行できます。ここでは、このような共通操作を行うための手法について説明します。ここでは、次の内容について説明します。
データ ソースへのデータの挿入
データ オブジェクト内のデータ形式の判定
データ オブジェクトからのデータの読み出し
データ ソースへのデータの挿入
データをデータ ソースに挿入する方法は、データがすぐに与えられるのか、必要に応じて与えられるのか、また、どのような方法でデータが与えられるのかによって異なります。次の方法があります。
データをすぐに与える (即時レンダリング)
関数 COleDataSource::CacheGlobalData をクリップボードのデータ形式ごとに繰り返し呼び出します。クリップボードのデータ形式、データ領域へのハンドル、およびデータを記述する FORMATETC 構造体 (省略可) を渡します。
または
STGMEDIUM 構造体を直接扱う場合は、COleDataSource::CacheGlobalData の代わりに COleDataSource::CacheData を呼び出します。
データを必要に応じて与える (遅延レンダリング)
この情報は上級者が対象です。
関数 COleDataSource::DelayRenderData をクリップボードのデータ形式ごとに繰り返し呼び出します。クリップボードのデータ形式、およびデータを記述する FORMATETC 構造体 (省略可) を渡します。データが必要になると、フレームワークによって関数 COleDataSource::OnRenderData が呼び出されます。この関数をオーバーライドする必要があります。
または
CFile オブジェクトを使ってデータを与える場合は、関数 COleDataSource::DelayRenderData の代わりに、関数 COleDataSource::DelayRenderFileData を呼び出します。データが必要になると、フレームワークによって関数 COleDataSource::OnRenderFileData が呼び出されます。この関数をオーバーライドする必要があります。
データ オブジェクト内のデータ形式の判定
ユーザーがデータを貼り付ける前に、クリップボード上のデータ形式をアプリケーションで扱うことができるかどうかを判定する必要があります。アプリケーションでは、次の処理を行います。
COleDataObject オブジェクトと FORMATETC 構造体を作成します。
データ オブジェクトのメンバ関数 AttachClipboard を呼び出して、データ オブジェクトをクリップボード上のデータに関連付けます。
以下のいずれかを実行します。
必要なデータ形式が 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 に対するクライアント側のインターフェイスです。
このような処理を行うと、ユーザーは、同じ形式のほかのデータの場合と同じように、データをドキュメントに挿入できるようになります。