セクション 2: DBImage を使用して JPEG を抽出する - 間違った方法
DBImage - 1 つを取得 (DBImage - 1 つを取得)
Delphi で何か新しいことをしようとするとき、私が最初にすることは、Delphi の組み込みヘルプにメソッドを尋ねることです。ヘルプ ドキュメントの答えは次のとおりです。 TDBImage (コンポーネント パレットのデータ コントロール ページ内) は、データベースの現在のレコード内の BLOB フィールドのグラフィック イメージを表します。 TDBImage を使用してグラフィックフィールド値を表します。 TDBImage を使用すると、データベースからのグラフィック データをフォームに表示できます。 TDBImage には、TImage コンポーネントよりもさらにデータ可視性プロパティがいくつかあるだけです。最も重要な 2 つのプロパティは、DataSource (データ ソース) と Field (フィールド) です。 DataSource プロパティは、グラフィカル コンポーネントをデータベースに接続します。私たちのフォームには、データセットを表す DataSource1 という名前の DataSource コンポーネントがあります。 Field プロパティは、画像を保持する (テーブル内の) フィールドを示します。
すべてが明確になったので、フォームに DBImage コンポーネントを配置し、デフォルトで DBImage1 という名前を付けます。 DBImage をテーブルの BLOB フィールドに実際に接続するには、(オブジェクト インスペクターを使用して) 次の構成を実行するだけです。
DBImage1.DataSource = データソース1
DBImage1.Field = 画像
これは、アプリケーション テーブルのピクチャ フィールドに存在する JPEG 画像を表示するために必要なトリックです。
この構成が機能することを確認するには、ADOTable1 コンポーネントの Active プロパティを True に設定するだけです。設計中にオブジェクト インスペクターで実行できます。これを実行すると、次のダイアログ ボックスが表示されます。
何? 「ビットマップ画像が無効です」と表示されるのはなぜですか? BMP 画像ではなく JPEG 画像がありますが、それは問題ですか?助けに戻りましょう。
ヘルプをクリックしてしばらく経った後、データベース内の JPG 画像を取得するには、TJpegImage オブジェクトを使用する必要があるという結論に達しました。画像を表示するには、画像コンポーネントの単純な非表示バージョンが必要です。同時に、ストリームを使用して BLOB オブジェクトから画像をロードする必要があります。ヘルプ ドキュメントの説明: ADO データ セット内の BLOB またはメモ (メモ) フィールドの値にアクセスまたは変更するには、TADOBlobStream を使用する必要があります。
セクション 3: ストリームを使用して JPEG を抽出する - 間違った方法
JPEG を取得 - 2 つ取ります!
DBImage では何もできないため、フォームから DBImage を削除し、ADOImage という名前の通常の TImage コンポーネント (追加ページ) に置きます。残念ながら、画像コンポーネントにはデータ対応プロパティがないため、それが表すデータベース テーブルから画像を表示するには別のプログラムが必要です。これを実現する最も簡単な方法は、フォーム上にボタンを配置し、その OnClick イベントにすべてのプログラム コードを配置し、ボタンに「btnShowImage」という名前を付けることです。
ADOBLOBStream を使用するには、ヘルプ ドキュメントでは、TADOBlobStream インスタンスを作成し、「stream」メソッドを使用してデータ セットからグラフィックス フィールドを読み取り、BLOB ストリームを解放することを推奨しています。途中で、LoadFromStream メソッドを使用して、TADOBlobStream オブジェクトから JPEG 画像をロードする必要があります。 Image コンポーネントの Picture プロパティと Graphic プロパティは、実際に画像を保存および表示するために使用されます。
フィールドオブジェクト、それは何ですか?
この時点では、フィールド オブジェクトについて少し知識があれば、この章を習得するには十分だと思います。 Delphi データベースの開発において、主要なオブジェクトの 1 つは TField オブジェクトです。フィールド コンポーネントは、実行時 (またはデザイン時) にデータセットのフィールドを表す非ビジュアル オブジェクトです。 TADOTable (および他の TDataSet サブクラス) は、フィールド エディターへの設計時のアクセスを提供します。フィールド エディターを使用すると、データ セットに含めるフィールドを選択できます。さらに重要なのは、アプリケーションのデータセットで使用されるフィールド コンポーネントの堅牢なリストを作成することです。フィールド エディタを呼び出すには、TADOTable コンポーネントをダブルクリックします。デフォルトでは、フィールドリストは空です。 [追加] ボタンをクリックして、アプリケーション テーブルのフィールドをリストするダイアログ ボックスを開きます。デフォルトでは、すべてのフィールドが選択されているので、「OK」を選択します。
Delphi は、テーブル (テーブル) 名 + フィールド (フィールド) 名というフィールドのデフォルト名を付けます。これは、画像フィールドの名前が ADOTable1Picture であることを意味します。
TADOBlobStream の Create メソッドは、指定された BLOB フィールド オブジェクト (この場合は ADOTable1Picture フィールド) を読み書きするためのインスタンスを作成します。
btnShowImage ボタンの OnClick イベントにプログラム コードを記述します。このコードは、現在選択されている行の Picture フィールドから画像を読み取ります。ソースコードは次のとおりです。
JPEGを使用します。
...
手順TForm1.btnShowImageClick(送信者: TObject);
var bS: TADOBlobStream;
写真: TJpegImage;
始める
bS := TADOBlobStream.Create
(AdoTable1Picture、bmRead);
試す
Pic:=TJpegImage.Create;
試す
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
ついに
写真無料。
終わり;
ついに
bS.フリー
終わり;
終わり;
OK、このプロジェクトを実行しましょう。もちろん、ADOTable1.Active プロパティを True に設定します。フォームが表示されたら、ボタンをクリックすると次の画面が表示されます。
え、何が起こっているのですか?コードは 100% 正しいのに、画像が表示されないのはなぜですか? 「決して諦めない、決して降伏しない」を忘れないでください!バイトレベルまでドリルダウンして、何が起こっているのか見てみましょう。