delphi - 在另一种形式上调用过程?

标签 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;

代码发现于:http://delphi.about.com/od/database/l/aa030601d.htm

最佳答案

如果我有必须从 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 来绘制图片,并且您可以在任意多种表单上使用它。

关于delphi - 在另一种形式上调用过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569398/

相关文章:

delphi - 我无法在打开和保存对话框中获得 Delphi 上下文相关帮助

string - Delphi 'string' 文字怎么可能超过 255 个字符?

excel - 使用 Excel 的 Delphi Ole Automation 获取文本而不是值

delphi - 如何从表单中删除标题栏

delphi - 如何生成CRC-6的CRC表?

delphi - 使用Delphi XE8 Firemonkey + Android 4.4的黑屏

delphi - 如何将 Delphi ADOTable 过滤器应用于日期数据类型

Delphi 异常不允许我看到局部变量

delphi - AdoDB 对合并列进行过滤