在DELPHI中利用API实现网格内组件的嵌入

2016-01-29 14:13 81 1 收藏

在DELPHI中利用API实现网格内组件的嵌入,在DELPHI中利用API实现网格内组件的嵌入

【 tulaoshi.com - Delphi 】

 
  Delphi中向TDBGrid添加组件是一件十分麻烦的事情。笔者在这里向大家介绍一种利用WIN32 API函数在TDBGRID中嵌入CHECKBOX组件的方法。

  TDBGrid部件是用于显示和编辑数据库表中记录信息的重要部件,它是我们在程序设计过程中要经常使用的一个强有力的工具。TDBGrid具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid部件中有很多重要的属性,我们在这里重点介绍Option属性和DefaultDrawing属性,其他属性及其设置方法请参看联机帮助文件。

  Options属性:它是TDBGrid部件的一个扩展属性,在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性。

  DefalultDrawing属性:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为True,也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制。如果DefaulDrawing属性被设置为False,Delphi不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序以用于绘制各网格单元和其中的数据。

  需要注意的是,当一个布尔字段得到焦点时,TDBGrid.Options中的 gdEditing属性不能被设置成为可编辑模式。另外,TDBGrid.DefaultDrawing属性不要设置为FALSE,否则,就不能得到网格中画布属性的句柄。

  程序设计开始时就应考虑:需要设定一变量来存储原始的 TDBGrid.Options的所有属性值。这样,当一boolean字段所在栏得到焦点时将要关闭TDBGrid.Options中gdEditing的可编辑模式。与此相对应,若该栏失去焦点时,就要重新恢复原始的 TDBGrid.Options的所有属性值。

  在实例中可以通过鼠标点击或敲打空格键改变布尔值,这样就需要触发TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因为这两个事件都是改变单元格中逻辑字段的布尔值,所以为了减少代码的重复最好创建一个私有过程(SaveBoolean;)来完成逻辑值的输入,以后,在不同的事件中调用此过程即可。

  对 TDBGrid.OnDrawColumnCell事件的处理是整个程序的关键。处理嵌入组件的显示的传统方法是:在表单上实际添加组件对象,然后对组件的位置属性与网格中单元格的位置属性进行调整,以达到嵌入的视觉效果。这种方法虽然可行但代码量大,实际运行时控制性很差。笔者采用的方法是充分利用WIN32 API函数:DrawFrameControl(),由于此函数可以直接画出Checkbox组件,所以就无须在表单中实际添加组件。如何使用API函数:DrawFrameControl()是本程序技巧所在。

  在TDBGrid.OnDrawColumnCell事件中,我想大家会注意到:设定一个整型数组常数,而这个返回的整数值是与布尔值相一致的,如果字段是逻辑字段,则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,从而实现了Checkbox组件在网格中的嵌入效果。

  源代码如下:

  type

   TForm1 = class(TForm)

    DataSource1: TDataSource;

    Table1: TTable;

    DBGrid1: TDBGrid;

    procedure DBGrid1DrawColumnCell(Sender: TObject;

          const Rect: TRect; DataCol: Integer;

          Column: TColumn; State: TGridDrawState);

    procedure DBGrid1ColEnter(Sender: TObject);

    procedure DBGrid1ColExit(Sender: TObject);

    procedure DBGrid1CellClick(Column: TColumn);

    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;

          Shift: TShiftState);

   private

    { Private declarations }

    OriginalOptions : TDBGridOptions;

    procedure SaveBoolean;

   public

    { Public declarations }

   end;

  

  {...}

  procedure TForm1.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);

来源:http://www.tulaoshi.com/n/20160129/1492791.html

延伸阅读
标签: ASP
  作者:杨忠勋 专业:计算机软件开发及应用 语言能力:TOFEL633 GRE2140 Email:zhongxunyang@yahoo.com.cn       在Mis系统的实际开发中,我们有时需要将当前页面上报表的数据以Word文档的格式下载到本地,这种实现并不困难。但是有时我们需要对下载的Word文档的格式做一些设置,比如标题颜色,字体大小,字...
Delphi是美国Borland公司推出的一个十分优秀的软件开发平台。它以其强大的开发功能在众多的开发环境中独占鳌头,尤其是它在多媒体软件的开发上更是技高一筹。在Delphi的组件板system页上有一个称为MediaPlayer的组件,它是多媒体软件制作的核心,以下将就MediaPlayer 组件的使用作以详解。 MediaPlayer组件主要是用于控制MCI(Med...
标签: Web开发
本JavaScipt教程将让你感受到FLASH给您带来有声世界的无穷魅力。在开始本教程之前,我先介绍一下本教程涉及到的内容:隐藏嵌入的SWF、 播放流同步的SWF、 从指定的帧上开始流、 停止和播放流、 检查是否磁道在播放、 检查是否播放器准备好、 检查SWF转载的百分比、验证SWF是否完全装载好、检查播放器的版本号、设置最小的播放器版本号、 清除错...
对象链接和嵌入(Object Linking and Embeding)是一组服务功能,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。 对象可以是几乎所有的信息类型,如文字、位图、矢量图形,甚至于声音注解和录像剪辑等。 Windows附件组中的书写器是应用OLE的实例,使用单击对象 | 插入菜单项, 书写器弹出插入对话框,对话框中列出了...
所谓API就是“应用程序接口”(ApplicationProgramingInterface),是一些用C语言编写,由操作系统自身调用的函数。WindowsAPI函数由许多“动态链接库”或DLL组成。在32位Windows中,核心的Windows APIDLL有如下一些: gdi32.dll----图形显示界面的API。 kernel32.dll----处理低级任务(比如内存和任务管理)的API。 user32.d11...