Delphi基础教程:DELPHI自定义组件开发(3) [3]

控制Delphi是否存储属性的方法是在属性声明后添加一个存储指令,后跟一个真或假或布尔方法名。您可以将存储表达式添加到任何属性的声明或重述中。下面的代码显示了组件声明了三个新属性:一个属性总是被存储,第三个属性依赖于布尔方法的值。

类型

tsamplecompement = class(t component)

保护

函数store it:Boolean;

Public {正常情况下不存在}

属性重要:整数存储为True{总是存储}

已发布{正常保存}

属性不重要:整数存储为False{不保存}

属性有时:整数存储StoreIt{存储取决于函数值}

结束;

④加载后初始化。

在组件从存储的描述中读取所有属性后,它调用一个名为Loaded的虚拟方法,这提供了一个根据需要执行任何初始化的机会。调用Loaded是在窗体及其控件显示之前,不用担心初始化导致的屏幕闪烁。

当组件加载属性以重写加载的方法时,初始化组件。

在Loaded方法中要做的第一件事是调用继承的Loaded方法,这将在组件执行初始化之前初始化所有继承的属性。

以下代码来自TDatabase组件,该组件在加载后尝试重建存储时打开的连接,并描述了连接异常时的处理方法。

过程t数据库已加载

开始

继承加载;{总是首先调用继承的方法}

已修改;{设置内部标志}

尝试

如果FStreamedConnected,则打开;{重建连接}

除...之外

如果cs在组件状态下设计,则{在设计时}

application HandleException(self){让Delphi处理异常}

否则提高;{那不行}

结束;

结束;

Delphi组件编程示例

创建数据库相关的日历控件TDBCalendar

在处理数据库连接时,直接将控件和数据关联起来是非常重要的,也就是说,应用程序可以在控件和数据库之间建立一条链。Delphi包括与数据相关的标签、编辑框、列表框和网格,用户可以自己制作与数据相关的控件。

数据关联有几个层次。最简单的是只读数据关联或数据浏览以及反映数据库当前状态的能力。更复杂的是数据相关的编辑,即用户可以在控件中操纵数据库中的数据。

在本节中,将举例说明最简单的情况,即创建链接数据库的单个字段的只读控件。在这种情况下,将使用组件面板的Samples页面中的TCalendar小部件。

创建与数据相关的日历控件包括以下步骤。

●创建和注册零件。

●将控件设为只读。

●添加数据链接。

●响应数据变化

创建和注册零件

每个零件的创建都以相同的方式开始。在本例中,将遵循以下过程。

●将组件库单元命名为DBCal。

●从TCalendar继承一个名为TDBCalendar的新组件。

●在组件面板的样本页面中注册TDBCalendar。

下面是创建的代码。

单位DBCal

连接

使用SysUtils WinTypes WinProc消息类图形控件

窗体网格日历;

类型

TDBCalendar=class(TCalendar)

结束;

程序寄存器;

履行

程序寄存器;

开始

注册组件(示例[TDBabendar])

结束;

结束

将控件设为只读

因为此数据日历以只读方式响应数据,所以用户无法控制更改数据并期望它们反映在数据库中。

将日历设为只读包括以下两个步骤。

●添加只读属性。

●允许所需的更新。

添加只读属性

向calendar控件添加只读选项是一个直接的过程。通过添加属性,可以提供一种在设计时使控件只读的方法。当属性值设置为True时,控件中的所有元素都将被取消选择。

(1)添加私有域进行财产申报和保存价值。

类型

TDBCalendar=class(TClendar)

私人的

fread only:Boolean;

公众的

构造函数Create(aoowner:t component)重写;

出版

property ReadOnly:Boolean read FReadOnly write FReadOnly default True;

结束;

构造函数TDBCalendar Create(aoowner:t component)

开始

继承创建(所有者)

fread only:= True;

结束;

⑵重写SelectCell方法,以便在控件为只读时不允许选择。

函数TDBCalendar select cell(ACol Arow:Longint)Boolean;

开始

如果只是朋友,那么

结果:=假

其他

结果:=继承的SelectCell(Acol ARow)

结束;

还要在TDBcalendar的语句中声明SelectCell。

如果现在将Calendar添加到表单中,您会发现小部件完全忽略鼠标和击键事件,并且在更改日期时无法更改选定的位置。控制响应将在下面更新。

允许必需的更新

只读日历使用SelectCell方法实现各种更改,包括设置Row和Col的值,当日期发生变化时,UpdateCalendar方法设置Row和Col的值,但由于SelectCell不允许您进行更改,因此即使日期发生变化,选择内容也保持不变。

您可以向日历添加一个布尔标志,当标志为真时允许更改。

类型

TDBCalendar=class(TCalendar)

私人的

fupdating:Boolean;

保护

function select cell(Acol Arow:Longint)Boolean;覆盖;

公众的

过程更新日历;覆盖;

结束;

函数TDBCalendar select cell(ACol ARow:Longint)Boolean;

开始

if(非更新)和FReadOnly then

结果:= False {更新时允许选择}

其他

结果:=继承的选择单元格(acolarow){否则,调用继承的方法}

结束;

过程更新日历;

开始

正在更新:= True{设置标志以允许更新}

尝试

继承的UpdateCalendar{照常更新}

最后

FUpdating:= False;{总是清除标志}

结束;

结束;

目前日历仍然不允许用户修改,但在更改日期属性时可以正确反映变化。目前已经有了真正的只读控件,下一步就是增加数据浏览能力。

添加数据连接

控件和数据库之间的连接由名为Datalink的对象处理。Delphi提供了几种类型的数据链。将控件连接到数据库的单个域的数据链接对象是TFieldDatalink。

与数据相关的控件拥有DataLink对象,这意味着该控件负责创建和销毁DataLink。

要将数据链接创建为拥有对象,需要以下三个步骤。

声明对象域。

●声明访问属性

●初始化数据链。

(1)声明对象域

每个部分都必须为其拥有的对象声明一个对象字段,因此日历对象DataLink声明一个TFieldDataLink类型的字段。

日历部分中的数据链接声明如下

类型

TDBCalendar = class(TSampleCalendar)

私人的

FDataLink:TFieldDataLink;

结束;

(2)声明访问属性

每个与数据相关的控件都有一个DataSource属性,它描述了应用程序向控件提供数据的数据源,访问单个域的数据库也需要一个DataField属性来描述数据源中的域。

Lishi Xinzhi/Article/program/Delphi/201311/25115