第十六章 数据浏览部件的应用及编程(二)
在TDBGrid部件中显示数据库表中的记录信息时,如果TDBGrid使用数据集部件在运行过程中动态生成的字段部件时,TDBGrid显示数据库表中的记录是按表中记录的缺省顺序和字段的缺省顺序显示表中的记录信息,而且要显示表中各个记录的全部字段的值。而在大多数情况下,用户可能希望按自己喜欢的字段顺序显示记录的各个字段,有时还希望只显示记录的部分字段值,要达到这一目的,必须在设计阶段使用字段编辑器来创建永久性的字段部件,并且还要设置各个字段部件有关的属性。
当使用字段编辑器(Fields Editor)创建永久性的字段部件提供给TDBGrid部件来使用时,我们可以在TDBGrid部件中更灵活地显示数据库表中的记录信息。例如在字段编辑器中的Fields列表框中我们可以设定字段部件的显示顺序,在设定好字段的显示顺序之后,TDBGrid部件便按这个顺序显示记录的各个字段值,当我们设置字段部件的DisplayFormat和EditFormat属性之后,在TDBGrid部件中便相应地以设定的显式和编辑格式显示字段值和编辑字段值;当设置某一个字段部件的Required属性为True时,当插入一条新记录时,必须要为该字段输入相应的字段值,否则会出错;通过设置字段部件的Visible属性,可以确定相应的字段值是否在TDBGrid组件中显示。有关使用字段编辑器来创建字段部件,设置字段部件的属性请参看3.6.2节。
16.4.1 TDBGrid部件的主要属性及应用
TDBGrid部件是用于显示和编辑数据库表中的记录信息的重要部件,它是我们在程序设计过程当中要经常使用的、灵活地用于显示和编辑数据库表中的记录信息的一个强有力的工具。TDBGrid具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid部件的一些重要属性及其设置方法请参看联机帮助文件。TDBGrid部件中一些重要的属性是Option属性、DrawMode属性和DefaultDrawing属性,我们重点对两个属性进行阐述。
Options属性:它是TDBGrid部件的一个扩展属性,在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性。Options属性在TDBGrid部件的属性栏中显示时,它的前面带有一个“+”标志,双击“+”标志,便可以展开一个布尔型属性列表,用户可以逐个地修改其中的各个属性值,修改完毕后可以双击Options属性前的“-”标志,使TDBGrid部件的属性列表恢复到原来的显示状态。
表16.5列出了Options属性中包含的所有的扩展属性项以及它们对TDBGrid部件的影响。
表16.5 TDBGrid部件的Options属性中的扩展属性项
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
属 性 名 取 值 及 影 响
─────────────────────────────────
dbEditing True: 缺省情况下为此值,确保用户能够在网格中编辑插
入和删除数据库表中的记录
False:在网格中不能编辑、插入和删除表中的记录
─────────────────────────────────
dbAlwaysShow True: 当用户选中记录中的一个字段时,自动地使该字段
Editor 处于编辑状态
False:缺省情况下为此值。当一个字段被选中,它不能
自动地变成编辑状态
─────────────────────────────────
dgTitles True: 缺省情况下为此值。在网格的第一行中显示字段名
或字段标题
False:在网格中不显示字段名或字段对应的标题
─────────────────────────────────
dgIndicator True: 缺省情况下为此值。在网格的最左边用一个黑箭头
标注当前记录指针所在的位置,在插入状态时,箭
头变成星状,在编辑状时,箭头变成"I"头。
False:在网格中不标识当前记录指针的位置
─────────────────────────────────
dgColumnResize True: 缺省情况下为此值。通过拖拉网格的垂直分隔线可
以改变网格中各列的宽度,在具体操作时要拖拉各
列中显示字段标题区域中的垂直分隔线。
False:网格中各列的宽度不能改变
─────────────────────────────────
dgCloLines True: 缺省情况下为此值。在网格中显示各列之间的垂直
分隔线。
False:在网格中不显示垂直分隔线
─────────────────────────────────
dgRowLines True: 缺省情况下为此值。在网格中显示各行之间的水平
分隔线。
False:在网格中不显示水平分隔线。
─────────────────────────────────
dgTabs True: 缺省情况下为此值。可以在记录的各字段之间移动
输入焦点(也即选择提示棒)
False:不能在记录的名字段之间移动输入焦点,在网格中
按Tab键时,直接跳出网格
─────────────────────────────────
dgRowSelect True: 选择提示棒覆盖整条记录中的全部字段
False:缺省情况下为此值。选择提示棒一次只覆盖记录中
的一个字段
─────────────────────────────────
dgAlwaysShow True: 缺省情况下为此值。在网格始终显示选择提示棒,即
-Selection 使其控件获得焦点时,也是如此。
False:只在当网格获得焦点时,才显示选择提示棒。
─────────────────────────────────
dbConfirmDelete True: 缺省情况下为此值。当在网格中删除记录时,弹出确
认信息。
False:在网格中删除记录时不弹出确认信息。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
用户想了解这些可选属性项的作用和影响,还可以参看联机帮助信息。
DragMode属性:该属性有两个可选的属性值。当它的值被设置为dmManual时,在应用程序运行过程中,用户可以用鼠标拖放网格中的各列,改变各列在网格中的显示顺序和位置。当用鼠标拖放网格中的一列、改变它在网格中的位置时,只是改变了该列在数据集中的位置,并没有改变它对应的数据库表中的位置。当该属性的值被设置成dmAutomatic时,用户不能用鼠标拖放网格中的各列而改变它在网格中的位置。
DefalultDrawing属性:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为True,也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制。如果DefaulDrawing属性被设置为False时,Delphi不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序用于绘制各网格单元和其中的数据。
在了解了TDBGrid部件的各个属性之后,我们便可以使用TDBGrid部件来显示和编辑数据库表中的数据了。图16.5所示的应用窗体中各部件的属性设置如表16.6所示。
表16.6 各部件的属性设置
━━━━━━━━━━━━━━━━━━━━
属 性 名 属 性 值
────────────────────
Table1.DatabaseName DEMOS
Table1.TableName Customer.DB
Table1.CanModify True
DataSource1.DataSet Table1
DataSource1.AutoEdit True
DBGrid1.Datasource DataSource1
DBGrid1.ReadOnly False
━━━━━━━━━━━━━━━━━━━━
在其他数据浏览部件(如TDBEdit)中编辑修改其中的内容时,只要用户用Tab键或鼠标将焦点移到其他部件时,用户对该字段的修改会自动地写回到数据库表中,使用TDBGrid部件编辑修改数据库表时,Delphi是以记录为基本单位将修改写回磁盘上的数据库表的。用户在编辑和修改表中的当前记录时,只有用户将记录指针移到其他的记录时,Delphi才将用户对当前记录的修改写回到磁盘上的数据库表,否则,用户即使改变焦点到窗体中的其他部件,Dephi也不会投寄用户对当前记录的修改。Delphi在向数据库表投寄TDBGrid部件中的被修改的记录时,它会自动地检查所有与当前数据库相连的数据浏览部件的状态,只要其中有任何一数据浏览部件正在修改数据,这时会弹出出错信息,并且当前记录的修改不会被投寄(即被写回磁盘上的数据库表)。
16.4.2 TDBGrid部件的事件及应用
TDBGrid部件在具有很多重要属性的同时,Delphi也为它赋予了一些事件,以用于控制用户在TDBGrid部件中的操作,我们通过为其中的一些事件编写处理程序,可以有效地控制TDBGrid部件的行为。因为在TDBGrid部件中一次是显示多条记录和记录中的多个字段,也许在实际应用中,不同的用户各有自己特殊的需要,如只想改变其中某一列的值或者控制用户每次只能进出网格中指定的列等等。表16.7列出了TDBGrid部件的主要事件及目的用途。
表16.7 TDBGrid部件中的主要事件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
事 件 名 目 的 用 途
────────────────────────────────
OnColEntor 当用户进入网格各列时,触发该事件
OnColExit 当用户离开网格各列时,触发该事件
OnDblClick 当用户在网格中双击鼠标左键时,触发该事件
OnDragDrop 当用户在网格中用鼠标进行拖放操作时,触发该事件
OnDragOver 当用户在网格中用鼠标拖动网格时,触发该事件
OnDrawDataCell 用于定制绘制网格中各网格单元,当向网格中填充数
据时触发该事件
OnEndDrag 当用户停止拖动网格时,触发该事件
OnEnter 当网格获得焦点时,触发该事件
OnExit 当网格失去焦点时,触发该事件
OnKeyDown 当用户在网格中按下任何键或组合键时,触发该事件
OnKeyPress 当用户在网格中按了任何一个数字键或字母键时,触
发该事件
OnKeyUp 当用户在网格中释放任何被按下的键时,触发该事件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
上述这些事件在我们开发实际的应用程序时,是很有用处的,读者们可以仔细地研究这些事件的用途,并参看联机帮助信息。
例如,我们可以为TDBGrid部件的OnDblClick事件编写处理程序,当用户在网格中双击鼠标左键时,弹出一个列表框供用户为网格中某一列选择一个字段值。在例16.1中我们创建如图16.5所示的应用,在Object Inspector中设置各字段部件的Visible属性,在网格中只显示CustNo、Company、Country和City字段。我们为DBGrid编写OnDblclick事件处理过程,当用户编辑修改Country字段时,双击鼠标左键便弹出一个列表框ListBox1,其中显示“中国”、“美国”、“日本”、“英国”、“法国”、“俄罗斯”供用户选择,用户单击其中的国家名称后,将相应的洲名选入网格中。
其中ListBox1的Items属性写入上述国家的名称,并且设置其Visible属性为False。
6.5 TDBNavigator部件及其应用
TDBNavigator 部件主要用于在数据集中进行记录导航和为用户操纵数据集中的记录提供了一组简单明了的控制按钮。TDBNavigator部件中包含一组控制按钮,用户单击其中的按钮可以向前向后移动记录指针、插入记录、修改现存记录、投寄对记录的修改、取消修改、删除记录;以及刷新记录的显示等。
图16.7为TDBNavigator部件中的控制按钮。
下表描述了TDBNavigator部件中的各个控制按钮。
表16.8 TDBNavigator部件中的控制按钮
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
按钮名称 主 要 功 能
─────────────────────────────────
First 将当前记录指针移到数据库表中第一条记录处
Prior 将记录指针移到当前记录的前一条记录处
Next 将记录指针移到当前记录的后一条记录处
Last 将当前记录指针移到数据库表中最后一条记录处
Insert 调用数据集部件的Insert方法,在当前记录的前面
插入一条新记录,并将数据集部件置为插入状态
Delete 删除当前记录,如果TDBNavigator部件的ConfirmDelete
属性设置为true时,会弹出删除确认对话框
Edit 将数据集部件置为编辑状态,以便用户修改当前的记录
Post 投寄对当前记录的修改
Cancel 取消对当前记录的修改,并将数据集部件置为浏览状态
Refresh 清除数据浏览部件的显示缓冲区,并用与其相连的数据
集部件(TTable或TQuery)中的记录刷新显示缓冲区。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TDBNavigator部件的属性较少。下面我们作一简单的介绍:TDBNavigator部件的一个重要属性是VisibleButtons属性,该属性中包含着多个可选的扩展子属性,主要用于选择TDBNavigator部件中各个控制按钮的显示与否的。因为在实际的应用当中,我们并不需要那么多的控制按钮。如在一个浏览数据库表的应用中,我们一般只需要First、Prior、Next、Last四个按钮就行了,那么我们便在VisibleButtons属性中设置其它的按钮为False即可。
ShowHint属性:该属性是布尔型属性,它用于控制是否显示TDBNavigator部件中各按钮的动态提示信息。缺省情况下该属性的值为False,当设置它的值为True时,当用户将鼠标光标停留在TDBNavigator部件中某一个控制按钮上,超过1秒钟时间后,Delphi便会自动显示有关该控制按钮的提示信息。
Hints属性:在缺省情况下,TDBNavigator部件中的各控制按钮都有相应的动态提示信息,如First、Prior、Next、Last等,用户可以根据自己的需要,通过设置Hints属性可以为各控制按钮设置其他的动态提示信息,用户自己设置的动态提示信息会覆盖原来的提示信息。
16.6 TDBMemo部件及其应用
TDBMemo部件主要用于显示和编辑数据库表中的大二进制(BLOB)类型的字段值。TDBMemo部件能够显示多行文本,也允许用户在其中输入和修改多行文本信息,它是Delphi中用来显示和编辑数据库表中的大二进制类型的文本字段的唯一的数据浏览部件。
TDBMemo部件的主要属性和作用如下:
ReadOnly属性:这是布尔型属性,为True时,用户只能在TDBMemo部件中显示BLOB型文本信息,如Paradox和dBASE数据库表中的备注型字段。当为False时,用户在TDBMemo 部件中不仅可以显示BLOB文本信息而且还允许用户编辑修改其中的文本信息。
MaxLength属性:该属性是整数型属性,设置该属性的值用于限制用户向TDBMemo 部件中输入字符的个数。若设置该值为0时,表示输入字符的个数没有限制。
SCrollBar属性:说明TDBMemo部件是否显示滚动条。
WordWrap属性:说明在TDBMemo部件中输入文本信息时,输入到右边界时,是否自动换行。
Alignment属性:说明文本信息在TDBMemo部件中的对齐方式,有三种可选值:taLeftJustify、taCenter和taRightJustify。其含义分别是左对齐,居中和右对齐。
在运行过程中,用户对TDBMemo部件中显示的文本信息是不能够进行剪切、拷贝和粘贴操作的,要想具备这些功能,用户必须编程调用CutToClipboard、CopyToClipboard 和PasteFromClipboard方法分别来实现剪切,拷贝和粘贴操作。
AutoDisplay属性:因为TDBMemo部件中包含着大量的文本信息。应用程序在运行过程中要显示其中的信息需要花费很多的时间,特别是当用户移动记录指针时,都要更新TDBMemo部件中显示的信息,这样会大大减慢程序的运行速度。为此Delphi为TDBMemo部件设定了AutoDisplay属性,用来控制是否自动显示表中的备注型字段。当AutoDisplay设置为False时,在TDBMemo部件中只显示其对应表中的字段名而不显示字段中的文本信息,用户如果想浏览字段中的文本信息,用鼠标左键双击TDBMemo部件的内部即可;当设置AutoDisplay属性为True时,在TDBMemo部件中会自动地显示其对应数据库表中的字段值。
这里要注意的是,TDBMemo部件中显示和编辑文本信息的最大字节数为32K,在使用过程中不要超过这一限制。
图16.8是TDBMemo显示数据库表中备注型字段的情形。该例子在C:\Delphi\DEMOS\DA子目录中,项目名称为FashFact.dpr。
用TDBMemo部件显示备注型字段
16.7 TDBImage部件及其应用
TDBImage部件与TDBMemo部件具有很多相似的属性,它是用来显示和编辑数据库表中的BLOB类型的位图图像字段的。
图16.8中同时也使用了一个TDBImage部件来显示数据库表中的位图图像。
缺省情况下,在TDBImage部件中是允许用户对位图图像进行编辑的,如将图像剪切或拷贝到剪帖板上或从剪帖板上粘帖到TDBImage部件中等操作,同时也可以在程序中调用CutToClipboard、CopyToClipboard和PasteFromClipboard方法来实现剪切、拷贝、粘帖操作,当然要进行上述操作必须确保TDBImage的ReadOnly属性值为False。
TDBImage部件也具有一个AutoDisplay属性,该属性的控制和作用与TDBMemo 部件的AutoDisplay属性是一样的。
16.8 数据浏览部件中的列表框和组合框
在数据浏览部件中有四个部件类似于标准部件中的列表框和组合框,这些列表框和组合框主要是在数据库应用程序中为用户提供一系列的可选择的字段值。注意这些部件只能与TTable部件配合使用,而不能与TQuery部件配合使用。
表16.9 数据浏览部件中的列表框和组合框
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 名 用 途
──────────────────────────────────
TDBlistBox 在用户修改当前记录中指定的字段值时,可用该部件显示
一个字段值列表供用户选择
TDBComboBox 把一个TDBEdit部件与一个可选的字段值列表结合在一起,
当用户修改当前记录中的字段时,可以直接从部件中输入
新的字段,也可以打开下拉式列表框选择其中的一个可选项。
TDBLookapList 当用户要编辑修改数据库表当前记录的指定字段时,使用
该部件提供多个可选项,这多个可选项是从相关的其它数
据库表中读取的,且以列表框的形式提供给用户
TDBLookupCombo 该部件结合了TDBEdit部件和TDBComboBOx部件的功能,用
户可以直接向该部件中输入字段值,也可以从下拉式列表
框中选择一个可选项,只是下拉式列表框中的可选项是从
相关的其他数据库表中读取来的。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
16.9 TDBComboBox部件
TDBComboBox部件中包含了TDBEdit部件的全部功能,它们具有相似性,不同的是在运行过程中TDBComboBox部件同时有一个下拉式列表框,在下拉式列表框中有一组可供选择的项供用户选择,这些可选项是在设计阶段由程序设计人员提供给TDBComboBox部件的Items属性的。图16.9是TDBComboBox部件的下拉式列表框中的内容,注意TDBComboBox部件一定要对应数据库表中的一个字段。
图16.9 TDBComboBox部件在运行过程中
TDBComboBox部件的一个重要的属性是Items属性,该属性中包含着TDBComboBox部件在运行过程中下拉式列表框中的可选项,Items中的内容可以在设计阶段指定。
如果一个TDBComboBox部件对应着数据库表中一个字段,那么当用户要编辑修改该字段中的值时,可以打开下拉式列表框,从中选择一个可选项作为字段值,也可以自己在TDBComboBox部件中输入一个其他的字段值。
TDBComboBox部件还有下列一些重要的属性,主要用来控制TDBComboBox部件的显示模式和风格的。
Style属性:控制TDBComboBox部件列表框的显示格式的,当它的取值为:
CSDropDown
缺省情况下为此值,显示一个下拉式列表框和一个编辑框,下拉式列表框中的可选项都是字符串且各选择项占居的高度一样。
CsSimple
只显示一个列表框,列表框中的可选项都是字符串,且各选项占居一样的高度。
CSDropDownList
显示一个下拉式列表框和一个编辑框,但用户不能向编辑框中输入一个在列表框中 没有的值。
CSOwnerDrawFixed和CSOWnerDrawVariable
在列表框中不仅有字符串选项而且还允许有其他类型的选项,如位图图像等,这方 面的详细信息请参看联机帮助。
DropDownCount属性:允许列表框中显示可选项的最大数目,当可选项数目大于该属性值时,用户可以用滚动条察看全部的可选项,当可选项数小于该属性值时,列表框会自动调整其大小以足够显示全部可选项。
ItemHeight属性:当TDBComboBox部件的Style属性被设置为CSOwnerDrawFixed时,用此属性来设置列表框中每个可选项占居的高度。
Sorted属性:布尔型属性,它决定列表框中的可选项是否按字母的排列顺序排序。
16.10 TDBListBox部件
TDBListBox部件的基本功能与TDBComboBox部件基本上是一样的,它们的不同之处在于TDBListBox部件没有下拉式列表框而是一个列表框,在列表框中显示一组供用户选择的可选项,在运行过程中,用户单击其中的可选项可以为TDBListBox 部件对应的字段赋一个字段值,但用户不能自己从键盘上输入一个列表框中不存在的字段值。
如果在应用程序中,TDBListBox对应数据库表中一个具体的字段,那么当在数据集中移动记录指针时,当前记录中对应TDBListBox部件的字段的值在TDBListBox部件的列表框中将以高亮度显示,如果当前记录的该字段值不在列表框中,那么列表框中的可选项没有一项是高亮度地显示的。
TDBListBox的几个属性:
IntegralHeight属性:该属性是用来控制TDBListBox部件中的列表框的显示格式的。当该属性值为True(缺省情况下为此值)时,列表框底部的可选项自动地移到上一次被选用过的可选项的上面。当该属性的值为False时,列表框底部的可选项的显示方式取决于TDBListBox部件的ItemHeight属性,并且列表框底部可选项可能不能被全部地显示出来。