我确定之前已经问过,但我似乎无法找到它。我使用下面的代码显示MS Access数据库中的图像。但是,我想知道如何执行以下操作:
- 是否可以采取以下程序并以另一种形式“调用”它?
场景 :三种形式。三个表,一个数据库。我通过TADOTable组件和TADOConnection访问表。
每个表单都有一个按钮(btnShowImage),用于显示数据库中的图片。为了使它当前工作,我需要将函数添加到窗体,然后在btnShowImage.OnClick中,我添加如下所示的过程。这种情况发生在所有三种形式上我的问题是:无论如何都要提高效率。因为将这个代码添加到所有三种形式似乎有点乏味,如果它基本上是相同的(请记住,在过程中,表名在所有三种形式上都不同)。有没有更简单的方法(显示图像),而不必在每个表单上使用所有这些代码?
感谢您的帮助!
CODE:
...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;
答案 0 :(得分: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来绘制图片,你可以在任意多种形式上使用它。