“OLE对象”字段的非法错误(50分)

  • 主题发起人 主题发起人 virtualmfc
  • 开始时间 开始时间
V

virtualmfc

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面的代码:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
aStream:TStringStream;
aBmp:TBitmap;
begin
{ TODO : 给照片字段赋值 }
aStream := TStringStream.Create('');
//aBmp := TBitmap.Create;
try
TBlobField(DSEmp.FieldByName('照片')).SaveToStream(aStream);
aStream.Position := 0;

//aBmp.LoadFromStream(aStream);
if aStream.Size > 0 then
DBImage1.Picture.Bitmap.LoadFromStream(aStream); ★
finally
//aBmp.Free;
aStream.Free;
end;
end;
数据库使用的是Access 2000中自带的罗斯文数据库的“雇员”表。
经调试发现执行到★处总显示Bitmap image is not Valid.
不知问题出在那里,该如何解决?
 
DBImage1的datasource、datafield设置好就可以了,为什么要这么麻烦?
 
可能原因:里面存的不是bmp类型。
 
我自己找到原因了,因为Access的示范数据库中存储的是OLE对象,而并非纯粹的二进制
格式的位图,经分析,可以在读取时去掉前面的74个字节即可。存入时加入前面的74个字节。
下面仅列出读取部分。

希望后来的学习者能够少走弯路...

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
aStream:TStringStream;
aBmp:TBitmap;
begin
{ TODO : 给照片字段赋值 }
aStream := TStringStream.Create('');
//aBmp := TBitmap.Create;
try
TBlobField(DSEmp.FieldByName('照片')).SaveToStream(aStream);
aStream.Position := 74; {注意这里,这就是问题所在之处}

//aBmp.LoadFromStream(aStream);
if aStream.Size > 0 then
DBImage1.Picture.Bitmap.LoadFromStream(aStream); ★
finally
//aBmp.Free;
aStream.Free;
end;
end;

 
后退
顶部