前文介紹的 TStream 方案適用 Access/SQL Server,但 Paradox 資料庫的 Graphic 欄位無法使用 Stream 讀寫。利用 TPicture.Graphic.Assign 直接指派圖像物件,可跨資料庫類型通用(含 Paradox)。
1. 選擇圖像並儲存至資料庫:
procedure TForm1.SelectImageClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
procedure TForm1.SaveToDBClick(Sender: TObject);
var Ext: String;
begin
if Image1.Picture.Graphic <> nil then
begin
ADOTable1.Edit;
ADOTable1.FieldByName('MyImage').Assign(Image1.Picture.Graphic); // 關鍵:直接指派
Ext := UpperCase(ExtractFileExt(OpenPictureDialog1.FileName));
if Ext = '.BMP' then
ADOTable1.FieldByName('IsBmp').Value := 1
else if (Ext = '.JPG') or (Ext = '.JPEG') then
ADOTable1.FieldByName('IsBmp').Value := 0;
ADOTable1.Post;
end;
end;
2. 讀取資料庫並顯示(AfterScroll 事件):
procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);
var JpegImage: TJPEGImage;
begin
Image1.Picture.Graphic := nil;
if ADOTable1.FieldByName('IsBmp').AsString = '1' then // BMP
Image1.Picture.Bitmap.Assign(ADOTable1.FieldByName('MyImage')) // 必須用 Bitmap
else if ADOTable1.FieldByName('IsBmp').AsString = '0' then // JPEG
begin
JpegImage := TJPEGImage.Create;
try
JpegImage.Assign(ADOTable1.FieldByName('MyImage'));
Image1.Picture.Graphic := JpegImage;
finally
JpegImage.Free;
end;
end;
end;
uses 子句必須包含 JPEG 單元Picture.Bitmap.Assign,不可用 Picture.Graphic.Assign,否則報錯TJPEGImage 中介物件,指派後設定給 Picture.GraphicIsBmp 標誌(0=JPEG, 1=BMP, 其他=無圖像)此方案在 Delphi 6.0 + SQL/Access/Paradox 測試通過,為跨資料庫圖像存取提供更通用的解決路徑。