OELオブジェクト型の画像をVBで表示するには・・・

解決


太陽  2004-04-14 19:07:36  No: 83003  IP: [192.*.*.*]

はじめまして太陽です。
今、VB6とAccessで顧客管理と売上伝票を作っているのですが、Accessのフィールドに設定したOELオブジェクト型にした画像をVBで表示したいのですが・・・。
方法がわかりません。
過去のログで同じような質問があったのですが、なにせ超初心者な者ですのでよくわかりませんでした。
超初心者でも分かるように教えてください。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-04-14 21:49:37  No: 83004  IP: [192.*.*.*]

> OELオブジェクト型にした画像をVBで表示したいのですが・・・。
OELではなく、OLEですよね。http://e-words.jp/w/OLE.html

> 方法がわかりません。
一番簡単なのは、「OLE コンテナ コントロール」に連結させる事でしょう。

> なにせ超初心者な者ですのでよくわかりませんでした。
では、とりあえずサンプルを。
VB付属の NWIND.MDB を使います。(CategoriesテーブルのPicture列を表示)

1. VB6を起動し、[標準 EXE]のプロジェクトを作成します。
2. Form1に、「データ コントロール」を貼ります。(Data1)
3. Form1に、「OLE コンテナ コントロール」を貼ります。(OLE1)
  この時、『オブジェクトの挿入』ダイアログが表示されますが、キャンセルします。
4. Data1の[DatabaseName]プロパティに、VB6をインストールしたフォルダにある NWIND.MDB を指定します。
5. Data1の[RecordSource]プロパティに、「Categories」を指定します。
6. OLE1の[DataSource]プロパティに、「Data1」を指定します。
7. OLE1の[DataField]プロパティに、「Picture」を指定します。

編集 削除
太陽  2004-04-14 23:14:01  No: 83005  IP: [192.*.*.*]

魔界の仮面弁士殿、早速の回答どうもありがとうございます。
出来ました(^^)。そこで、このことを使って私が作っている顧客管理で「OLE コンテナ コントロール」を貼り付けて[DataSource]プロパティを設定しようとすると、
 "このコントロールには相互性のあるデータソースがありません。
標準のデータコントロールまたはモーとデータコントロールをフォームに追加してください。" のエラーメッセージがでます。
データソースは、DataEnvirnmentで接続してしているのですが・・・?
なぜでしょうか?
あと2文目の意味もわかりません。私は何かおかしなことをしようとしてるのでしょか?
教えてください。よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-04-15 00:31:11  No: 83006  IP: [192.*.*.*]

OLEコンテナコントロールは、DataEnvironmentやADODCといった
「ADO系のコンポーネント」には接続できません。
先のサンプルに示したように、「Dataコントロール」を使ってください。

編集 削除
魔界の仮面弁士  2004-04-15 03:27:11  No: 83007  IP: [192.*.*.*]

なお、エラーメッセージにある「リモート データ コントロール」というのは、
Enterprise Edition(とRISC Edition)のみで利用可能なActiveXコントロールです。

・『データ コントロール』は、DAO(Data Access Object)系の[標準コントロール]。
・『リモート データ コントロール(RDC)』は、RDO(Remote Data Object)系の[ActiveXコントロール]。
・『ADOデータ コントロール(ADODC)』は、ADO(ActiveX Data Object)系の[ActiveXコントロール]。

編集 削除
太陽  2004-04-15 10:53:20  No: 83008  IP: [192.*.*.*]

魔界の仮面弁士殿、どうもありがとうございます。
すごく勉強になりました。
もし、DataEnvironmentで接続したものに、個人の顔写真を表示したかったのですが何か他に方法があれば教えていただきたいのですが、よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-04-15 12:11:36  No: 83009  IP: [192.*.*.*]

OLEオブジェクトフィールドに格納されたバイナリから、ビットマップデータを
切り出すという手法が、Knowledge Base で公開されています。
http://support.microsoft.com/default.aspx?kbid=175261

しかし、OLEオブジェクトの構造は、一般には公開されていませんので、
この手法を使ってうまく画像を取り出せるという保証はありません。

つまり現実的には、「Dataコントロール + OLEコンテナコントロール」という
選択肢を選ぶ事になります。


ただし、データの持ち方を変えれば、DataEnvironmentを使って
画像を表示する事も可能です。


方法1:
  mdbには、「画像ファイルのフルパス」を格納しておき、実行時には
  LoadPictureステートメントを併用して、画像を読み込むという手法。

この方法では、mdbとは別にHDD上に画像を保存する事になります。
mdbにバイナリデータを埋め込むと、ファイルサイズが肥大化してしまうため、
mdbファイルの肥大化を嫌う人などには、比較的、広く使われている手法です。


方法2:
  OLEデータとして埋め込むのではなく、画像の生のバイナリデータを
  mdbに格納するようにし、それを一時ファイルとしてHDDに保存した後、
  LoadPictureを使って読み込むようにする手法。

一時ファイルを使わなければいけないのが難点ですが、格納されるデータは
OLEオブジェクトとして埋め込まれた物ではなく、生のバイナリデータなので、
OLEとして埋め込まれた場合に比べると、データの復元が容易となります。

なお、バイナリデータの画像ファイルへの読み書きには、VBのGet#/Put#ステートメント、
mdbファイルへの読み書きには、DAO/ADOのGetChunk/AppendChunkメソッドが利用できます。


方法2':
  方法2と同様、mdbには生データを保存しておきますが、表示時には
  一時ファイルとして展開し、それをLoadPictureで読み込むのではなく、
  OleCreatePictureIndirect APIなどを使って、バイナリデータを
  直接、「Pictureオブジェクト」に変換する手法。

APIを使うので、コードは複雑になります。

編集 削除
太陽  2004-04-15 13:17:46  No: 83010  IP: [192.*.*.*]

魔界の仮面弁士殿、ご回答どうもありがとうございます。
超初心者には、かなり難しいですが、なんとかがんばって方法2を再現したいと思います。
魔界の仮面弁士殿、いろいろとご親切にありがとうございました。
とりあえず、トライしてみます。
また報告しますのでよろしくお願いします。

編集 削除