首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi7 + SQL2000 处理image 有关问题

2012-03-12 
Delphi7 + SQL2000 处理image 问题.程式 A (易助4.0 商品信息可加入图片小程式)程式 B 自己写的delphi7 小

Delphi7 + SQL2000 处理image 问题.
程式 A (易助4.0 商品信息可加入图片小程式)
程式 B 自己写的delphi7 小程式
程式 C SQL Image Viewer

问题:
程式 A存的图, 用程式B看会出 error#53
程式 B存的图, 用程式A看会登出系統
程式 C 可以看到 程式 A/B存的图.(没有储存功能)

程式 B还可以怎让改?
程式 B源码如下:

unit Main;

interface


uses

  Variants,

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, ABSMain, Jpeg,
  ADODB;



type



  TfrmMain = class(TForm)
  DataSource1: TDataSource;
  DBGrid1: TDBGrid;
  DBNavigator1: TDBNavigator;
  btSaveImage: TButton;
  odBlob: TOpenDialog;
  sdBlob: TSaveDialog;
  btLoadImage: TButton;
  GroupBox2: TGroupBox;
  Photo: TImage;
  ADOTable1: TADOTable;



  procedure btLoadImageClick(Sender: TObject);
  procedure btSaveImageClick(Sender: TObject);
  procedure ADOTable1AfterScroll(DataSet: TDataSet);
  private
  { Private declarations }
  public
  { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation
{$R *.dfm}







//------------------------------------

procedure TfrmMain.btLoadImageClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
 if (odBlob.Execute) then
  begin
  ADOTable1.Edit;
  try
  BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmWrite);
  FileStream := TFileStream.Create(odBlob.FileName,fmOpenRead or fmShareDenyNone);
  BlobStream.CopyFrom(FileStream,FileStream.Size);
  FileStream.Free;
  BlobStream.Free;
  ADOTable1.Post;
  ADOTable1AfterScroll(ADOTable1);
  except
  ADOTable1.Cancel;
  end;
  end;
end;

procedure TfrmMain.btSaveImageClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if (sdBlob.Execute) then
  begin
  FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
  BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmRead);
  FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
  BlobStream.Free;
  FileStream.Free;
  end;
end;

procedure TfrmMain.ADOTable1AfterScroll(DataSet: TDataSet);
var
  JpegImage: TJPEGImage;
  BlobStream: TStream;
 begin
  if (not ADOTable1.FieldByName('DEB002').IsNull) then
  begin
  BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmRead);
  JpegImage := TJPEGImage.Create;
  try
  JpegImage.LoadFromStream(BlobStream);
  Photo.Picture.Assign(JpegImage);
  Photo.Visible := True;
  finally
  JpegImage.Free;
  BlobStream.Free;
  end;
  end
  else
  Photo.Visible := False;
end;
end.




[解决办法]
会不会是图片的不同格式引起的问题。
[解决办法]
代码仅处理了jpg图片,LZ确定程序a存入的是jpg格式么?不是png或者bmp之类的?

[解决办法]
帮你顶顶帖子先


[解决办法]
对各种格式的图片应区分处理,本人有一个想法也不知对不对,就是不管什么格式的图片先存入数据库,显示之前全转换为jpg格式,因为jpg格式可以在image控件里显示。
[解决办法]
在数据库中添加一列'Image_Type'来存放图片格式,jpg为0;bmp为1
procedure TfrmMain.ADOTable1AfterScroll(DataSet: TDataSet);
var
JpegImage: TJPEGImage;
bmpImage:TBitmap;
BlobStream: TStream;
 begin
if (not ADOTable1.FieldByName('Image_List').IsNull) then
begin
BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('Image_List'),bmRead);
try
if ADOTable1.FieldByName('Image_Type').AsString = '1' then
begin
bmpImage := TBitmap.Create;
bmpImage.LoadFromStream(BlobStream);
Photo.Picture.Assign(bmpImage);
bmpImage.Free;
end else
begin
JpegImage := TJPEGImage.Create;
JpegImage.LoadFromStream(BlobStream);
Photo.Picture.Assign(JpegImage);
JpegImage.Free;
end;
Photo.Visible := True;
finally
BlobStream.Free;
end;
end
else
Photo.Visible := False;
end;
[解决办法]
delphi 7 下 的TImage 支持 bmp,jpg格式, 不支持 png, 但网上可以找到一个支持 png的; 可以在存取数据库中的图片时统一为 jpg格式就可以了.

热点排行