線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1521
推到 Plurk!
推到 Facebook!

DELPHI中資料庫網格DBGrid的靈活修飾

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-18 16:49:23 IP:61.64.xxx.xxx 未訂閱
http://bbs.yesky.com/book/html/1212.html DELPHI中資料庫網格DBGrid的靈活修飾 ________________________________________ 如果你有這個方面的問題請到Delphi去提問或發表你的意見 來源:論壇轉載無法確定出處,如有版權問題請與我們聯繫 DELPHI中資料庫網格DBGrid的靈活修飾 DBGrid常常用於資料庫的直接顯示和維護工作, 這也 是DELPHI中最直觀的一種資料庫處理手段, 在系統的缺省 狀態下, DBGrid所提供的介面比較單調, 只能用簡單的前 景色和背景色裝飾表面, 並且不能直接顯示圖像, 但它有 一個功能極強的屬性即CANVAS畫布, 靈活使用此屬性可完 全改善上述DBGrid的不足, 使其呈現出具有生機和活力的 資料庫顯示介面。 一、CANVAS概述: CANVAS(畫布)是DELPHI中爲某些控制項所定義的一個類, 它允許在控制項表面進行靈活的繪圖操作或資訊顯示, 並且 適用於多種控制項, 如StringGrid、DBgrid、Form等, 爲美 化程式介面提供了非常方便的方法。它可以完全改善某些 控制項本身的表現形式,使其以全新的面貌出現。CANVAS具 有多種屬性並支援多種操作命令, 可以實現在指定的物件 上畫點、畫線、畫多邊形、畫扇形、畫圓、定義畫筆特性、 輸出各種字串及圖像等多種功能; 在CANVAS屬性的使用 過程中, 經常需要與物件Rect配合, Rect物件可以定義一 塊矩形區域,然後靈活的對此區域進行各種繪圖操作,Rect 又與控制項Tbitmap 之間存在著緊密的關係, 通過有關命令 可以方便的把圖像送入Rect之內,爲在資料庫網格中使用 圖像提供了方便。使用CANVAS需要注意一點: 當視窗進行 重畫時, 畫布上的圖像將消失, 比如當視窗進行最小化又 重新恢復時,就會引起畫布上圖像的消失,另外當剛剛運 行程式時,視窗也是屬於重新繪製,所以如果在繪製窗口 之前在畫布上繪圖,彈出視窗後將不能顯示出圖像,比如 在TForm1.FormCreate() 事件中進行畫布繪圖操作將是徒 勞的,但可以在此事件中進行畫布操作的準備工作,比如 設置畫筆的顔色和寬度等。 二、DBGrid對CANVAS的支援 DBGrid不僅是簡單的擁有CANVAS屬性, 而且它本身提 供了對CANVAS最大限度的支援, 可具體體現在兩個方面, 其一是DBGrid中的每一個表格項, 被自動定義爲一個獨立 的TRect物件,這樣給使用者以每個表格爲單位進行圖像處 理提供了方便的條件; 另處一點, 由於利用CANVAS所繪的 圖像或顯示的圖像視窗重畫是會消失, 這樣在很多情況下 將破壞表格內的圖像, 而DBGrid本身又提供了解決此問題 的完善方法,它有一個DrawDataCell()事件,每當表格項的 某一部分發生變化時,都將自動調用此事件,這樣把CANVAS 圖像過程安排在此事件中即可永久保持表格圖像的完整性; 在此事件中有一個TRect參數,即是重畫表格時當前表格的 矩形區域範圍, 所以在此事件中可非常方便的對網格中每 一個表格項進行靈活的著色、圖像顯示或字元顯示操作; 三、DBGrid多顔色填充技巧 大部分工作需要在DrawDataCell()事件中完成, 此事 件中除了有一個TRect 參數處, 還有一個極有用的參數就 是TField, 從此參數可檢測到當前繪製的是哪一個欄位名, 這樣可方便的按照欄位進行顔色處理, 只要按欄位的名稱 調整當前資料項目表格的Rect物件顔色, 即可使DBGrid按字 段分顔色顯示資料, 另外也可以按記錄號或者某一資料項目 的數值決定所使用的顔色, 比如負數用綠色, 正數用紅色, 0 則用白色, 這樣可起到非常直觀的顯示效果; 具體操作 時需要注意以下問題, 即網格的內容顯示問題, 當用一種 顔色填充表格的Rect之後, 該表格項中的內容會被畫布完 全覆蓋, 此時必須利用畫布的字串顯示功能重顯該表格 內容, 才不會影響正常的表格內容; 四、DBGrid圖像處理能力 在DBGrid中使用圖像有兩種實用的意義, 其一是可以 把圖像做爲表格的背景使用, 在圖像之上顯示表格的相關 資料, 這樣可使網格具有特殊的表現風格, 其操作方法與 顔色填充相似, 只要用圖像顯示命令代替顔色填充命令即 可; 進行此操作時有一點必須注意, 在系統的缺省填充模 式下, 字元將帶有背景效果, 這樣在圖像上顯示字元將覆 蓋部分圖像內容, 顯示效果不好, 爲了實現在圖像直接顯 示字元的效果, 必須重置填充模式, 具體可使用下面命令: DBGrid1.canvas.Brush.Style:=bsHorizontal; 另一種使 用圖像的目的是實現資料庫圖像資料的顯示功能, 比如說 資料庫中的每一個人有一張像片, 保存在多個BMP 文件之 中, 而在DrawDataCell()事件中按照記錄號分別在相應的 表格中調出相應的圖像文件, 即可以在DBGrid中顯示出帶 有圖片的資料庫內容, 由於DBGrid缺省狀態下的表格較小, 可通過調整顯示圖片用的表格欄位長度及字型大小, 來增大圖 像的顯示尺寸; 五、相關命令簡介 實現上述操作過程需要一些特殊的畫布屬性或命令, 爲方便理解簡介如下,省略了具體的參數及使用方法,可 參考後面的程式或通過DELPHI的幫助功能查找: Field[i].fieldname:指定資料庫欄位名稱 Table1.Fieldbyname('JT').asinteger:資料庫JT欄位值 DBGrid1.canvas.stretchdraw();向TRect中填充圖像 DBGrid1.canvas.Brush.Style:置填充模式 DBgrid1.canvas.textout():在畫布上顯示字串 DBgrid1.canvas.brush.color:置填充顔色 DBgrid1.canvas.fillRect(t):向TRect中填充顔色 DBGrid1.font.size:=10: 置網格的字體尺寸 DBGrid1.font.color:置網格的字體顔色 Tbitmap.create:建立Tbitmap物件; loadfromfile():向Tbitmap中調入圖像文件 六、編程舉例 假設在當前目錄下有一個資料庫BMP.DBF 文件, 共有 七個欄位, 分別爲XM、XB、NY、DW、DH、SD、JT,其中JT 欄位內記錄著記錄號碼, DH欄位內原爲電話號碼, 現用於 顯示圖像, 具體使用時可單獨建立一個用於顯示圖像的字 段;在下面的程式中, 實現把此資料庫在DBGrid 中顯示的 目的, 並在XM欄位用一固定圖像做爲背景, 而在DH表格中 按 記錄號分別顯示圖像文件 ARROW1.BMP、ARROW2.BMP、 ARROW3.BMP等, 其他表格用不同的顔色背景填充; 1.創建一個新的專案, 在其上面分別安排下面三個控 件:Table1、DataSource1、DBGrid1; 2.使TABLE1的Tablename屬性指向BMP.DBF文件, 之後 置TABLE1的Active屬性爲真, 以打開此資料庫; 3.將DataSource1的DataSet屬性置爲Table1, 建立與 BMP.DBF 資料庫的鏈結; 4.定義變數, 其中包括一個獨立的Tbitmap 及一個數 組變數, 用於處理多個BMP 圖像文件: var Form1: TForm1; map:array[0..300] of Tbitmap; pic:Tbitmap; i:integer; 5.在FormCreate()事件中填入如下代碼, 進行程式的 準備工作, 其中包括建立TBitmap 物件, 並分別在每個對 象中裝入圖像文件, 以備後面顯示使用: procedure TForm1.FormCreate(Sender: TObject); var str:string; begin DBGrid1.font.size:=10; {定義字體屬性} DBGrid1.font.color:=$0000ffff; for i:=0 to 5 do begin map[i]:=Tbitmap.create; {裝入6個圖像文件} str:='arrow' inttostr(i 1) '.bmp'; {調整檔案名} map[i].loadfromfile(str); end; pic:=Tbitmap.create; pic.loadfromfile('d:\windows\256color.bmp'); end; 6.在 DBGrid1DrawDataCell()事件中進行具體修飾操 作, 按欄位名進行不同的顔色填充或圖像填充操作: procedure TForm1.DBGrid1DrawDataCell(Sender:TObject;const Rect:TRect; Field:TField;State:TGridDrawState); var ch:string; begin ch:=Field.fieldname; if ch='DH' then {按記錄號顯示指定的圖像} begin i:=Table1.Fieldbyname('JT').asinteger; {判斷數值} DBGrid1.canvas.stretchdraw(Rect,map[i-1]);{顯示圖像} end else if ch='XM' then {相同欄位使用同一圖像背景} begin DBGrid1.canvas.Brush.Style:=bsHorizontal;{修改填充模式} DBGrid1.canvas.stretchdraw(Rect,pic); {顯示圖像} DBgrid1.canvas.textout(Rect.left 4,Rect.top 4,field.Asstring); end else begin {按欄位進行不同顔色填充} if ch='XB' then DBgrid1.canvas.brush.color:=$00008000 else if ch='NY' then DBgrid1.canvas.brush.color:=$00ff0000 else if ch='DW' then DBgrid1.canvas.brush.color:=$00808000 else if ch='SD' then DBgrid1.canvas.brush.color:=$00800080 else if ch='JT' then DBgrid1.canvas.brush.color:=$008050ff; DBGrid1.canvas.Brush.Style:=bsSolid; {修改填充模式} DBgrid1.canvas.fillRect(Rect); {填充顔色} DBgrid1.canvas.textout(Rect.left 4,Rect.top 4,field.Asstring); end; end; 至此, 編程結束, 運行程式之後, 將完善的實現上 述的DBGrid的修飾效果,在XM欄位使用同一圖像作爲背 景, DH欄位則按記錄顯示不同的圖像, 並且其他欄位分 別用不同的顔色進行修飾。這些操作並不影響任何正常 的網格操作, 當用滑鼠雙擊DH欄位的圖像時, 將顯示出 DH欄位原有的電話號碼內容, 並可進行修改, 點擊其他 表格項時則被修改的表格恢復圖像顯示效果。以上所介 紹的DBGrid網格的使用方法, 可延伸到其他類型的網格 修飾過程中, 並且此方法可廣泛應用到大型圖文資料庫 的維護過程之中, 具體操作時可根據此方法的不足適當 增加其他功能,比如可用網格顯示文字檔案的檔案名,單 擊或雙擊之後在視窗內固定位置顯示該文件內容, 或者 安排IMAGE 控制項實現圖像的放大顯示, 這樣可彌補網格 顯示圖像過小的缺點等, 徹底解決網格的圖文資料庫處 理功能, 以上方法及程式在WINDOWS 95及DELPHI2.0 環 境下調試通過。
系統時間:2024-06-29 11:10:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!