大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 在DELPHI中利用API实现网格内组件的嵌入

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

时间: 2021-07-31 作者:daque

陈学军  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);     drawframecontrol(dbgrid1.canvas.handle,              rect,              dfc_button,              ctrlstate[column.field.asboolean]);    end;   end;      procedure tform1.dbgrid1colenter(sender: tobject);   begin    // 保证该栏是论理字段    if dbgrid1.selectedfield.datatype = ftboolean then    begin     originaloptions := dbgrid1.options;     dbgrid1.options := dbgrid1.options - [dgediting];    end;   end;      procedure tform1.dbgrid1colexit(sender: tobject);   begin    //保证该栏是论理字段    if dbgrid1.selectedfield.datatype = ftboolean then     dbgrid1.options := originaloptions;   end;      procedure tform1.dbgrid1cellclick(column: tcolumn);   begin    //保证该栏是论理字段    if dbgrid1.selectedfield.datatype = ftboolean then     saveboolean();   end;      procedure tform1.dbgrid1keydown(sender: tobject;              var key: word; shift: tshiftstate);   begin    //保证该栏是论理字段和空格键在键盘中被敲击    if ( key = vk_space ) and      ( dbgrid1.selectedfield.datatype = ftboolean ) then     saveboolean();   end;      procedure tform1.saveboolean;   begin    dbgrid1.selectedfield.dataset.edit;    dbgrid1.selectedfield.asboolean :=      not dbgrid1.selectedfield.asboolean;    dbgrid1.selectedfield.dataset.post;   end;   之上源步调在pwin+delphi5.0情况调节和测试经过,不妨径直援用。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.