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分。。。。
...全文
657 9 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
自已顶一下,大神在哪里
VB控件 RMReport7 转:RMReport的使用方法及详解 1、不打印特定的MemoView,套打常用 a.页面设置-->其它-->不打印背景图 b.设置MemoView属性printable=False 2、 如何打印wwDBGrid? 修改rm.inc,如果想支持RX,GIF,JPEG,DimandAccess,Halcyon,DBISAM, EHLib,也需要修改rm.inc //{$DEFINE InfoPower} //修改这行,去掉"//" //{$Ehlib} 3.试用版安装方法(以下假设将文件释放到c:/rm目录) (1)Tools->Environments Option->Libary->Libary Path增加: c:/rm/souce c:/rm/bpl $(DELPHI)/Lib $(DELPHI)/Bin $(DELPHI)/Imports $(DELPHI)/Projects/Bpl (2)Component->Install Packages->Add,选bpl/rm_d70.bpl 4.在Delphi IDE卸载以前的Report Machine版本,然后打开rm_r50.dpk,选"compile", 在打开rm_d50.dpk,选"Install". 包分成了Runtime package和Designer package,所以要安装顺序安装 5、单元格的变量格式用代码设置 t = TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1, 1].View t = TRMMemoView(RMReport1.FindObject('memo1')); t.DisplayFormat := 'N0.001' //数字型 t.DisplayFormat := 'Dyyyy/mm/dd' //日期型 6、两遍报表如何用代码设置 GridReport1.DoublePass := True 7、用代码写数据字典: RMReport1.Dictionary.FieldAliases.Clear; RMReport1.Dictionary.FieldAliases['RMDBDataSet1'] := '动物'; RMReport1.Dictionary.FieldAliases['RMDBDataSet1."Name"'] := '姓名'; 这样在RM的设计器显示为自定义名称,为最终用户提供友好的显示 8、在报表如何使用变量(或者如何给某个memoview赋值) a.RMVariables在RM_Class.pas定义,是全局变量,这样定义后就可以在报表使用变量"var1",例如: RMVariables['变量名称'] := Edit1.Text; b.用报表数据字典,TRMReport.Dictionary.Variables,需要注意的是,如果变量是字符型的需要用AsString赋值,其他类型的用RMReport.Dictionary.Variables['var1'] := 1234,例如: RMReport1.LoadFromFile('1.rls'); RMReport1.Dictionary.Variables.AsString['变量名称'] := Edit1.Text; c. 直接对某个单元格赋值,例如: RMGridReport1.LoadFromFile('1.rls'); TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1,1].Text := '值'; 如果是RMReport: RMReport1.LoadFromFile('1.rmf'); t := RMReport1.FindObject('Memo1'); if t nil then // var t: TRMView t.Memo.Text := 'dsdsdsds'; d.脚本直接引用Form的值 procedure Main; begin Memo1.Memo.Text := Form1.Edit1.Text; end; 9、自动换行 主项数据栏Stretched = true 文本框 Stretched = true WordWrap = true 10、RM内置变量(Script),增加.... a.属性PrintAtAppendBlank=True CurReport.AppendBlanking=True时代表增加空行 在RM,打印设置只能保存页面边距及打印份数、是否两遍打印以及

5,379

社区成员

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

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