DBGrid上擺放CheckBox元件,但不能使用實體欄位來做 |
尚未結案
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
引言: 小弟搜尋到DBGrid上擺放CheckBox元件的方式都是要用實體欄位來產生CheckBox,有何方式能不使用實體欄位,就可以做出來ㄋ??網路上抓的...它是用畫的@@..... unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, DBTables; type TForm2 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; procedure DBGrid1CellClick(Column: TColumn); procedure DBGrid1ColEnter(Sender: TObject); procedure DBGrid1ColExit(Sender: TObject); procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } OriginalOptions: TDBgridOptions; public { Public declarations } procedure SaveBoolean(); end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.DBGrid1CellClick(Column: TColumn); begin if dbgrid1.selectedfield.datatype=ftboolean then saveboolean(); end; procedure TForm2.DBGrid1ColEnter(Sender: TObject); begin if dbgrid1.selectedfield.datatype=ftboolean then begin OriginalOptions := DBGrid1.Options; DBGrid1.Options := DBGrid1.Options - [dgEditing]; end; end; procedure TForm2.DBGrid1ColExit(Sender: TObject); begin if dbgrid1.selectedfield.datatype=ftboolean then dbgrid1.Options :=originaloptions; end; procedure TForm2.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 TForm2.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //確保該欄是邏輯字段和空格鍵在鍵盤中被敲擊 if ( Key = VK_SPACE ) and( DBGrid1.SelectedField.DataType = ftBoolean ) then SaveBoolean(); end; procedure TForm2.saveboolean(); begin DBGrid1.SelectedField.Dataset.Edit; DBGrid1.SelectedField.AsBoolean :=not DBGrid1.SelectedField.AsBoolean; DBGrid1.SelectedField.Dataset.Post; end; end.
------
星期一,二...無窮迴圈@@ |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
做一個 daynamic array of Boolean / TList, TStringList
然後做一個 Calculated Field 當使用者按 checkbox 時 修改 Array[RecNo] 的值
當 onCalField 時 從 Array[RecNo] 取值 若 Dataset 不需要 delete 及 insert 只插在後面用 Array 較好
若 Dataset 要 delete 及 中間插入新記錄用 TList 較好 或是用真實欄位加 cache update, update 前後再資料表的該欄清空。
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |