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

在DELPHI中利用API實現網格內元件的嵌入⻌

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-04 18:27:10 IP:61.221.xxx.xxx 未訂閱
http://www.chinastu.com/study/html/soft/soft-htm/soft-program/program-tuijian/program-2-tuijian-010527-03.htm 在DELPHI中利用API實現網格內元件的嵌入 Delphi中向TDBGrid添加元件是一件十分麻煩的事情。筆者在這裏向大家介紹一種利用WIN32 API函數在TDBGRID中嵌入CHECKBOX元件的方法。 TDBGrid部件是用於顯示和編輯資料庫表中記錄資訊的重要部件,它是我們在程式設計過程中要經常使用的一個強有力的工具。TDBGrid具有很多重要的屬性,我們可以在程式設計階段和程式運行過程中進行設置。TDBGrid部件中有很多重要的屬性,我們在這裏重點介紹Option屬性和DefaultDrawing屬性,其他屬性及其設置方法請參看聯機幫助文件。 Options屬性:它是TDBGrid部件的一個擴展屬性,在程式設計階段設置Options屬性可以控制TDBGrid部件的顯示特性和對事件的回應特性。 DefalultDrawing屬性:該屬性是布林型屬性,它用於控制網格中各網格單元的繪製方式。在缺省情況下,該屬性的值?True,也就是說Delphi使用網格本身缺省的方法繪製網格中各網格單元,並填充各網格單元中的內容,各網格單元中的資料根據其對應的欄位部件的DisplayFormat屬性和EidtFormat屬性進行顯示和繪製。如果DefaulDrawing屬性被設置?False,Delphi不會自動地繪製網格中各網格單元和網格單元中的資料,用戶必須自己?TDBGrid部件的OnDrawDataCell事件編寫相應的程式以用於繪製各網格單元和其中的資料。 需要注意的是,當一個布林欄位得到焦點時,TDBGrid.Options中的 gdEditing屬性不能被設置成?可編輯模式。另外,TDBGrid.DefaultDrawing屬性不要設置?FALSE,否則,就不能得到網格中畫布屬性的控制碼。 程式設計開始時就應考慮:需要設定一變數來存儲原始的 TDBGrid.Options的所有屬性值。這樣,當一boolean欄位所在欄得到焦點時將要關閉TDBGrid.Options中gdEditing的可編輯模式。與此相對應,若該欄失去焦點時,就要重新恢復原始的 TDBGrid.Options的所有屬性值。 在實例中可以通過滑鼠點擊或敲打空白鍵改變布林值,這樣就需要觸發TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因?這兩個事件都是改變單格中邏輯欄位的布林值,所以?了減少代碼的重復最好創建一個私有過程(SaveBoolean;)來完成邏輯值的輸入,以後,在不同的事件中調用此過程即可。 對 TDBGrid.OnDrawColumnCell事件的處理是整個程式的關鍵。處理嵌入元件的顯示的傳統方法是:在表單上實際添加元件物件,然後對元件的位置屬性與網格中單格的位置屬性進行調整,以達到嵌入的視覺效果。這種方法雖然可行但代碼量大,實際運行時控制性很差。筆者採用的方法是充分利用WIN32 API函數:DrawFrameControl(),由於此函數可以直接畫出Checkbox元件,所以就無須在表單中實際添加元件。如何使用API函數:DrawFrameControl()是本程式技巧所在。 在TDBGrid.OnDrawColumnCell事件中,我想大家會注意到:設定一個整型陣列常數,而這個返回的整數值是與布林值相一致的,如果欄位是邏輯欄位,則只將其布林值放入陣列中,提供給DrawFrameControl()函數中的狀態參數進行調用,從而實現了Checkbox元件在網格中的嵌入效果。 源代碼如下: type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure DBGrid1ColEnter(Sender: TObject); procedure DBGrid1ColExit(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } OriginalOptions : TDBGridOptions; procedure SaveBoolean; public { Public declarations } end; {...} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const // 這個整數值將按照布林值返回,並送入陣列 CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); begin //確保只有在邏輯欄位才能插入元件 if Column.Field.DataType = ftBoolean then begin DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end; procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin // 確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then begin OriginalOptions := DBGrid1.Options; DBGrid1.Options := DBGrid1.Options - [dgEditing]; end; end; procedure TForm1.DBGrid1ColExit(Sender: TObject); begin //確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then DBGrid1.Options := OriginalOptions; end; procedure TForm1.DBGrid1CellClick(Column: TColumn); begin //確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then SaveBoolean(); end; procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //確保該欄是邏輯欄位和空白鍵在鍵盤中被敲擊 if ( Key = VK_SPACE ) and ( DBGrid1.SelectedField.DataType = ftBoolean ) then SaveBoolean(); end; procedure TForm1.SaveBoolean; begin DBGrid1.SelectedField.Dataset.Edit; DBGrid1.SelectedField.AsBoolean := not DBGrid1.SelectedField.AsBoolean; DBGrid1.SelectedField.Dataset.Post; end; 以上根源程式在PWIN DELPHI5.0環境調試通過,可以直接引用。 發表人 - jackkcg 於 2002/10/04 18:30:10
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-26 0:57:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!