全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2747
推到 Plurk!
推到 Facebook!

如何讓DBimage1載入jpeg檔

尚未結案
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-06 17:05:10 IP:61.13.xxx.xxx 未訂閱
相信用過dbimage元件的大大應該都知道 它只能載入bmp檔(如下圖所示) 我搜尋過了許多關於jpeg的文章 我發現其中一篇有提到 用一個的外掛 不知是否非得用這一個TahDBJpeg v1.02外掛才可做到ㄋ  另外 如何將此外掛放入啊! 我有點看不懂 >.< ........ 麻煩各位大大幫幫我這個可憐的新手吧! 多謝 麻煩了 PS(我的delphi是5.0版的)    
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-06 17:45:20 IP:61.155.xxx.xxx 未訂閱
tdbimage也可以显示jpP图象 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30976 其它资料 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38346
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-06 19:49:25 IP:63.84.xxx.xxx 未訂閱
您好!    這個問題有蠻多的朋友都提到過, 整理一下, 請參閱一些相關的連結: 結合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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-06 21:08:26 IP:61.13.xxx.xxx 未訂閱
ㄚ我要瘋了 我是了好久 最後我用了 "領航天使"大大的方法去做 可是還是有 問題耶 以下是"領航天使"大大教的連結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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-06 23:41:55 IP:63.84.xxx.xxx 未訂閱
您好!    我將您的程式範例下載后看了一下, 問題是出了您目前的資料表中沒有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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-07 01:29:46 IP:61.16.xxx.xxx 未訂閱
SORRY cashxin2002大大 這樣的確是解決了 jpeg檔載入的問題 但是 請教一下如何讓jpeg圖片載入到資料庫中啊 你的方法只能用 在我程式所屬資料夾位置中的圖片 如果是從別的資料夾中載入是 可以顯現出來 但是 只要關閉程式 在進入後圖片就不見了 因為圖片並沒有載入 資料庫中 只是圖片的位置 SO 請問有辦法可以讓jpeg圖片載入到資料庫中嗎! 我知道一定要在資料庫裡建一個"圖片的欄位, 形態為OLE" 但是 後續要如何 我就不太知道 所以 非常的抱歉 可以再請您幫幫我這個新手嗎? ^^ 麻煩你了!!!!!!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-07 02:33:34 IP:63.84.xxx.xxx 未訂閱
您好!    之所以建議您不將圖檔直接存入資料庫中, 而是利用圖檔位置的方式來做存取和顯示, 前篇回复已經有提過了, 還是再強調一次這樣做的好處, 就是可以減小資料庫檔案空間﹐因為圖檔存進資料庫﹐一定是增加了蠻可觀的大小﹐這種變通的方法﹐可避免因為因資料庫檔案空間過大而影響資料存取的效率. 如果說您一定要使用將圖檔存入資料庫的做法, 如下方法供您參考: 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-08 00:10:14 IP:61.16.xxx.xxx 未訂閱
sorry cashxin2002大大 我按照你的步驟做 但是 在run完程式後 它跑出了一個錯誤視窗 如圖中所示:  請問這是哪裡出問題啊? 以下是我"照片"部分相關的程式碼: 在DataSource1元件的OnDataChange事件中 procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); 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; if ADOTable1.State=dsinsert then statusbar1.SimpleText:='新資料錄' else statusbar1.SimpleText:='總數'+ inttostr(ADOTable1.recordcount)+'筆之第' +inttostr(ADOTable1.recno)+'筆'; end; 在Button2按鈕(載入圖片按鈕)的OnClick事件中 begin if OpenPictureDialog1.Execute then begin DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; end; 另外 有沒有辦法解決你所說的缺點啊? "沒資料表中圖片欄位不能為nil, 可利用程式碼控制ADOTable1在Edit或Insert時, 如果此欄位沒有資料, 則不允許存檔" (本人真的是深感抱歉 一直麻煩各位大大 尤其是cashxin2002大大 在此獻上我十二萬分的感激 感激你們不奈其煩的教導我 多謝你們 )
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-09 10:53:46 IP:63.84.xxx.xxx 未訂閱
您好!    我測試了一下, 也有發現這個問題. 剛才又仔細看了一下您的要求, 一定要用Jpeg格式, 且一定要存進資料表中, 覺得justmade版主曾發表的範例比較适合您使用, 下載點: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27715    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-09 13:04:25 IP:61.16.xxx.xxx 未訂閱
你好 cashxin2002哥 我已將我的程式在小改一下 現在已可存取jpeg 但有兩個小問題想請教你一下 一、我這個程式原本有做修改和新增的按鍵 我現在按載入圖片的按鍵時 如果是在新增或修改的狀態下 是都沒有問題 但如果沒有在新增 修改狀態下按就有問題了(程式會有錯誤) 所以 我想要做一個showmessage顯示(你必須在新增或修改狀態下才可載入圖片) 但是 我不知如何寫入這個指令 所以想請你幫幫忙 喔! 還有 我在裡面還有一個 儲存鍵 照理說載入完圖片後 必須儲存鍵 圖片才會被儲存入資料庫 但 現今 只要按完載入圖片的按鍵 該圖片 就會被儲存入資料庫內 所以我想請問一下 有無辦法可以修改這一項缺點 二、當我載入圖片(如載入10筆不同的圖片)時 我按上一筆 下一筆 最後一筆 瀏覽時 有時候 它圖片會重複顯示出 但如果多按幾下 上一筆 第一筆...時 它就不會有重複顯示的問題 請問這是因為資料庫還在讀取圖片 所以有點leg 的原因嗎? 這是正常的嗎? 有辦法解決嗎? 以下是我的程式: http://delphi.ktop.com.tw/loadfile.php?TOPICID=12108105&CC=270795 麻煩你了
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-10 11:20:59 IP:63.84.xxx.xxx 未訂閱
您好﹗    您上傳的程式有問題﹐在指定的目錄下沒有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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-10 11:38:01 IP:61.13.xxx.xxx 未訂閱
真是太謝謝你了 所有的問題都解決了 最後想問你一個觀念 那就是我在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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-10 11:54:29 IP:63.84.xxx.xxx 未訂閱
您好﹗    在使用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的語法﹐對程式的影響應該不會很大﹐所以...敬請學習用功的人放心使用﹒ 參考看看﹗ <><>===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
系統時間:2024-09-07 19:15:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!