我想哭这个问题问了若干遍,一直没人给出正确的解答.
我有一个数据表有两字段(姓名,婚姻状况)其中婚姻状况为逻辑性字段 我想用Dbgrid显示它时达到如此效果: 如果婚姻状况为true时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且打勾
否则如果婚姻状况为false时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且不打勾
我有一个数据表有两字段(姓名,婚姻状况)其中婚姻状况为逻辑性字段 我想用Dbgrid显示它时达到如此效果: 如果婚姻状况为true时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且打勾
否则如果婚姻状况为false时,在Dbgrid中的婚姻状况位置用Dbcheckbox表示并且不打勾
解决方案 »
- 请教:Indy能否判断某端口已经被TCPSERVER或者UDPSERVER绑定了?
- delphi2009调用dll返回值乱码?急 急 急 急
- 一个DELPHI菜单的问题
- 有二月十号南京到西安的卧铺火车票一张,谁要!!!
- 如何让form只能居中显示
- 有没有使用quickrep的高手,我的数据库里有多行文本,我用QRDBRichText1来打印这个字段时,能否自动看它有多少字来分配给他多大的空间,
- 如何在messagebox添加自定义图标?
- 高手请进
- 如何更换软件皮肤?
- TAdvStringGrid 控件在 delphi 2007 怎么装不上啊?
- 兄弟们,广州那儿笔记本这么便宜么?!
- 帮忙翻译一下
加强版 TDBGrid 构件,除了能够立体显示外,当数据字段为布耳值时会以 Checkbox 形式显示 ( 0.9 版,附源码 ),作者 : Michael Peter。
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.
然后再dbgrid的DrawColumnCell事件里这样写:
if (gdfocused in state) and (column=dbgrid1.columns[2]) then//这里是marry字段在//dbgrid中列数。
begin
dbcheckbox1.Visible:=true;
dbcheckbox1.SetBounds(rect.left+dbgrid1.left,rect.top+dbgrid1.top,rect.right- rect.left,rect.bottom-rect.top);
end;
这样应该差不多了,你试试吧!
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if DBGrid1.SelectedField.DataType = ftBoolean then
dbcheckbox1.visible:=false;
end;
或者干脆下载一个新控件算了。
双击TQuery控间就可以打开字段编辑器了
比如
procedure TForm.QueryGetText(
Sender: TField; var Text: String; DisplayText: Boolean);
begin
if DisplayText then
DBCheckBox.Checked := Sender.AsBoolean;
end;
很简单把
有问题请发信息到我的E-mail:[email protected]