第二節使用DBImage引出JPEG—錯誤的方式
DBImage—思路一(The DBImage - take one)
當試圖使用Delphi做新的嘗試時,我所做的第一件事是向Delphi的自備幫助尋求方法。這是說明文件將回答:TDBImage(在組件面板的Data Controls頁)表示資料庫目前記錄的一個BLOB欄位的圖形圖像。使用TDBImage表示圖形欄位值。 TDBImage允許表單顯示資料庫的圖形資料。 TDBImage僅比TImage元件多了一些資料視覺屬性。其中兩個最重要的屬性是:DataSource(資料來源)和Field(欄位)。 DataSource(資料來源)屬性連接圖形元件到資料庫。在我們的表單上有一個名為DataSource1的DataSource(資料來源)元件—代表一個資料集。 Field(欄位)屬性指出擁有映像的欄位(在表格中)。
一切都清楚了,現在在表單上放置一個DBImage元件並預設為DBImage1。為了真正的把DBImage與表格的BLOB欄位相連,我們只需要做以下的配置(使用Object Inspector):
DBImage1.DataSource = DataSource1
DBImage1.Field = Picture
為了顯示存在applications表的Picture欄位的JPEG影像,這是必需的竅門。
為了驗證這樣的配置是否可以工作,我們所需要做的唯一一件事是設定ADOTable1元件的Active(啟動)屬性為True即可。在設計時我們就可在Object Inspector(物件檢視器)中完成。一旦你這樣做了,就會出現以下的對話框:
什麼?為什麼顯示「點陣圖影像無效」呢?我們有JPEG圖片而不是BMP圖片—問題就在這裡嗎?讓我們再回頭看看幫助。
透過在幫助中的一陣點擊之後,得出結論:為了得到資料庫裡的JPG圖片,我們得使用TJpegImage物件。為了顯示圖片,我們需要Image(圖像)組件的簡單、不可視版本。同時,我們需要用流(Stream)從BLOB物件中載出圖片。幫助文檔敘述:我們應使用TADOBlobStream來存取或改變ADO資料集中BLOB或memo(備註)欄位的值。
第三節用流引出JPEG—錯誤的方法
引出JPEG—思路二(Pulling the Jpeg - take two!)
既然我們不能使用DBImage做任何事—從表單中去掉它並放上一個普通的TImage元件(Additional頁)命名為ADOImage。不幸的是,Image元件沒有任何資料視覺(data-aware)的屬性,因此,需要一個單獨的程式來顯示它所表示的資料庫表中的圖片。完成這件事的最簡單的方法是:在表單上放置一個Button(按鈕),把所有的程式碼放在它的OnClick事件中,按鈕的名稱為:「btnShowImage」。
為了使用ADOBLOBStream,幫助文件建議建立TADOBlobStream實例,用「流」的方法從資料集中讀取圖形字段,然後釋放BLOB流。在中間的某個地方,我們將需要用LoadFromStream方法從TADOBlobStream物件載入JPEG影像。 Image(圖像)組件的Picture(圖片)、Graphic(圖形)屬性將用於真正的儲存和顯示圖片。
字段對象,它是什麼?
這時,我假設只需要一點點關於字段物件的知識對於你掌握本章已綽綽有餘了。在Delphi資料庫的開發中,主要的物件之一是TField物件。欄位元件是表示運行(或設計)時的資料集欄位的非視覺化物件。 TADOTable(和其他TDataSet子類別)提供設計時對Fields Editor(欄位編輯器)的存取方法。 Fields Editor讓你可以選擇資料集中你所想包含的欄位。更重要的是,它創建了應用程式資料集中使用的欄位元件的穩固的清單。為了呼叫Fields Editor,可以雙擊TADOTable元件。預設情況下,欄位清單是空的。點選Add按鈕開啟一個對話框,裡面列出了Applications表的欄位清單。缺省情況下,所有欄位都被選擇,然後選擇OK。
Delphi會以如下的方式給予欄位的預設名稱:Table(表)名稱+Field(欄位)名稱。這意味著我們的圖片欄位名為:ADOTable1Picture。
TADOBlobStream的Create(建立)方法建立一個實例用於讀取或寫入一個指定的BLOB欄位對象,在這裡是ADOTable1Picture欄位。
我們在btnShowImage按鈕的OnClick事件中寫入程式碼。該程式碼將從目前所選行的Picture欄位中讀取圖片。原始碼如下所示:
uses jpeg;
……
PRocedure TForm1.btnShowImageClick(Sender: TObject);
var bS: TADOBlobStream;
Pic : TJpegImage;
begin
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
try
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
finally
Pic.Free;
end ;
finally
bS.Free
end ;
end ;
OK,讓我們運行這個工程。當然,設定ADOTable1.Active屬性為True。表單顯示後,點擊按鈕,將出現下面的顯示:
呃, 怎麼哪?程式碼百分之百的正確但為什麼不顯示圖像呢!記得「永不放棄,永不投降」!讓我們深入到位元組水平看看到底發生了什麼!