DELPHI7中wwDBGrid中如何动态添加ControlType中CheckBox

菜鸟求指点 2016-12-28 02:56:23
要写一个公共的查询界面,查询之后,用TClientDataSet来呈现数据,链接wwDBGrid。

因为是公用,字段不固定,所以都是动态写法,但是数据库的BIT类型,呈现出来都是TRUE跟FALSE


如果是实体列还能手动在Selected字段中添加Control Type。选择CheckBox

个人尝试代码如下,用CheckBoxField来传递是否为BIT类型的,结果还是不行。
procedure TFrm_PUB_PubQry.SetTitleDspWidth;//设置标题显示宽度
var
i:integer;
begin
qry_grid.Selected.Clear;
qry_grid.ControlType.Clear;
with sysdb.C_Qry_PubTbl do
begin
for i:=0 to fieldcount -1 do
begin
qry_grid.Selected.Add(fields[i].fieldname);
end;
for i:=1 to FieldCount do //按平均方式显示
qry_grid.ColWidths[i] :=round((qry_grid.Width)/FieldCount);
end;
if CheckBoxField<>'' then
begin
qry_grid.ControlType.Add(CheckBoxField+';CheckBox;true;false');
end;
end;

但是动态不知道怎么实现,请求大神指点

只有60分。。。。
...全文
850 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
看那山瞧那水 2016-12-29
  • 打赏
  • 举报
回复
自己定制也可以,把一个DBCheck控件定位到CELL,并处理几个事件 以delphi自带的DBGRID为例: dbgrid的同一个窗体放DBCheckBox(有几个BOOLEAN字段就放几个,Visible = false),处理以下几个事件: procedure TForm1.dbgrd1ColEnter(Sender: TObject); begin dbchkfield3.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.FieldName = 'field3'; dbchkfield4.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.FieldName = 'field4'; //dbchkfield3.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.DataType = ftBoolean; //只有一个Boolean字段时 end; procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin //if (gdFocused in State) and (Column.Field.DataType = ftBoolean) then //只有一个Boolean字段时 if (gdFocused in State) and (Column.Field.FieldName = 'field3') then begin dbchkfield3.SetBounds(Rect.Left + dbgrd1.Left + 1, Rect.Top + dbgrd1.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); end; if (gdFocused in State) and (Column.Field.FieldName = 'field4') then begin dbchkfield4.SetBounds(Rect.Left + dbgrd1.Left + 1, Rect.Top + dbgrd1.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); end; end; procedure TForm1.dbgrd1KeyPress(Sender: TObject; var Key: Char); begin if dbchkfield3.Visible and (Ord(Key) > 31) then begin Key := #0; dbgrd1.DataSource.DataSet.Edit; dbchkfield3.Checked := not dbchkfield3.Checked; dbchkfield3.Field.AsBoolean := dbchkfield3.Checked; end; if dbchkfield4.Visible and (Ord(Key) > 31) then begin Key := #0; dbgrd1.DataSource.DataSet.Edit; dbchkfield4.Checked := not dbchkfield4.Checked; dbchkfield4.Field.AsBoolean := dbchkfield4.Checked; end; end; 如果表只有一个BOOLEAN字段,可以不用字段名来判断,用字段值类型判断:
lyhoo163 2016-12-29
  • 打赏
  • 举报
回复
wwDBGrid未用过。
DBGridEh的bit字段,可以显示:
fansfantasy 2016-12-29
  • 打赏
  • 举报
回复
引用 6 楼 ouwei_bt 的回复:
[quote=引用 5 楼 fansfantasy 的回复:] wwDBGrid1.ControlType.Clear; wwDBGrid1.ControlType.Add('AA;CheckBox;1;0'); 就这样没错, 参数要给(字段名;CheckBox;真;假)
是啊 我就是这样传递参数的 但是事实上还是显示true跟false 而不是CheckBox qry_grid.ControlType.Add(CheckBoxField+';CheckBox;true;false');[/quote] 确认你的CheckBoxField是字段名, 然后true, false 第一码要大写, 这个2个值就是跟显示的值做比较是否一样来确定勾选的. 我用1和0就没有这个问题. 我建字段从来不用布尔型
菜鸟求指点 2016-12-29
  • 打赏
  • 举报
回复
引用 3 楼 jankercsdn 的回复:
自己定制也可以,把一个DBCheck控件定位到CELL,并处理几个事件 以delphi自带的DBGRID为例: dbgrid的同一个窗体放DBCheckBox(有几个BOOLEAN字段就放几个,Visible = false),处理以下几个事件: procedure TForm1.dbgrd1ColEnter(Sender: TObject); begin dbchkfield3.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.FieldName = 'field3'; dbchkfield4.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.FieldName = 'field4'; //dbchkfield3.Visible := dbgrd1.Columns[dbgrd1.SelectedIndex].Field.DataType = ftBoolean; //只有一个Boolean字段时 end; procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin //if (gdFocused in State) and (Column.Field.DataType = ftBoolean) then //只有一个Boolean字段时 if (gdFocused in State) and (Column.Field.FieldName = 'field3') then begin dbchkfield3.SetBounds(Rect.Left + dbgrd1.Left + 1, Rect.Top + dbgrd1.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); end; if (gdFocused in State) and (Column.Field.FieldName = 'field4') then begin dbchkfield4.SetBounds(Rect.Left + dbgrd1.Left + 1, Rect.Top + dbgrd1.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); end; end; procedure TForm1.dbgrd1KeyPress(Sender: TObject; var Key: Char); begin if dbchkfield3.Visible and (Ord(Key) > 31) then begin Key := #0; dbgrd1.DataSource.DataSet.Edit; dbchkfield3.Checked := not dbchkfield3.Checked; dbchkfield3.Field.AsBoolean := dbchkfield3.Checked; end; if dbchkfield4.Visible and (Ord(Key) > 31) then begin Key := #0; dbgrd1.DataSource.DataSet.Edit; dbchkfield4.Checked := not dbchkfield4.Checked; dbchkfield4.Field.AsBoolean := dbchkfield4.Checked; end; end; 如果表只有一个BOOLEAN字段,可以不用字段名来判断,用字段值类型判断:
这个得画多少个?经常查出来数据都是一千为单位,而且还得给予他对接到数据库,感觉不好处理
菜鸟求指点 2016-12-29
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
wwDBGrid未用过。 DBGridEh的bit字段,可以显示:
这个是维护之前的系统 没办法去换表格的了,那动作太大了
菜鸟求指点 2016-12-29
  • 打赏
  • 举报
回复
引用 5 楼 fansfantasy 的回复:
wwDBGrid1.ControlType.Clear; wwDBGrid1.ControlType.Add('AA;CheckBox;1;0'); 就这样没错, 参数要给(字段名;CheckBox;真;假)
是啊 我就是这样传递参数的 但是事实上还是显示true跟false 而不是CheckBox qry_grid.ControlType.Add(CheckBoxField+';CheckBox;true;false');
fansfantasy 2016-12-29
  • 打赏
  • 举报
回复
wwDBGrid1.ControlType.Clear; wwDBGrid1.ControlType.Add('AA;CheckBox;1;0'); 就这样没错, 参数要给(字段名;CheckBox;真;假)
看那山瞧那水 2016-12-28
  • 打赏
  • 举报
回复
wwGrid没用过,cxGrid和其它大部分的GRID都可以自动显示CHECKBOX的,不管是动态还是静态。
菜鸟求指点 2016-12-28
  • 打赏
  • 举报
回复
自已顶一下,大神在哪里

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧