第二節(jié) 使用DBImage引出JPEG—錯(cuò)誤的方式
DBImage—思路一(The DBImage - take one)
當(dāng)試圖使用Delphi做新的嘗試時(shí),我所做的第一件事是向Delphi的自帶幫助尋求方法。這是幫助文檔將回答:TDBImage(在組件面板的Data Controls頁(yè))表示數(shù)據(jù)庫(kù)當(dāng)前記錄的一個(gè)BLOB字段的圖形圖像。使用TDBImage表示圖形字段值。TDBImage允許表單顯示數(shù)據(jù)庫(kù)的圖形數(shù)據(jù)。TDBImage僅僅比TImage組件多了一些數(shù)據(jù)可視屬性。其中兩個(gè)最重要的屬性是:DataSource(數(shù)據(jù)源)和Field(字段)。DataSource(數(shù)據(jù)源)屬性連接圖形組件到數(shù)據(jù)庫(kù)。在我們的表單上有一個(gè)名為DataSource1的DataSource(數(shù)據(jù)源)組件—代表著一個(gè)數(shù)據(jù)集。Field(字段)屬性指出擁有圖像的字段(在表中)。
一切都清楚了,現(xiàn)在在表單上放置一個(gè)DBImage組件并默認(rèn)名為DBImage1。為了真正的把DBImage與表的BLOB字段相連,我們僅需要做以下的配置(使用Object Inspector):
DBImage1.DataSource = DataSource1
DBImage1.Field = Picture
為了顯示存在applications表的Picture字段的JPEG圖像,這是必需的竅門(mén)。
為了驗(yàn)證這樣的配置是否可以工作,我們所需做的唯一一件事是設(shè)置ADOTable1組件的Active(激活)屬性為T(mén)rue即可。在設(shè)計(jì)時(shí)我們就可在Object Inspector(對(duì)象檢視器)中完成。一旦你這樣做了,就會(huì)出現(xiàn)以下的對(duì)話(huà)框:

什么?為什么顯示“位圖圖像無(wú)效”呢?我們有JPEG圖片而不是BMP圖片—問(wèn)題就在這里嗎?讓我們?cè)倩仡^看看幫助。
通過(guò)在幫助中的一陣點(diǎn)擊之后,得出結(jié)論:為了得到數(shù)據(jù)庫(kù)里的JPG圖片,我們得使用TJpegImage對(duì)象。為了顯示圖片,我們需要Image(圖像)組件的簡(jiǎn)單、不可視版本。同時(shí),我們需要用流(Stream)從BLOB對(duì)象中載出圖片。幫助文檔敘述:我們應(yīng)使用TADOBlobStream來(lái)訪(fǎng)問(wèn)或改變ADO數(shù)據(jù)集中BLOB或memo(備注)字段的值。
第三節(jié) 用流引出JPEG—錯(cuò)誤的方法
引出JPEG—思路二(Pulling the Jpeg - take two!)
既然我們不能使用DBImage做任何事—從表單中去掉它并放上一個(gè)普通的TImage組件(Additional頁(yè))命名為ADOImage。不幸的是,Image組件沒(méi)有任何數(shù)據(jù)可視(data-aware)的屬性,因此,需要一個(gè)單獨(dú)的程序來(lái)顯示它所表示的數(shù)據(jù)庫(kù)表中的圖片。完成這件事的最簡(jiǎn)單的方法是:在表單上放置一個(gè)Button(按鈕),把所有的程序代碼放在它的OnClick事件中,按鈕的名稱(chēng)為:“btnShowImage”。
為了使用ADOBLOBStream,幫助文檔建議創(chuàng)建一個(gè)TADOBlobStream實(shí)例,用“流”的方法從數(shù)據(jù)集中讀取圖形字段,然后釋放BLOB流。在中間的某個(gè)地方,我們將需要用LoadFromStream方法從TADOBlobStream對(duì)象中載入JPEG圖像。Image(圖像)組件的Picture(圖片)、Graphic(圖形)屬性將用于真正的存儲(chǔ)和顯示圖片。
字段對(duì)象,它是什么?
這時(shí),我假設(shè)只需要一點(diǎn)點(diǎn)關(guān)于字段對(duì)象的知識(shí)對(duì)于你掌握本章已綽綽有余了。在Delphi數(shù)據(jù)庫(kù)的開(kāi)發(fā)中,主要的對(duì)象之一是TField對(duì)象。字段組件是表示運(yùn)行(或設(shè)計(jì))時(shí)的數(shù)據(jù)集字段的非可視化對(duì)象。TADOTable(和其他TDataSet子類(lèi))提供設(shè)計(jì)時(shí)對(duì)Fields Editor(字段編輯器)的訪(fǎng)問(wèn)方法。Fields Editor使你能選擇數(shù)據(jù)集中你所想包含的字段。更重要的是,它創(chuàng)建了應(yīng)用程序數(shù)據(jù)集中使用的字段組件的穩(wěn)固的列表。為了調(diào)用Fields Editor,可以雙擊TADOTable組件。默認(rèn)情況下,字段列表是空的。點(diǎn)擊Add按鈕打開(kāi)一個(gè)對(duì)話(huà)框,里面列出了Applications表的字段列表。缺省情況下,所有字段都被選擇,然后選擇OK。
Delphi會(huì)按如下的方式給出字段的默認(rèn)名稱(chēng):Table(表)名+Field(字段)名。這意味著我們的圖片字段名為:ADOTable1Picture。
TADOBlobStream的Create(創(chuàng)建)方法創(chuàng)建一個(gè)實(shí)例用于讀或?qū)懸粋€(gè)指定的BLOB字段對(duì)象,在這里是ADOTable1Picture字段。
我們?cè)赽tnShowImage按鈕的OnClick事件中寫(xiě)入程序代碼。該代碼將從當(dāng)前所選行的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,讓我們運(yùn)行這個(gè)工程。當(dāng)然,設(shè)置ADOTable1.Active屬性為T(mén)rue。表單顯示后,點(diǎn)擊按鈕,將出現(xiàn)下面的顯示:

呃, 怎么哪?代碼百分之百的正確但為什么不顯示圖像呢!記住“永不放棄,永不投降”!讓我們深入到字節(jié)水平看看到底發(fā)生了什么!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注