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

DBGrid上擺放CheckBox元件,但不能使用實體欄位來做

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-03 09:16:41 IP:61.220.xxx.xxx 未訂閱
小弟搜尋到DBGrid上擺放CheckBox元件的方式都是要用實體欄位來產生CheckBox,有何方式能不使用實體欄位,就可以做出來ㄋ??
------
ivankuo
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-03 09:30:11 IP:211.74.xxx.xxx 未訂閱
DBGrid->DataSource->DataSet(Query,Table),可以new一個Field, Type選Boolean就是你要的虛擬欄位了... TRY TYR SEE
引言: 小弟搜尋到DBGrid上擺放CheckBox元件的方式都是要用實體欄位來產生CheckBox,有何方式能不使用實體欄位,就可以做出來ㄋ??
發表人 - chih 於 2003/04/03 11:23:28
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-03 21:11:47 IP:61.59.xxx.xxx 未訂閱
引言: 小弟搜尋到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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-04 09:20:07 IP:61.220.xxx.xxx 未訂閱
chih前輩,虛擬欄位如何去變動他的值來變更checkBox是否打勾?? pgdennis前輩,此方式我用過了,我是用實體欄位來做的,可以不用實體欄位ㄇ??
------
ivankuo
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-04 09:44:16 IP:211.74.xxx.xxx 未訂閱
hi...ivankuo.. 我之前採用的方式,資料顯示是以'Y' 或'N',不知道符不符合你要的功能ㄋ??
引言: chih前輩,虛擬欄位如何去變動他的值來變更checkBox是否打勾?? pgdennis前輩,此方式我用過了,我是用實體欄位來做的,可以不用實體欄位ㄇ??
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-04 09:50:15 IP:61.220.xxx.xxx 未訂閱
[quote] hi...ivankuo.. 我之前採用的方式,資料顯示是以'Y' 或'N',不知道符不符合你要的功能ㄋ??[quote] chih前輩的意思是用虛擬欄位來做ㄇ??
------
ivankuo
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-04 10:02:43 IP:211.74.xxx.xxx 未訂閱
YES,newRecord時候比如給'Y',user DblClick時就將該欄位相反'Y'->'N','N'->'Y',要取得該欄位值在SQLAfterPost搭配BookMark以及迴圈來做..
引言: chih前輩的意思是用虛擬欄位來做ㄇ??
發表人 - chih 於 2003/04/04 10:11:41
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-04 10:14:22 IP:61.220.xxx.xxx 未訂閱
不好意思前輩,小弟不知怎做到ㄋ,如何讓虛擬欄位用y/n值來讓checkbox顯示是否勾選,可否請前輩貼上code給我看看ㄋ??
------
ivankuo
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-04 10:35:00 IP:211.74.xxx.xxx 未訂閱
是否一定要顯示checkbox??,我之前只是顯示Y,N而已..
引言: 不好意思前輩,小弟不知怎做到ㄋ,如何讓虛擬欄位用y/n值來讓checkbox顯示是否勾選,可否請前輩貼上code給我看看ㄋ??
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-04 10:41:19 IP:61.220.xxx.xxx 未訂閱
checkBox在介面上會比較好一點,不過小弟還要若用實體欄位來做的話,要考慮的就是,同一筆recoed若同時有兩個人去點的時候,會影響到另一個人所看到的資料,就會發生資料已經被存取了,但又不能同時限制只能有一個人去選取,不知前輩還有何高招ㄋ??
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-04 12:21:57 IP:218.16.xxx.xxx 未訂閱
做一個 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-04 13:15:58 IP:61.220.xxx.xxx 未訂閱
感謝Justmade前輩,我用實體欄位配合ListBox來處理,dataSet改用batch模式來處理即可,非常謝謝.
------
ivankuo
系統時間:2024-05-17 0:19:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!