linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·delphi轻松设置无边框透明窗体
·DELPHI组件安装全攻略
·delphi第三方控件安装(Ehlib)
·delphi动态创建控件
·开发工具比较Visual C++ VS De
·delphi完整身份证效验程序实例
·如何判断文本文件的编码格式
·深入研究Variant数组
·delphi中的Format函数详解
·用delphi编写网络游戏的外挂
·Delphi技巧-用户自定义数据类型
·delphi编程获取打印机的打印任
·delphi设置控件透明
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
在DELPHI中利用API实现网格内组件的嵌入
[ 作者:  加入时间:2007-12-13 12:47:17  来自:Linux联盟收集整理 ]
Delphi中向TDBGrid添加组件是一件十分麻烦的事情。笔者在这里向大家介绍一种利用WIN32 API函数在TDBGRID中嵌入CHECKBOX组件的方法。2RXLinux联盟
2RXLinux联盟
  TDBGrid部件是用于显示和编辑数据库表中记录信息的重要部件,它是我们在程序设计过程中要经常使用的一个强有力的工具。TDBGrid具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid部件中有很多重要的属性,我们在这里重点介绍Option属性和DefaultDrawing属性,其他属性及其设置方法请参看联机帮助文件。2RXLinux联盟
2RXLinux联盟
  Options属性:它是TDBGrid部件的一个扩展属性,在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性。2RXLinux联盟
2RXLinux联盟
  DefalultDrawing属性:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为True,也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制。如果DefaulDrawing属性被设置为False,Delphi不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序以用于绘制各网格单元和其中的数据。2RXLinux联盟
2RXLinux联盟
  需要注意的是,当一个布尔字段得到焦点时,TDBGrid.Options中的 gdEditing属性不能被设置成为可编辑模式。另外,TDBGrid.DefaultDrawing属性不要设置为FALSE,否则,就不能得到网格中画布属性的句柄。2RXLinux联盟
2RXLinux联盟
  程序设计开始时就应考虑:需要设定一变量来存储原始的 TDBGrid.Options的所有属性值。这样,当一boolean字段所在栏得到焦点时将要关闭TDBGrid.Options中gdEditing的可编辑模式。与此相对应,若该栏失去焦点时,就要重新恢复原始的 TDBGrid.Options的所有属性值。2RXLinux联盟
2RXLinux联盟
  在实例中可以通过鼠标点击或敲打空格键改变布尔值,这样就需要触发TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因为这两个事件都是改变单元格中逻辑字段的布尔值,所以为了减少代码的重复最好创建一个私有过程(SaveBoolean;)来完成逻辑值的输入,以后,在不同的事件中调用此过程即可。2RXLinux联盟
2RXLinux联盟
  对 TDBGrid.OnDrawColumnCell事件的处理是整个程序的关键。处理嵌入组件的显示的传统方法是:在表单上实际添加组件对象,然后对组件的位置属性与网格中单元格的位置属性进行调整,以达到嵌入的视觉效果。这种方法虽然可行但代码量大,实际运行时控制性很差。笔者采用的方法是充分利用WIN32 API函数:DrawFrameControl(),由于此函数可以直接画出Checkbox组件,所以就无须在表单中实际添加组件。如何使用API函数:DrawFrameControl()是本程序技巧所在。2RXLinux联盟
2RXLinux联盟
  在TDBGrid.OnDrawColumnCell事件中,我想大家会注意到:设定一个整型数组常数,而这个返回的整数值是与布尔值相一致的,如果字段是逻辑字段,则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,从而实现了Checkbox组件在网格中的嵌入效果。2RXLinux联盟
2RXLinux联盟
  源代码如下:2RXLinux联盟
2RXLinux联盟
2RXLinux联盟
  type2RXLinux联盟
2RXLinux联盟
   TForm1 = class(TForm)2RXLinux联盟
    DataSource1: TDataSource;2RXLinux联盟
    Table1: TTable;2RXLinux联盟
    DBGrid1: TDBGrid;2RXLinux联盟
    procedure DBGrid1DrawColumnCell(Sender: TObject;2RXLinux联盟
          const Rect: TRect; DataCol: Integer;2RXLinux联盟
          Column: TColumn; State: TGridDrawState);2RXLinux联盟
    procedure DBGrid1ColEnter(Sender: TObject);2RXLinux联盟
    procedure DBGrid1ColExit(Sender: TObject);2RXLinux联盟
    procedure DBGrid1CellClick(Column: TColumn);2RXLinux联盟
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;2RXLinux联盟
          Shift: TShiftState);2RXLinux联盟
   private2RXLinux联盟
    { Private declarations }2RXLinux联盟
    OriginalOptions : TDBGridOptions;2RXLinux联盟
    procedure SaveBoolean;2RXLinux联盟
   public2RXLinux联盟
    { Public declarations }2RXLinux联盟
   end;2RXLinux联盟
2RXLinux联盟
  {...}2RXLinux联盟
2RXLinux联盟
  procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;2RXLinux联盟
           const Rect: TRect; DataCol: Integer;2RXLinux联盟
           Column: TColumn; State: TGridDrawState);2RXLinux联盟
  const2RXLinux联盟
  
// 这个整数值将按照布尔值返回,并送入数组2RXLinux联盟
   CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);2RXLinux联盟
  begin2RXLinux联盟
    
//确保只有在逻辑字段才能插入组件2RXLinux联盟
   if Column.Field.DataType = ftBoolean then2RXLinux联盟
     begin2RXLinux联盟
        DBGrid1.Canvas.FillRect(Rect);2RXLinux联盟
        DrawFrameControl(DBGrid1.Canvas.Handle,2RXLinux联盟
                 Rect,2RXLinux联盟
                 DFC_BUTTON,2RXLinux联盟
                 CtrlState[Column.Field.AsBoolean]);2RXLinux联盟
       end;2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  procedure TForm1.DBGrid1ColEnter(Sender: TObject);2RXLinux联盟
  begin2RXLinux联盟
    
// 确保该栏是逻辑字段2RXLinux联盟
   if DBGrid1.SelectedField.DataType = ftBoolean then2RXLinux联盟
     begin2RXLinux联盟
        OriginalOptions := DBGrid1.Options;2RXLinux联盟
        DBGrid1.Options := DBGrid1.Options - [dgEditing];2RXLinux联盟
       end;2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  procedure TForm1.DBGrid1ColExit(Sender: TObject);2RXLinux联盟
  begin2RXLinux联盟
    
//确保该栏是逻辑字段2RXLinux联盟
   if DBGrid1.SelectedField.DataType = ftBoolean then2RXLinux联盟
      DBGrid1.Options := OriginalOptions;2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  procedure TForm1.DBGrid1CellClick(Column: TColumn);2RXLinux联盟
  begin2RXLinux联盟
    
//确保该栏是逻辑字段2RXLinux联盟
   if DBGrid1.SelectedField.DataType = ftBoolean then2RXLinux联盟
      SaveBoolean();2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  procedure TForm1.DBGrid1KeyDown(Sender: TObject;2RXLinux联盟
             var Key: Word; Shift: TShiftState);2RXLinux联盟
  begin2RXLinux联盟
    
//确保该栏是逻辑字段和空格键在键盘中被敲击2RXLinux联盟
   if ( Key = VK_SPACE ) and2RXLinux联盟
       ( DBGrid1.SelectedField.DataType = ftBoolean ) then2RXLinux联盟
      SaveBoolean();2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  procedure TForm1.SaveBoolean;2RXLinux联盟
  begin2RXLinux联盟
     DBGrid1.SelectedField.Dataset.Edit;2RXLinux联盟
     DBGrid1.SelectedField.AsBoolean :=not DBGrid1.SelectedField.AsBoolean;2RXLinux联盟
     DBGrid1.SelectedField.Dataset.Post;2RXLinux联盟
    end;2RXLinux联盟
2RXLinux联盟
  以上源程序在PWIN+DELPHI5.0环境调试通过,可以直接引用。 Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·使用API的一个注意之处  (2007-12-13 12:46:42)
 ·嵌入式系统编程者必须要掌握的原则  (2007-12-06 18:08:55)
 ·Asp无组件生成缩略图  (2007-12-03 15:49:00)
 ·用Delphi打造图形界面的Ping程序  (2007-12-03 14:55:11)
 ·Delphi中异常的处理  (2007-12-03 14:50:54)
 ·在Delphi中侦测剪贴板的变化  (2007-12-03 14:48:21)
 ·delphi中的快捷键大收集  (2007-12-03 14:44:45)
 ·如何为Delphi程序添加事件和事件处理器  (2007-12-03 14:44:11)
 ·DELPHI中线程的初步探索  (2007-12-03 14:43:37)
 ·delphi端口扫描  (2007-12-03 14:39:06)