共享方案(Delphi):Grid内实现checkBox多选时,不需要在物理表内新建字段.

开发背景: Grid内需要对某数据集实现用"checkBox"多选操作时,需要在物理表内专门为此新建一个字段Bit或Boolean 型的字段供选择使用。
解决方案: 通过函数动态给数据集创建一个名为" VkChecked " 的静态字段,不影响物理表结构,并能实现Grid多选功能。
使用方法: DoCreateSelectedField(数据集名称)
具体实现:
procedure DoCreateSelectedField(ADataSet:TDataSet);
var
   NewField: TField;
   I:integer;
   NewFieldName:String;
   IsCreated:Boolean;
begin
     IsCreated:=True;
     NewFieldName:='VtChecked';   //Vt:Vitual Checked;
     //如果已经存在字段,取消创建操作
     for I:= 0 to ADataSet.Fields.Count - 1 do
       if ADataSet.Fields.Fields[i].FieldName= NewFieldName then
           IsCreated:=False;
     if IsCreated then
     begin
       //创建动态字段
       NewField:=TStringField.Create(ADataSet);
       ADataSet.Close;
       //释放所有的静态字段
       for I:=0 to ADataSet.Fields.Count-1 do
         ADataSet.Fields[I].Free;
       //根据FieldDefs的字段信息动态的生成静态字段。
       for I:=0 to ADataSet.FieldDefs.Count-1 do
         ADataSet.FieldDefs.Items[I].CreateField(ADataSet);
       NewField.Size:=5;
       NewField.FieldName:=NewFieldName;
       NewField.FieldKind:=fkInternalCalc;
       NewField.DataSet:=ADataSet;
     end;
     ADataSet.Open;

end;



procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  with ClientDataSet1 do
  begin
  Close;
  Fields.Clear;
  FieldDefs.Clear;
  CommandText := SQLStr1;
  FieldDefs.Update;
  with TFieldDef(FieldDefs.Insert(0)) do
  begin
  Name := 'FIELD_NAME';
  DataType := ftBoolean;
  DisplayName := 'FIELD_NAME';
  end;
  for i := 0 to FieldDefs.Count - 1 do
  FieldDefs[i].CreateField(ClientDataSet1);
  Fields[0].FieldKind := fkInternalCalc;
  Open;
  end;
end;

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  with ClientDataSet1 do
  begin
  if Fields[0].Value = Null then Fields[0].AsBoolean := False;
  end;
end;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值