修改TDBImage的源码,改:
procedure TDBImage.LoadPicture;
type TGraphicFmt=(gfUnKnown,gfBitmap,gfJpg);
var BlobStrm: TStream;
GraphicFmt: TGraphicFmt;
procedure getGraphicClass;
var b1,b2,b3: Byte;
begin
//Bmp:42 4d Jpg:FF D8 Gif: 47 49 46 wmf: D7 CD Ico:00 00 01
BlobStrm.Seek(0,0);
BlobStrm.Read(B1,1);
BlobStrm.Read(B2,1);
BlobStrm.Read(B3,1);
GraphicFmt:=gfUnknown;
if (B1=$42) and (B2=$4d) then GraphicFmt:=gfBitmap
else if (B1=$FF) and (B2=$D8) then GraphicFmt:=gfJpg;
end;
begin
if not FPictureLoaded and (not Assigned(FDataLink.Field) or
FDataLink.Field.IsBlob) then
// Picture.Assign(FDataLink.Field);
begin
if Assigned(FDataLink.Field) and(not FDataLink.Field.IsNull) then
begin
BlobStrm:=FDataLink.DataSet.CreateBlobStream(FDataLink.Field, bmRead);
try
GraphicFmt:=gfUnknown;
if BlobStrm.Size > 10 then getGraphicClass;
case GraphicFmt of
gfJpg:begin
if (Picture.Graphic=nil)or(not (Picture.Graphic is TJpegImage)) then
begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=TJpegImage.Create;
end;
end;
gfBitmap:begin
if (Picture.Graphic=nil)or(not (Picture.Graphic is TBitmap)) then
begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=TBitmap.Create;
end;
end;
else begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=nil;
end;
end;
if Picture.Graphic<>nil then
begin
BlobStrm.Seek(0,0);
Picture.Graphic.LoadFromStream(BlobStrm);
end else Paint;
finally
BlobStrm.Free;
end;
end
else Picture.Bitmap.Assign(nil);
end;
end;
procedure TDBImage.UpdateData(Sender: TObject);
var BlobStrm: TStream;
begin
//if Picture.Graphic is TBitmap then
// FDataLink.Field.Assign(Picture.Graphic) else
if Picture.Graphic<>nil then
begin
BlobStrm := FDataLink.DataSet.CreateBlobStream(FDataLink.Field, bmWrite);
try
Picture.Graphic.SaveToStream(BlobStrm);
finally
BlobStrm.Free;
end;
end else
FDataLink.Field.Clear;
end;