我已经想出了如何在我的数据库中存储和检索JPEG文件。如果JPEG文件在那里,我可以轻松编辑它,但如果我尝试输入新记录,我总是得到JPEG错误#42。这是我的代码片段。我使用btnLabelGetClick将图像上传到要发布的流。
procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
JPG: TJPEGImage;
ms: TMemoryStream;
begin
JPG := TJPEGImage.Create;
ms := TMemoryStream.Create;
try
TBlobField(wdatamod.mywines.FieldByName('winelabel')).SaveToStream(ms);
ms.Position := 0;
JPG.LoadFromStream(ms);
Image1.Picture.Assign(JPG);
finally
JPG.Free;
ms.Free;
end;
end;
procedure TfrmWines.btnAddClick(Sender: TObject);
begin
ButtonsEnter;
//btnLabelGet.Click;
wdatamod.mywines.Insert;
edWinename.SetFocus;
end;
procedure TfrmWines.btnLabelGetClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute(Self.Handle) then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
答案 0 :(得分:0)
我解决了这个问题并编码了为所有新记录添加常备图像的方法,如果我没有想要使用的图像:
if autoset.DataSet.State = dsInsert then
begin
image1.Picture.Graphic.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
Exit;
end;
以下是在添加新记录时阻止JPEG错误#42的新代码
procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
JPG:TJPEGImage;
ms:TMemoryStream;
begin
if autoset.DataSet.State = dsInsert then
begin
image1.Picture.Graphic.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
Exit;
end;
begin
JPG:=TJPEGImage.Create;
ms:=TMemoryStream.Create;
try
TBlobField(wdatamod.mywines.FieldByName('winelabel')).SaveToStream(ms);
ms.Position := 0;
JPG.LoadFromStream(ms);
Image1.Picture.Assign(JPG);
finally
JPG.Free;
ms.Free;
end;
end;
end;
答案 1 :(得分:0)
如果您的BLOB字段为空,则无法将数据加载到1023344a
。在调用TJPEGImage
之前,您需要检查该条件。
另外,我建议使用LoadFromStream()
而不是使用TDataSet.CreateBlobStream()
来复制内存中的BLOB数据。让TBlobStream.SaveToStream()
直接从数据库读取数据,TJPEGImage
知道如何使用流读取/写入BLOB数据。
尝试更像这样的事情:
DataSet
可替换地:
procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
Fld: TField;
JPG: TJPEGImage;
strm: TStream;
begin
Fld := wdatamod.mywines.FieldByName('winelabel');
if (Fld.DataSet.State = dsInsert) or (TBlobField(Fld).BlobSize = 0) then
begin
Image1.Picture.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
end else
begin
JPG := TJPEGImage.Create;
try
strm := Fld.DataSet.CreateBlobStream(Fld, bmRead);
try
JPG.LoadFromStream(strm);
finally
strm.Free;
end;
Image1.Picture.Assign(JPG);
finally
JPG.Free;
end;
end;
end;