第二節 使用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。表單顯示后,點擊按鈕,將出現下面的顯示:
呃, 怎么哪?代碼百分之百的正確但為什么不顯示圖像呢!記住“永不放棄,永不投降”!讓我們深入到字節水平看看到底發生了什么!
新聞熱點
疑難解答
圖片精選