200分求救简单问题! (200分)

  • 主题发起人 主题发起人 gtgtgt
  • 开始时间 开始时间
G

gtgtgt

Unregistered / Unconfirmed
GUEST, unregistred user!
我把一些图片以流的方式存入数据库(不能采取存图片路径的方法)并显示,开始都正常,可运行几次后,同样的程序,编译都通过不了,出现'jpeg error #52'提示。
我已经查了以前的很多帖子,开始认为是我存的JPG图片格式不对,换了个图片,开始一切正常,可运行几次后,故障依旧,怎么办?因马上要交工,十分紧急,多谢了!!

程序如下:
procedure TForm1.Button1Click(Sender: TObject);//图片存入数据库
begin
if opendialog1.Execute then
begin
adoTable1.edit;
(adoTable1.FieldByName('photo') as TBlobField).loadfromfile(opendialog1.FileName);
adoTable1.post;
end;
end;


procedure TForm1.DBEdit1Change(Sender: TObject);//随着dbedit1(编号字段)的变化,显示相应的图片
var
m:TMemoryStream;
jpg:TJpegImage;
begin
if not adotable1.fieldbyname('photo').IsNull then
begin
m := TmemoryStream.Create;
jpg := TJpegImage.Create;
try
(adoTable1.FieldByName('photo') as TBlobField).SaveToStream(m);
m.Seek(0,sofrombeginning);
jpg.LoadFromStream(m);
Image1.Picture.bitmap.Assign(jpg);
jpg.Free;
m.Free;
except
end;
end
else
image1.picture.Assign(Nil);
end;


 
看来就是文件格式问题
procedure Tfrm_sfxm.popmnuitm_imageClick(Sender: TObject);
var
jpg:tjpegimage;
extname,fname:string;
begin
tblxmxgwj.Insert;
if OpenPictureDialog1.Execute then
begin
fname:=OpenPictureDialog1.FileName;
ext:=uppercase(extractfileext(fname));
// fname:=OpenPictureDialog1.FileName;
extname:=uppercase(extractfileext(fname));
if extname='.BMP' then DBImage1.Picture.LoadFromFile(fname);
if (extname='.JPG') or (extname='.JPEG') then
begin
jpg:=Tjpegimage.Create;
try
jpg.LoadFromfile(fname);
// DBImage1.Picture.Graphic.Assign(jpg);
DBImage1.Picture.LoadFromFile(fname) ;
finally
jpg.Free;
end;
end;
end;
end;
 
我刚试了,不对。出现 ‘bitmap image is not valid'
我想是因为DBIMAGE 不支持JPG格式造成的。
 
你的 程序没什么错的,还应该是图片格式问题,建议再重新换个图片试试
 
编译都时好时坏,那可就邪门了...
 
应该看看你把图片保存进数据库的代码!
可能图片没有存全1

我记得以前也出过这个错!原因就是图片写入有问题!
 
我的图片存入数据库的程序在上面,请各位高手指教!!
 
看这段程序:
procedure TForm1.DBEdit1Change(Sender: TObject);//随着dbedit1(编号字段)的变化,显示相应的图片
var
m:TMemoryStream;
jpg:TJpegImage;
begin
if not adotable1.fieldbyname('photo').IsNull then
begin
m := TmemoryStream.Create;
jpg := TJpegImage.Create;
try
(adoTable1.FieldByName('photo') as TBlobField).SaveToStream(m);
m.Seek(0,sofrombeginning);
jpg.LoadFromStream(m);
Image1.Picture.bitmap.Assign(jpg);
jpg.Free;
m.Free;
except
//这里把异常关了,出错了都不会知道;
end;
end
else
image1.picture.Assign(Nil);
end;

改成这样试试:
procedure TForm1.DBEdit1Change(Sender: TObject);//随着dbedit1(编号字段)的变化,显示相应的图片
var
m:TMemoryStream;
jpg:TJpegImage;
begin
if not adotable1.fieldbyname('photo').IsNull then
begin
m := TmemoryStream.Create;
try
jpg := TJpegImage.Create;
try
(adoTable1.FieldByName('photo') as TBlobField).SaveToStream(m);
m.Seek(0,sofrombeginning);
jpg.LoadFromStream(m);
Image1.Picture.bitmap.Assign(jpg);
finally
jpg.Free;
end;
finally
m.Free;
end;
end
else
image1.picture.Assign(Nil);
end;

有错误要让程序报出来,否则出错了,原因都找不到。
 
据我估计,很可能有是内存泄漏,因为出现异常而导致m或者
jpg没有释放掉。

 
同意thx1180,养成一个良好的习惯对于编程有百利而无一害。
 
m := TmemoryStream.Create;
jpg := TJpegImage.Create;

就看你不停的建立对象却没见你释放过!!!!

不要以为局部的对象就不需要自己动手来处理垃圾了
 
接受答案了.
 

Similar threads

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