Welcome

首页 / 软件开发 / Delphi / 第十四章-简单数据库应用的创建及MASTAPP介绍(三)(4)

第十四章-简单数据库应用的创建及MASTAPP介绍(三)(4)2007-05-07

14.8 输入数据的有效性验证

当用户向一个数据库表中插入新记录或修改原有记录时,我们必须确保用户输入的数据是有效的,为此Delphi通过三种不同的途径用来验证用户输入的数据是否有效。

这三种途径是:基于数据库表的有效性验证、基于字段的有效性验证、基于记录的有效性验证。

基于数据库表的有效性验证:

在用户创建数据库表时就建立有效性验证机制,如在使用DBD创建一个表时,我们可以为创建的数据库表说明一些验证手段,包括字段的最大值,最小值,图形字段的显示格式等等。在设定这些有效性验证机制时,不需要编写任何程序代码。基于数据库表的有效性验证是当数据写到数据库之前,由数据库本身来执行。Delphi也执行一些有效性验证,如在数据写到数据库之前Delphi会验证每一个字段是否被填入相应的值,有关这种途径来验证数据的有效性的详细情况请参考DBD的使用。

基于字段的有效性验证:

一般有两种方法来进行这种方式的有效性验证。

①为记录中需要设置有效性验证的字段编写Onvalidate事件处理过程。这样每当该字段的值被修改时,该字段的OnValidate事件处理过程就会被调用,进而对被修改的字段值进行验证。

②对于记录中要求非空的字段(如口令或关键字等),我们必须首先设置这些字段的Required属性为True,然后为这些字段编写OnValidate事件处理过程,这样在修改现存记录或插入新记录时,在写入数据库之前,如果要求非空的字段中没有填入适当的字段值,那么会出现错误信息提示用户必须输入字段值。

基于记录的有效性验证:

这种验证方式一般在TTable部件的BeforePost事件处理过程中进行处理,即在记录写回到数据库之前对记录的每个字段值进行有效性验证。

例14.8 在程序中对字段值的有效性进行验证。

1. 创建一个用TEdit部件浏览ORDERS.DB表的应用,如图14.25所示。

2. 修改TDataSource部件的AutoEdit属性为True。

3. 双击TTable部件打开字段编辑器Fields Editor,并单击SaleDate字段。

4. 在Object Inspector中双击SaleDate字段对象的OnValidate事件,为该字段对象编写事件处理过程如下:

TForm1.Table1SaleDateValidate(Sender:TField);

begin

If SaleDate.Value>Now then

raise Exception.Create("不能输入一个未来的日期");

end;

当这个应用程序运行时,用户修改或插入ORDERS.DB中的记录时,该应用程序会对销售日期(SaleDate)字段的值进行验证,该字段值不能晚于系统的当前日期,程序中调用Now方法获得系统的当前日期。如果字段值大于系统的当前日期会出现一错误信息提示框,告知用户不能输入一个未来的日期。

使用TDBComBox部件和TDBLookupComBox部件来限制用户输入字段值的范围。

创建查看orders.db表的应用,创建好的窗体如图14.25所示。窗体中显示Terms 字段的是TDBComBox部件,显示EmpNo字段的是TDBLookupComBox部件。

图14.25 用数据浏览部件限制用户的输入

TDBComBox和TDBLookupComBox部件的属性值如表14.8所示:

表14.8 窗体中各部件的属性设置

━━━━━━━━━━━━━━━━━━━━━━━━━━━

部 件 属 性 属 性 值

───────────────────────────

DataField Terms

DBComBox1 DataSource DataSource1

Items Prepaid

Net 30

COD

───────────────────────────

DataField EmpNo

DataSource DataSource1

DBLookupComBox LookupSource DataSource2

KeyField EmpNo

LookupField EmpNo

───────────────────────────

DataSource1 DataSet Table1

AutoEdit True

───────────────────────────

DataSource2 DataSet Table1

AutoEdit True

───────────────────────────

Table1 DatabaseName DemosDB

TableName orders.db

───────────────────────────

Table2 DatabaseName DemosDB

TableName orders.db

━━━━━━━━━━━━━━━━━━━━━━━━━━━

该应用运行时,当用户修改和插入记录到ORDERS.DB表中时,Terms字段的值可以从组合框中的Prepaid、Net30、COD三个值中任选,EmpNo字段的值是从另一个表Employee中获得的雇员号码,用户可以从中选择。