• DBGrid上设置选择项


        当数据集有选择的时候,比如选择性打印,而且这种选择是随用户的主观意念决定时。在DBGrid上设置选择项,就非常必要和非常有用了。
        在DBGrid上设置选择项,操作如下:


        一、加入DB单元,因为要DB相关设置。
    uses DB;

        二、在Table的字段设置一个可供选择的字段,例使用中文字段“选择”,属性:bit。

        三、显示Table的DBGrid中,将该字段设置为第1列,即DBGrid1.Columns.Items[0]。DBGrid初始化时加入下列代码:
    DBGrid3.DataSource.DataSet.Fields[0].DisplayLabel:='√';          //  设置选择列显示名称
    DBGrid3.Columns.Items[0].Width:=DBGrid1.Canvas.TextWidth('123');  //  设置选择列宽度

        四、在DBGrid1CellClick事件中,使用下列代码。功能是只要鼠标点击“选择”列,其Boolean值为原值的反值。

    procedure TPrintTableFrm.DBGrid1CellClick(Column: TColumn);
    begin
      if DBGrid1.SelectedField.DataType=ftboolean then
      begin
        with DBGrid1.DataSource.DataSet do
        begin
          Edit;
          DBGrid1.SelectedField.AsBoolean:=not DBGrid1.SelectedField.AsBoolean;
          Post;
          DBGrid1.Options:=DBGrid1.Options-[dgEditing];
        end;
      end
      else begin
        if DBGrid1.SelectedField.DataType<>ftboolean then
           DBGrid1.Options:=DBGrid1.Options+[dgEditing];
      end;
    end;
     

        五、在DBGrid1DrawColumnCell事件中,使用下列代码。功能就是重新画“选择”列上的字符。

    procedure TPrintTableFrm.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;


        六、在DBGrid1TitleClick事件中,使用下列代码。功能就是只要鼠标点击“选择”列的标题,可以设置“全选”或“全非”。

    procedure TPrintTableFrm.DBGrid1TitleClick(Column: TColumn);
    var i:integer;
    begin
      if column.Index=0 then                            //验证是否第一列
      begin
        DBGrid1.DataSource.DataSet.DisableControls;
        DBGrid1.DataSource.DataSet.First;               //游标回滚
        DBGrid1.SelectedRows.CurrentRowSelected:=true;  //第一行被选中
        if trim(column.Title.Caption)='√' then
        begin
          for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
          begin
            dbgrid1.Fields[0].DataSet.edit;
            dbgrid1.Fields[0].AsBoolean:=true;
            dbgrid1.Fields[0].DataSet.post;
            dbgrid1.datasource.dataset.next;
          end;
          column.Title.Caption:='×';
        end
        else begin
          for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
          begin
            dbgrid1.Fields[0].DataSet.edit;
            dbgrid1.Fields[0].AsBoolean:=false;
            dbgrid1.Fields[0].DataSet.post;
            dbgrid1.datasource.dataset.next;
          end;
          column.Title.Caption:='√';
        end;
        DBGrid1.DataSource.DataSet.First;               //游标回滚
        DBGrid1.SelectedRows.CurrentRowSelected:=true;  //选中第一行
        DBGrid1.DataSource.DataSet.EnableControls;
      end;
    end;

        通过上述代码设置,编译可见效果图

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    网页跳转
    http报文简要分析
    【转】google hacking 谷歌搜索方法简介
    python中的切片问题
    Deepfakes教程及各个换脸软件下载
    PHP的虚拟域名的配置
    composer windows安装,使用新手入门[转]
    通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题
    [转] 如何把书上的字弄到电脑
    关于快排与随机化快排
  • 原文地址:https://www.cnblogs.com/jijm123/p/14923783.html
Copyright © 2020-2023  润新知