我在网上下了一个关于使用 Image 读取 Access 中 OLE 类型字段的程序代码
想用来读取我的库中的 OLE 类型字段,这个字段是保存 BMP 图片的,名称为 Photo
可是下载的程序代码总是报错“位图图像无效”
而我的库设计和图片格式均正确不知何故,请高手分析一下
以下是我下载的代码部分是用于处理 OLE 字段的过程
procedure LoadImageFromField(APicture: TPicture; AField: TBlobField);
var
ABitmap: TBitmap;
AStream: TMemoryStream;
begin
if AField.IsNull then
Exit; AStream := TMemoryStream.Create;
try
AField.SaveToStream(AStream); // Skip OLE storage header
AStream.Seek(78, soFromBeginning);
ABitmap := TBitmap.Create;
try
ABitmap.LoadFromStream(AStream);
APicture.Graphic := ABitmap;
finally
ABitmap.Free;
end;
finally
AStream.Free;
end;
end;经查,错误总是出现在 ABitmap.LoadFromStream(AStream);
将此行删除,程序可以正常运行,但没有图片显示在 ADODataSet1 的 AfterScroll 事件中呼叫 LoadImageFromField 函式:procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet);
begin
LoadImageFromField(
Image1.Picture,
DataSet.FieldByName('Photo') as TBlobField
);
end;
请高手过目,并指出存在的问题!!!!!
谢谢
想用来读取我的库中的 OLE 类型字段,这个字段是保存 BMP 图片的,名称为 Photo
可是下载的程序代码总是报错“位图图像无效”
而我的库设计和图片格式均正确不知何故,请高手分析一下
以下是我下载的代码部分是用于处理 OLE 字段的过程
procedure LoadImageFromField(APicture: TPicture; AField: TBlobField);
var
ABitmap: TBitmap;
AStream: TMemoryStream;
begin
if AField.IsNull then
Exit; AStream := TMemoryStream.Create;
try
AField.SaveToStream(AStream); // Skip OLE storage header
AStream.Seek(78, soFromBeginning);
ABitmap := TBitmap.Create;
try
ABitmap.LoadFromStream(AStream);
APicture.Graphic := ABitmap;
finally
ABitmap.Free;
end;
finally
AStream.Free;
end;
end;经查,错误总是出现在 ABitmap.LoadFromStream(AStream);
将此行删除,程序可以正常运行,但没有图片显示在 ADODataSet1 的 AfterScroll 事件中呼叫 LoadImageFromField 函式:procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet);
begin
LoadImageFromField(
Image1.Picture,
DataSet.FieldByName('Photo') as TBlobField
);
end;
请高手过目,并指出存在的问题!!!!!
谢谢
procedure TForm3.Button1Click(Sender: TObject);
var
s:TMemoryStream;
begin
If Opendialog1.Execute then
begin
s:=TMemoryStream.Create;
try
Image1.Picture.LoadFromFile(opendialog1.filename);
image1.Picture.Graphic.SaveToStream(s);
Form2.ADOQuery1.Edit;
s.Position:=0;
TblobField(Form2.ADOQuery1.FieldByName('照片')).loadfromstream(s);
Form2.ADOQuery1.Post;
Finally
s.Free;
end;
end;
end;