delphi怎样在access中插入ole图片对象,要用access打开的时候显示[位图图像],不能显示[长二进制数据](100分)

  • 主题发起人 主题发起人 lphy
  • 开始时间 开始时间
L

lphy

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi怎样在access中插入ole图片对象,
要用access打开的时候显示[位图图像](双击能通过画图程序显示),
不能显示[长二进制数据](双击不能显示)。

我在网上找了好几天,介绍的方法都是插出后,打开access表,类型显示为[长二进制数据]
而手工插入图片则会显示[位图图像]。

delphi怎样是的插入的图片显示为[为图图像]呢
 
我插入图片的格式是bmp的
 
我的也是打开access表,类型显示为[长二进制数据]
要想用ole,恐怕不能按照普通存取blob类型的方法来存取。
 
delphi中操作时,把位图文件读入bmpdata:string中,再在bmpdata前面加上74个字节
#21#28#43#0#2#0#0#0#9#0#14#0#20#0#29#0#255#255#255#255#206#187#205#188
#205#188#207#241#0#80#97#105#110#116#46#80#105#99#116#117#114#101#0#1#5
#0#0#2#0#0#0#7#0#0#0#80#66#114#117#115#104#0#0#0#0#0#0#0#0#0#224#52#4#0

在bmpdata后面加上14个字节:
#0#0#1#5#0#0#0#0#0#0#123#173#5#254

若要在delphi中读取来显示,要先去掉上面加上的数据。
 
用流操作成功。
 
to:skadon
谢谢你!
但是我搞了好几天还没搞出来,始终是[长二进制数据]
你能把关键的代码贴一下嘛?
谢谢!!
 
一个利用TBlobStream在数据库中保存BMP和JPG图片的例子
http://www.aidelphi.com/6to23/Docu/BlobStream.zip
 
to:app2001
你的源代码写入的图片依然是[长二进制数据]
没有解决我的问题
 
用流操作
TBlobField(Field_Value)。SaveToFile(‘Temp。Bmp’)
 
skadon你在那里呀?
 
插入的OLE BMP对象是这样的,前74个字节是固定的,主要包含'Bitmap Image','Paint.Pictur'等字符串和其它东西(不知道是什么),接着的4个字节是文件大小,这个大小必须是32的整数倍,不足的用0补齐,下来是文件(包括尾部用来补齐的0),最后是12个字节的尾部,倒数第4个字节实际是变化的,不知道是做什么用的,不过我用ff也没什么问题。
下面是例子程序,我没加try什么的,只是示意:
procedure TForm1.Button1Click(Sender: TObject);
const
b: array[0..73] of byte = ( // 头部
$15,$1c,$2f,$00,$02,$00,$00,$00,$0d,$00,$0e,$00,$14,$00,$21,$00,
$ff,$ff,$ff,$ff,$42,$69,$74,$6d,$61,$70,$20,$49,$6d,$61,$67,$65,
$00,$50,$61,$69,$6e,$74,$2e,$50,$69,$63,$74,$75,$72,$65,$00,$01,
$05,$00,$00,$02,$00,$00,$00,$07,$00,$00,$00,$50,$42,$72,$75,$73,
$68,$00,$00,$00,$00,$00,$00,$00,$00,$00);
e: array[0..11] of byte = ( // 尾部
$01,$05,$00,$00,$00,$00,$00,$00,$ff,$ad,$05,$fe);
zero: byte = 0; // 补齐的0
var
bs: TADOBlobStream;
fs: TFileStream;
size, len, i: integer; // 文件大小,写入OLE的长度(32的整数倍)
begin
fs := TFileStream.Create('E:/pic/b3711.bmp', fmOpenRead);
size := fs.Size;
len := size + 32 - (size mod 32);
ADOTable1.Edit;
bs := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('photo')), bmWrite);
bs.Write(b, 74);
bs.Write(len, 4);
bs.CopyFrom(fs, 0);
for i := 1 to len - size do
bs.Write(zero, 1);
bs.Write(e, 12);
bs.Free;
ADOTable1.Post;
fs.Free;
end;
 
Win XP + Delphi 6 + Access 2000 测试通过,在Access里显示为'Bitmap Image',可以双击打开。
 
多人接受答案了。
 
抱歉,我没勾上email回复
补上
procedure TForm1.Button1Click(Sender: TObject);
var
Tstr:string;
buf1,buf2,buf : PChar;
k :integer;
Ts:TMemoryStream;
begin
Memo1.Clear;
Tstr:='Provider=Microsoft.Jet.OLEDB.4.0;'
+ 'Data Source=' + ExtractFilePath(Application.ExeName) + 'db1.mdb;'
+ 'Persist Security Info=False';
ADO1.ConnectionString :=Tstr;
ADO1.Close;
ADO1.CommandText:='select * from db where 1=1';
ADO1.Active :=true;
buf1:=#21#28#43#0#2#0#0#0#9#0#14#0#20#0#29#0#255#255#255#255#206#187#205#188#205
+ #188#207#241#0#80#97#105#110#116#46#80#105#99#116#117#114#101#0#1#5#0
+ #0#2#0#0#0#7#0#0#0#80#66#114#117#115#104#0#0#0#0#0#0#0#0#0#224#52#4#0;
buf2:= #0#0#1#5#0#0#0#0#0#0#123#173#5#254;
Ts:=TMemoryStream.Create;
Ts.LoadFromFile('E:/Tmp/B.bmp');
k:=Ts.Size;
Getmem(buf,k);
Ts.Position :=0;
Ts.Read(buf^,k);
Ts.Clear;
Ts.Write(buf1^,74);
Ts.Write(buf^,k);
FreeMem(buf);
Ts.Write(buf2^,14);
Ts.Position :=0;
ADO1.Append;
TBlobField(ADO1.Fields[1]).LoadFromStream(Ts);
ADO1.UpdateCursorPos;
ADO1.Prior;
Ts.Free;
end;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部