一个关于DBGrid的问题 如何在一个DBGrid里加入一个按扭列或复选框列? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DBGrid的列的PickList属性你试一下就知道了! 复选框什么效果?是checkbox的效果吗?想象不出。楼主强。combobox倒是很容易。 给个例子参考参考(未调试)用API函数 DrawFrameControl()直接画出CHECKBOXunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls;type TForm1 = class(TForm) DBGrid1: TDBGrid; DataSource1: TDataSource; Table1: TTable; DBNavigator1: TDBNavigator; Table1ID: TAutoIncField; Table1XM: TStringField; Table1XB: TStringField; Table1XH: TSmallintField; Table1SZXB: TStringField; Table1RXSJ: TDateField; Table1SFDY: TBooleanField; 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;var Form1: TForm1;implementation{$R *.dfm}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;end. 关于几个FASTREPORT3.16的几个使用上的问题!请高手赐教!!!! 窗体移动事件怎么获得? adotable控件中怎么实现并发控制呢? 求助怎么将简体的DELPHI7程序转换为繁体的程序?除了改变文字外还需要作其它设置吗? 请教:如何监测一个目录中的文件,当发生变化时程序能够得到通知? 这个怎么实现的? 有没有10的N次方这个函数? 求救:关于数据库连接的问题? 请教sql语句(急用) 有谁能帮助我? 如何得到QQ发送消息窗口里,RICHEDIT的句柄? 帮我一个忙?谢谢!
你试一下就知道了!
combobox倒是很容易。
用API函数
DrawFrameControl()直接画出CHECKBOX
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Table1: TTable;
DBNavigator1: TDBNavigator;
Table1ID: TAutoIncField;
Table1XM: TStringField;
Table1XB: TStringField;
Table1XH: TSmallintField;
Table1SZXB: TStringField;
Table1RXSJ: TDateField;
Table1SFDY: TBooleanField;
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;var
Form1: TForm1;implementation{$R *.dfm}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;end.