在另一个表格上调用程序?

cod*_*123 3 delphi delphi-7 tadotable

我确定之前已经问过,但我似乎无法找到它.我使用下面的代码显示MS Access数据库中的图像.但是,我想知道如何执行以下操作:

- 是否可以采取以下程序并以另一种形式"召唤"它?

场景:三种形式.三个表,一个数据库.我通过TADOTable组件和TADOConnection访问表.

每个表单都有一个按钮(btnShowImage),用于显示数据库中的图片.为了使它当前工作,我需要将函数添加到窗体,然后在btnShowImage.OnClick中,我添加如下所示的过程.这种情况发生在所有三种形式上 我的问题是:无论如何都要提高效率.因为将这个代码添加到所有三种形式似乎有点乏味,如果它基本上是相同的(请记住,在过程中,表名在所有三种形式上都不同).有没有更简单的方法(显示图像),而不必在每个表单上使用所有这些代码?

谢谢你的帮助!

码:

...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;
Run Code Online (Sandbox Code Playgroud)

代码见:http://delphi.about.com/od/database/l/aa030601d.htm

Mas*_*ler 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;
Run Code Online (Sandbox Code Playgroud)

现在代码不关心表单或其任何细节; 它只需要一个TBlobField来读取和一个TImage来绘制图片,你可以在任意多种形式上使用它.

  • @Coder123:这并不总是显而易见的。但是,当您开始寻找像这样的重构机会时,您开始看到更多可以使用该技术的模式。:) (2认同)