3

これは以前に尋ねられたと確信していますが、見つけられなかったようです。以下のコードを使用して、MS Access データベースから画像を表示します。ただし、次のことを行う方法を知りたいです。

・以下の手続きをとり、別の形で「呼び出す」ことはできますか?

シナリオ: 3 つのフォーム。3 つのテーブル、1 つのデータベース。TADOTable コンポーネントと TADOConnection を介してテーブルにアクセスします。

各フォームには、データベースから画像を表示するためのボタン (btnShowImage) があります。現在機能するためには、関数をフォームに追加する必要があります。次に、btnShowImage.OnClick に、以下に示す手順を追加します。これは、3 つのフォームすべてで発生します。私の質問は次のとおりです。それをより効率的にする方法はありますか。このコードを 3 つのフォームすべてに追加するのは少し面倒に思えるので、基本的に同じことを行う場合 (手順では、3 つのフォームすべてでテーブル名が異なることに注意してください)。各フォームでこのすべてのコードを使用する必要なく、これを行う (画像を表示する) より簡単な方法はありますか?

助けてくれてありがとう!

コード:

...uses
    JPEG, ADODB, DB

function JpegStartsInBlob(PicField: TBlobField): integer;
var
  bS: TADOBlobStream;
  buffer: Word;
  hx: string;
begin
  Result := -1;
  bS := TADOBlobStream.Create(PicField, bmRead);
  try
    while (Result = -1) and (bS.Position + 1 < bS.Size) do begin
      bS.ReadBuffer(buffer, 1);
      hx := IntToHex(buffer, 2);
      if hx = 'FF' then begin
        bS.ReadBuffer(buffer, 1);
        hx := IntToHex(buffer, 2);
        if hx = 'D8' then
          Result := bS.Position - 2
        else if hx = 'FF' then
          bS.Position := bS.Position - 1;
      end;
    end;
  finally
    bS.Free
  end;
end;

procedure Tfrm3.btnShowImageClick(Sender: TObject);
var
  bS: TADOBlobStream;
  Pic: TJPEGImage;
begin
  bS := TADOBlobStream.Create(table1.FieldByName('Photo')
    as TBlobField, bmRead);
  bS.Seek(JpegStartsInBlob(table1.FieldByName('Photo') as TBlobField),
    soFromBeginning);
  Pic := TJPEGImage.Create;
  Pic.LoadFromStream(bS);
  frmOne.Image1.Picture.Graphic := Pic;
  Pic.Free;
  bS.Free;
end;

コードは次のサイトで見つかりました: http://delphi.about.com/od/database/l/aa030601d.htm

4

1 に答える 1

5

3 つの異なるフォームのボタンから呼び出さなければならないコードがあり、個々のフォームのコンテキストとのいくつかの特定の違いを除いてどこでもほぼ同じである場合、コードを取得して、し、その差をパラメータに変換します。例えば:

procedure LoadJPEGImage(field: TBlobField; image: TImage);
var
  bS : TADOBlobStream;
  Pic : TJPEGImage;
begin
  bS := TADOBlobStream.Create(field, bmRead);   
  Pic := TJPEGImage.Create;
  try
    bS.Seek(JpegStartsInBlob(field), soFromBeginning);
    Pic.LoadFromStream(bS);
    image.Picture.Graphic := Pic;
  finally
    Pic.Free;
    bS.Free;
  end;
end;

これで、コードはフォームやその詳細を気にしなくなりました。読み取り元の TBlobField と画像を描画する TImage が必要なだけで、必要な数のフォームで使用できます。

于 2012-07-19T21:26:36.427 に答える