如何讓DBimage1載入jpeg檔 |
尚未結案
|
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
|
sos_admin
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 這個問題有蠻多的朋友都提到過, 整理一下, 請參閱一些相關的連結:
結合TMemoryStream和TJpegImage來顯示圖檔之連接:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30976 小弟建議您使用DBEdit和Image元件來配合顯示与儲存圖檔, 其好處可以減小資料庫檔案空間﹐因為圖檔存進資料庫﹐一定是增加了蠻可觀的大小﹐這種變通的方法﹐可避免因為因資料庫檔案空間過大而影響資料存取的效率, 相關連接如下:
1. justmade版主的范例之連接:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27715
2. 判斷圖檔是否存在之連接:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37249
3. 其它問題之連接:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37248 其它的方法:
1. danny前輩提供的元件之連接:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19322 參考看看! =====================
努力,相信會獲得美麗!
忻晟
------
忻晟 |
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
ㄚ我要瘋了 我是了好久 最後我用了 "領航天使"大大的方法去做 可是還是有
問題耶 以下是"領航天使"大大教的連結http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19505 可以幫我看一下 哪裡出問題嗎? 我try了粉久 啊 ! 快受不了了 以下是我的程式 一開始的密碼登入框的密碼是(1234)我寫到程式碼中 http://delphi.ktop.com.tw/loadfile.php?TOPICID=12053643&CC=269577 麻煩各位了
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 我將您的程式範例下載后看了一下, 問題是出了您目前的資料表中沒有img_filename; img_filedata資料欄位, 而程式碼中用這樣的欄位做存取的動作, 當然就會出錯了. 另外, 其它的部分我還沒有查, 有一個建議, 就是在資料庫中, 盡量避免用中文來做欄位名稱, 這樣對程式的執行會有一定的負面問題存在. 我寫了一段您需要的程式碼範例, 您參考看看, 如果适合您使用, 請先刪除您目前處理圖片檔案存取和顯示的程式碼, 再加入這一部分: 1. 設定需要元件:
先在Moto資料表中加一個名為圖片的欄位, 形態為字串, 目的是存放圖檔路徑, 如果方便的話, 最好是將所有的欄位名改為英文(這樣可能會改蠻多的程式碼, 會累累喔, 如果此範例僅僅是練習之后, 可不用更改, 不過日后盡量請使用英文來命名), 然后再在Form中加入一個DBEdit元件, 取名為DBEditPicture, 將其Visible的屬性值設定False, 這個DBEdit元件的作用是感知資料表中照片欄位所對應的圖檔路徑, Visible屬性值為False的目的一是不需要給使用者看到此元件, 二是防止使用者在此欄位中做修改從而引起存檔錯誤. 2. 程式碼部分:
Button2按鈕(載入圖片按鈕)的OnClick事件中
procedure TForm1.Button2Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin ADOTable1.append; ADOTable1.FieldByName('照片').AsString:=extractfilename(OpenPictureDialog1.filename); Image1.Picture.LoadFromFile(OpenDialog1.FileName); ADOTable1.post; end; end; //這一段程式碼的目的是在新增資料的時候, 將OpenPictureDialog //開啟的圖檔路徑存入Moto資料表中的圖片欄位, 并用Image1元件來將對應 //的圖片顯示出來.在DataSource1元件的OnDataChange事件中: procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin if FileExists(DBEditPicture.Text) then begin Image1.Picture.LoadFromFile(DBEditPicture.Text); end else begin Image1.Picture := nil; end; //以上紅色部分的程式碼用于在資料指針移動時, 利用Image元件 //顯示對應的圖檔, 其中的DBEditPicture元件還記得嗎? 沒錯, 就是先 //前在元件設定時新加入的, 在資料指針移動的時候, 就可以配合這個 //元件中的檔案路徑來讀取圖檔了, 其中FileExists函數的用處是判斷此 //DBEditPicture欄位對應的路徑上是否有此檔案, 如果沒有的話, 就用 //nil來處理無圖檔對應顯示, 以防止在路徑中找不到圖檔而出錯. if not CanEdit and (ADOTable1.State in [dsEdit,dsInsert]) then begin ADOTable1.Cancel; end; //1. 其實我覺得橘色部分并不需要, 如果資料表在編輯狀態未完成Post或 //Cancel的動作時, 任何資料指針的移動都會引發Cancel的動作. //2. 另外, 在使用多條件的程式碼時, 最好用begin...end的方法來區分, //以防止程式碼太亂而將其執行次序混淆, 以下部分相同 if ADOTable1.State=dsinsert then begin statusbar1.SimpleText:='新資料錄'; end else begin statusbar1.SimpleText:='總數' inttostr(ADOTable1.recordcount) '筆之第' inttostr(ADOTable1.recno) '筆'; end; end;3. 美化圖片顯示: 我在看Form中Image1元件的部分屬性時, 發現其Stretch屬性值沒有設為True, 這個屬性的作用是可以自動縮放載入Image元件中圖片的大小以完成填滿整個Image元件的大小, 所以, 為美化圖片顯示, 請將此元件之Stretch屬性值設為True. 以上方法供您參考, 如果覺得此方法比較簡便, 也适合您使用的話, 就試試看, 有問題再貼出來吧! ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/10/06 23:48:36
------
忻晟 |
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
SORRY cashxin2002大大 這樣的確是解決了 jpeg檔載入的問題
但是 請教一下如何讓jpeg圖片載入到資料庫中啊 你的方法只能用
在我程式所屬資料夾位置中的圖片 如果是從別的資料夾中載入是
可以顯現出來 但是 只要關閉程式 在進入後圖片就不見了
因為圖片並沒有載入 資料庫中 只是圖片的位置
SO 請問有辦法可以讓jpeg圖片載入到資料庫中嗎!
我知道一定要在資料庫裡建一個"圖片的欄位, 形態為OLE" 但是 後續要如何
我就不太知道 所以 非常的抱歉 可以再請您幫幫我這個新手嗎? ^^
麻煩你了!!!!!!
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 之所以建議您不將圖檔直接存入資料庫中, 而是利用圖檔位置的方式來做存取和顯示, 前篇回复已經有提過了, 還是再強調一次這樣做的好處, 就是可以減小資料庫檔案空間﹐因為圖檔存進資料庫﹐一定是增加了蠻可觀的大小﹐這種變通的方法﹐可避免因為因資料庫檔案空間過大而影響資料存取的效率. 如果說您一定要使用將圖檔存入資料庫的做法, 如下方法供您參考:
1. 在資料表中建立圖片欄位, 形態為OLE, 在Form中加入一個DBImage元件, 將其AutoDisplay屬性值設為False, 但因為DBImage元件不支持顯示Jpeg格式的圖檔, 所以在顯示時需要做一些轉換, 您可參考如下程式碼:
在Button2按鈕(載入圖片按鈕)的OnClick事件中
begin if OpenPictureDialog1.Execute then begin DBImage1.Picture.LoadFromFile(OpenDialog1.FileName); end; end; //這一段程式碼的目的是存取圖檔 //注意這里還沒有Post, 僅僅是載入檔案在DataSource1元件的OnDataChange事件中(修改自http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30976, 作者: 以前的一位高手) var Stream:TMemoryStream; jpgstream: TJpegImage ; begin Stream:=TMemoryStream.Create ; jpgstream:= TJPEGImage.Create; TBlobField(ADOTable1.FieldByName('圖片') as TBlobField).SaveToStream(Stream); Stream.Position := 0; jpgstream.LoadFromStream(Stream); DBImage1.Picture.Assign(jpgstream); DBImage1.LoadPicture; Stream.Free; jpgstream.free; end; //這段程式碼的目的是在資料指針移動時顯示Jpeg圖檔以上的方法也有一個缺點, 就是資料表中圖片欄位不能為nil, 可利用程式碼控制ADOTable1在Edit或Insert時, 如果此欄位沒有資料, 則不允許存檔. 2. 先將所有圖檔轉成Bmp格式, 這樣就可以直接以DBImage來存取和顯示了, 不需要像第一種方法中那么复雜 參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
sorry cashxin2002大大 我按照你的步驟做 但是 在run完程式後
它跑出了一個錯誤視窗 如圖中所示:
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
你好 cashxin2002哥 我已將我的程式在小改一下 現在已可存取jpeg
但有兩個小問題想請教你一下
一、我這個程式原本有做修改和新增的按鍵
我現在按載入圖片的按鍵時 如果是在新增或修改的狀態下 是都沒有問題
但如果沒有在新增 修改狀態下按就有問題了(程式會有錯誤) 所以
我想要做一個showmessage顯示(你必須在新增或修改狀態下才可載入圖片)
但是 我不知如何寫入這個指令 所以想請你幫幫忙
喔! 還有 我在裡面還有一個 儲存鍵 照理說載入完圖片後 必須儲存鍵
圖片才會被儲存入資料庫 但 現今 只要按完載入圖片的按鍵 該圖片
就會被儲存入資料庫內 所以我想請問一下 有無辦法可以修改這一項缺點 二、當我載入圖片(如載入10筆不同的圖片)時 我按上一筆 下一筆 最後一筆
瀏覽時 有時候 它圖片會重複顯示出 但如果多按幾下 上一筆 第一筆...時
它就不會有重複顯示的問題 請問這是因為資料庫還在讀取圖片 所以有點leg
的原因嗎? 這是正常的嗎? 有辦法解決嗎? 以下是我的程式:
http://delphi.ktop.com.tw/loadfile.php?TOPICID=12108105&CC=270795 麻煩你了
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 您上傳的程式有問題﹐在指定的目錄下沒有MOTO.MDB這個資料庫檔案﹒
就您兩個問題﹐建議如下﹕ 一、我這個程式原本有做修改和新增的按鍵
我現在按載入圖片的按鍵時 如果是在新增或修改的狀態下 是都沒有問題
但如果沒有在新增 修改狀態下按就有問題了(程式會有錯誤) 所以
我想要做一個showmessage顯示(你必須在新增或修改狀態下才可載入圖片)
但是 我不知如何寫入這個指令 所以想請你幫幫忙
喔! 還有 我在裡面還有一個 儲存鍵 照理說載入完圖片後 必須儲存鍵
圖片才會被儲存入資料庫 但 現今 只要按完載入圖片的按鍵 該圖片
就會被儲存入資料庫內 所以我想請問一下 有無辦法可以修改這一項缺點
//其實我覺得﹐您可以用Button元件的Enable屬性來控制此元件是否可以作用﹐這樣就可以比較好的避免使用者在資料庫不處于新增或修改的狀態時按下這個按鈕而引起錯誤﹒
作法﹕先在設計時期將此Button(載入圖片按鈕)的Enabled屬性值設為False﹐然后在DataSource元件的OnDataChange事件中加上如下程式碼﹕
begin if ADOTable1.State in [dsInsert, dsEdit] then Button1.Enabled := True else Button1.Enabled := False; end;二、當我載入圖片(如載入10筆不同的圖片)時 我按上一筆 下一筆 最後一筆 瀏覽時 有時候 它圖片會重複顯示出 但如果多按幾下 上一筆 第一筆...時 它就不會有重複顯示的問題 請問這是因為資料庫還在讀取圖片 所以有點leg 的原因嗎? 這是正常的嗎? 有辦法解決嗎? //一般來講不會有這種現象﹐可能跟您的程式碼有關﹐當然﹐如果資料筆數很多﹐又是用查詢的方法來移動指針對應資料錄﹐顯示圖檔可能就會出現老牛拉車般的緩慢喔﹐所以之前也有提到過﹐將圖檔直接存入資料表欄位內并不是一個好方法﹐資料庫檔案Size成長很多﹐而且又會影響資料庫存取的效率﹒ 參考看看﹗ ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/10/10 11:25:05
------
忻晟 |
jasonchen613
初階會員 ![]() ![]() 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
真是太謝謝你了 所有的問題都解決了 最後想問你一個觀念
那就是我在DataSource元件的OnDataChange事件中加入了三個if判斷
這樣會不會太多啦! 會影響到程式嗎?
我聽我們老師說加入太多的if不太好 可是我再run程式時是沒有出現問題啦! 程式碼如下:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if not CanEdit and (ADOTable1.State in [dsEdit,dsInsert]) then
ADOTable1.Cancel; if ADOTable1.State in [dsInsert, dsEdit] then
Button2.Enabled := True
else
Button2.Enabled := False; if ADOTable1.State=dsinsert then
statusbar1.SimpleText:='新資料錄'
else
statusbar1.SimpleText:='總數'
inttostr(ADOTable1.recordcount) '筆之第'
inttostr(ADOTable1.recno) '筆';
end;
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 在使用if...else的語法時需要注意其父句与子句的區別﹐盡量不要把兩個不類同(同樣為父句或同樣為子句)的if..else寫在一起﹐容易造成程式的判斷錯誤﹐所以個人而言﹐如果在使用if...else的語法時﹐我都會用begin...end將其每段程式碼包起來用于區別﹐也便于查找﹐所以您可將程式碼改為如下﹕
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin if not CanEdit and (ADOTable1.State in [dsEdit,dsInsert]) then begin ADOTable1.Cancel; end; if ADOTable1.State in [dsInsert, dsEdit] then begin Button2.Enabled := True; end else begin Button2.Enabled := False; end; if ADOTable1.State=dsinsert then begin statusbar1.SimpleText:='新資料錄' end else begin statusbar1.SimpleText:='總數' inttostr(ADOTable1.recordcount) '筆之第' inttostr(ADOTable1.recno) '筆'; end; end;其實只要正确的使用if...else的語法﹐對程式的影響應該不會很大﹐所以...敬請學習用功的人放心使用
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |