利用TDBNavigator部件创建存取程序
我们可以改进一下Cust程序以便它一次只在对话框中显示一个客户的记录信息并用一个TDBNavigator部件控制对记录存取──允许我们选择一个记录来显示或编辑以及增加和删除记录完成的应用窗体
增强的Cust程序
创建应用程序窗体
我们可以非常迅速地创建起来因为到目前为止我们对创建窗体的方法已经比较熟悉我们首先把所有的部件都放到窗体中然后再设置它们的属性
开始一个新工程设置窗体Form的Name 属性为 Customerform Caption 属性为 CustomerForm然后从部件选择板上的Data Access页上选取一个Datasource部件和一个Table部件放在窗体的右上角再从Data Controls页上选取DBNatvigator部件放在窗体的左上角
窗体中其余的部件如图所示它们是TDBEdit和TLabel部件按图 所示创建并布置部件分别命名DBEdit部件为EditCustno Editcompany EditAddr EditAddrEditCityEditStateEditZipEditCountryEditPhone EditFAXEditTaxRateEditContact
现在我们来连接TTable部件和 TDataSource 部件 然后连接所有的数据浏览部件和DataSource部件设置TBNavigator部件和TDBEdit部件的属性它们的DataSource属性都设置为DataSouce我们最后要做的事是连接窗体中各个TDBEdit 部件和它们在数据库表中对应的字段名通过设置TDBEdit 部件的 DataField 属性来完成 例如要连接命名为EditCustNo的TDBEdit部件和数据库表中的CustNo字段具体步骤如下
①选中窗体中的EditCustNo部件
②在Object Inspector窗体中单击DataField属性右边的箭头
③从下拉列表中选中CustNo字段名
对窗体中的其他TDBEdit部件执行以上操作连接到其对应的字段然后保存文件命名代码单元名为Custpas命名工程名为CusprjDPR
使用TDBNavigator部件移动记录指针
上述程序运行之后在数据浏览部件中会显示数据库表中的第一条记录利用Tab 键可以在字段之间移动但是不能编辑字段因为我们为了防止意外修改设置了Table的AutoEdit属性值为False如果想对数据库表中的记录进行编辑插入和删除操作或者想显示数据库表中另一条记录 需要按 TDBNvigator 部件上这些功能所对应的功能按钮TDBNavigator部件上的按钮和它们的功能如图所示
TDBNavigator中的按钮
TDBNavigator部件的绝大多数功能都可以根据其按钮的图标能够很容易地识别出来而且TDBNavigator部件本身能感知到很多事情如当前指针是否在数据库表的开头或尾部如果用户正在查看数据库表中的最后一个记录Next和Last按钮将会变灰成为非活动状态同样如果用户当前正在浏览数据库表中的第一条记录 TDBNavigator 上的 First 和Previous按钮会变灰而成为非活动状态有关各个按钮的作用的更详细说明请查看联机帮助
如果用户想修改当前的记录单击TDBNavigator部件的Edit按钮然后完成需要做的修改在做完修改之后单击Post按钮以便将作的修改写入实际的数据库表中(更新实际的数据库表中的记录在数据库术语中叫作投寄记录即PostT)如果想取消所做的修改单击Cancel按钮Cancel按钮只取消自从上一次往数据库表中投寄记录以来对记录所做的修改例如如果用户曾修改了CustNo字段并单击了Post按钮投寄了修改然后再修改Company字段并按Cancel那么只有对Company所做的修改将会被取消也就是说一旦修改被写入了数据库表中再按Cancle按钮是无法取消对记录的修改的要想恢复到以前的状态用户必须要重新编辑修改记录值得注意的是当用户修改了当前的记录并移动到其他记录时TDBNavigaator部件会自动地投寄用户对记录的修改例如如果我们修改了记录的Company字段并没有按Post按钮以更新表中的记录而是移动到下一条记录这时用户对记录的修改也会自动地被写入数据库表中
定制TDBNavigator部件
TDBNavigator部件中的按钮对我们开发人员来说是很方便的但对于程序的最终用户来说不一定那么一目了然为了帮助最终用户或初级用户更方便有效地使用TDBNavigator部件我们可以设置TDBNavigator部件的ShowHint属性为True这样当鼠标光标停留在TDBNavigator部件上的某一个按钮上超过大约秒钟在屏幕上便会出现该按钮的提示信息如果我们不想使用TDBNavigator部件本身嵌入的提示信息我们还可以设置TDBNavigtor部件的Hints属性为每个按钮指定特定的提示信息以帮助用户使用TDBNavigator部件
TDBNavigator部件中有多个功能按钮但并不是所有的按钮对每一个数据库应用程序都是需要的特别是那些不允许修改表中的数据或修改只是在很严格的控制下进行的数据库应用程序我们可以通过设置TDBNavigator部件的 VisibleButtons 属性来确定要在TDBNavigator中显示哪些按钮步显示哪些按钮例如如果我们不允许用户修改表中的记录我们就不需要AddDeletePostCancel 或 Refresh 按钮 我们设置这些按钮的VisibleButtons属性为False这样在TDBNavigator部件中将不会出现这些按钮
TDBNavigator部件的ConfirmDelete属性和Delete 按钮配合使用对用户删除数据库表中的记录是非常有用的当ConfirmDelete属性设置为 True (缺省设置) 当用户单击Delete按钮试图删除当前记录时Delphi会弹出一个确认框要用户确认是否真的想删除当前记录这样在用户进行删除记录的操作时会更安全一些如果用户不希望在按下Delete按钮时出现确认框只要把ConfirmDelete设置为False就可以了
还有一些属性可以用来定制TDBNavigator部件的外观和性能有关这方面的详细信息请参看联机帮助
创建主要──明细数据库应用
我们前面在介绍的基于单个数据库表的数据库应用程序只能对数据库表进行简单的管理大多数只用来浏览单个数据库表中的记录信息如果我们想浏览多个相关的数据库表中的记录信息就必须要创建主要──明细型数据库应用程序
在主要──明细型数据库应用程序中一个数据库表作为主要表其中存放着综合信息其他的数据库表和主要数据库表相关联它们当中存放着更详细的信息例如当数据库表CustomerDB作为主表它包含着客户的综合信息如编号姓名所在公司的名称等等而数据库表OrdersDB中包含着每个客户的订货单的详细信息如订单号发货日期起运日期发货目的地等信息这样当在CustomerDB表中查看某一位客户时利用其中的字段CustNo与OrdersDB表发生联系自动地从OrdersDB表中检索出这位客户曾经发来的所有订货单的详细信息主要──明细型数据库体现了关系数据库的特点即独立的数据库表之间基于它们共同的字段而发生联系在这里CustomerDB和OrdersDB拥有一个共同的字段CustNo
一对多关系的主要──明细型数据库应用程序
主要和明细数据库表之间存在一对多的关系意思是说对于主表中的一条记录在明细表中有多条记录与之对应例如创建一个主要──明细型数据库应用程序其包括两个表CustomerDB和OrdersDB它们分别作为主表和明细表创建好的应用如图所示窗体中各部件的属性设置
表 主要──明细型数据库应用中各部件的属性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 属 性 属 性 值 注 释
──────────────────────────────────
Table Active True
(主表) DatabaseName DBDEMOS
TableName CUSTOMERDB
──────────────────────────────────
DataSource DataSet Table
AutoEdit False
──────────────────────────────────
Table Active True
(明细表) DatabaseName DBDEMOS
TableName ORDERSDB
IndexFieldNames CUSTNO 指定字段CUSTNO作为Table中的索引字段
MasterField CUSTNO 指定与主表发生联系的字段
MasterSource DataSource 说明与主表相连接的数据源即DataSource
──────────────────────────────────
DataSource DataSet Table
AutoEdit False
──────────────────────────────────
DBGrid DataSource DataSource
(对应主表)
──────────────────────────────────
DBGrid DataSource DataSource
(对应明细表)
TableName ORDERSDB
──────────────────────────────────
DBNavigator DataSource DataSource
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一对多关系是非常普遍的关系即便是简单的名字/ 地址数据库都有一对多的关系因为一个人可能不止一个地址家庭地址工作地址还可能有别墅地址在本例中公司的一个客户常常有多个订货单当我们单击DBNavigator中的向前向后按钮时会移动DBGrid中的记录指针而在DBGrid中会自动显示与DBGridl 中当前记录相关的多条记录即显示一个客户的信息时同时会显示该客户的所有订货单的详细信息
一对多──多关系的数据库应用
前面我们介绍了基于两个表的一对多关系的应用下面我们介绍怎样创建一个从三个表中浏览数据记录的一对多关系的应用
例如一个客户也许有多张订货单而每一张订货单中有多个订货项目这样我们在CustomerDB表和OrdersDB表之间建立一个主要──明细型关系同时在ordersDB 表和ItemsDB表之间建立一个主要──明细型关系
窗体中各部件的属性如表所示
表 一对多──多关系的应用中各部件的属性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 属 性 属 性 值 注 释
──────────────────────────────────
Active True
Table DatabaseName DBDEMOS
TableName CUSTOMERDB
──────────────────────────────────
DataSource DataSet Table
AutoEdit False
──────────────────────────────────
Active True
DatabaseName DBDEMOS
Table TableName ORDERSDB
IndexFieldNames CUSTNO
MasterField CUSTNO
MasterSource DataSource
──────────────────────────────────
[] [] []