没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
13页
Delphi 4中有四种类型的标准数据集构件,分别是TTable、TQuery、TStoredProc和TClientDataSet。这些数据集构件都是从一个共同的基类TDataSet继承下来的,其中,只有TClientDataSet是直接从TDataSet继承下来的,而TTable、TQuery、TStoredProc的直接上级是TDBDataSet,TDBDataSet的上级是TBDEDataSet,TBDEDataSet 的上级才是TDataSet。
资源推荐
资源详情
资源评论
第六章 什么是数据集
Delphi 4 中有四种类型的标准数据集构件,分别是 TTable、TQuery、TStoredProc 和
TClientDataSet。这些数据集构件都是从一个共同的基类 TDataSet 继承下来的,其中,只
有 TClientDataSet 是直接从 TDataSet 继承下来的,而 TTable、TQuery、TStoredProc 的
直接上级是 TDBDataSet,TDBDataSet 的上级是 TBDEDataSet,TBDEDataSet 的上级
才是 TDataSet。这几个类之间的继承关系可以用图 6.1 来表示。
图 6.1 数据集的继承关系
TDataSet 是所有数据集的抽象基类,它的大部分属性和方法是虚拟的或抽象的。所谓
虚拟的方法,是指这些方法可以被派生类重载。所谓抽象的方法,是指这些方法只有声明
没有定义,派生类必须给出定义后才能调用这些方法,不同的派生类可以有不同的定义。
由于 TDataSet 中包含抽象的方法,您不能直接创建它的实例,否则会引起运行期错
误。
如果从功能上划分,TDataSet 的属性和方法可以分为这么几大块:打开和关闭数据集、
浏览记录、编辑数据、书签管理、控制连接、访问字段、记录缓冲区管理、过滤、事件。
6.1 打开和关闭数据集
在对数据集进行任何操作之前,首先要打开数据集。要打开数据集,可以把 Active 属
性设为 True,例如:
CustTable.Active := True;
也可以调用 Open 函数,例如:CustQuery.Open;
要关闭数据集,可以把 Active 属性设为 False 或者调用 Close 函数。
6.2 数据集的状态
数据集的状态(State 属性)决定了当前能够对数据集进行的操作,例如,当数据集已经
关闭,它的状态是 dsInactive,此时就不能访问数据集的任何数据。
6.2.1 State 属性
State 属性是只读的,下面列出了 State 属性可能的值:
.dsInactive 数据集已关闭,不能访问它的数据;
.dsBrowse 数据集已打开,可以浏览数据但不能修改数据;
.dsEdit 此时为编辑状态,可以修改数据;
.dsInsert 此时可以插入一条新的记录;
.dsSetKey 只适用于 TTable 和 TClientDataSet,此时可以设置范围和键值,并且可以调
用 GotoKey 函数;
.dsCalcFields 正在处理 OnCalcFields 事件(当字段需要指定一个值的时候促发的事件),此时不
能修改非计算字段的值;
.dsCurValue 内部使用;
.dsNewValue 内部使用;
.dsOldValue 内部使用;
.dsFilter 正在进行过滤操作。
当一个数据集刚刚打开的时候,它的 State 属性被设为 dsBrowse,以后,State 属性
的值会随着应用程序的操作自动变化。
要使数据集进入 dsBrowse、dsEdit、dsInsert 或 dsSetKey 状态,就得调用相应的方
法。
例如,要使数据集 CustTable 进入 dsInsert 状态,程序示例如下:
Procedure TForm1.InsertButtonClick(Sender: TObject);
Begin
1
CustTable.Insert;{进入 dsInsert 状态}
AddressPromptDialog.ShowModal;
If AddressPromptDialog.ModalResult := mrOK then
CustTable.Post; {恢复为 dsBrowse 状态}
Else
CustTable.Cancel; {恢复为 dsBrowse 状态}
End;
从上面这个例子可以看出,有些操作会使数据集自动变成 dsBrowse 状态,例如,调
用 Post 函数如果成功的话,数据集就恢复为 dsBrowse 状态,如果调用 Post 没有成功,
数据集仍然保持原来的状态。调用 Cancel 也能使数据集恢复为 dsBrowse 状态。
如果把 Active 属性设为 False,或者调用 Close,将使数据集进入 dsInactive 状态。例
如,下面两行代码是等价的:
CustTable.Active := False;
CustTable.Close;
有些状态如 dsCalcFields、dsCurValue、dsNewValue、dsOldValue 和 dsFilter 不能
被 应 用 程 序 所 控 制 , 而 是 由 数 据 集 本 身 根 据 需 要 自 动 设 置 的 。 例 如 , 当 正 在 处 理
OnCalcFields 事件时,就自动进入 dsCalcFields 状态。当退出处理 OnCalcFields 事件的
句柄时,数据集自动恢复成原先的状态。
当数据集的状态发生改变时,会触发 TDataSource 构件的 OnStateChange 事件,如
果这个 TDataSource 构件的 DataSet 属性指定了这个数据集的话。
下面详细介绍数据集的各种状态以及怎样进入这些状态。
6.2.2 dsInactive 状态
当数据集已关闭时,就处于 dsInactive 状态。此时,不能访问它的任何数据。
要使数据集进入 dsInactive 状态,可以把 Active 属性设为 False,或者调用 Close。在
数据集将要关闭之前,会触发 BeforeClose 事件。当数据集刚刚关闭,会触发 AfterClose
事件。如果在数据集处于 dsEdit 或 dsInsert 状态时调用 Close,应当在处理 BeforeClose
事件的句柄中提示用户是认可还是取消。程序示例如下:
Procedure CustTable.VerifyBeforeClose(DataSet: TDataSet)
Begin
If (CustTable.State = dsEdit) or (CustTable.State = dsInsert) then
Begin
If MessageDlg(认可修改吗?, mtConfirmation, mbYesNo, 0) = mrYes then
CustTable.Post;
ElseCustTable.Cancel;
End;
End;
6.2.3 dsBrowse 状态
当一个数据集刚刚打开的时候,数据集总是处于 dsBrowse 状态,此时,可以显示数
据集中的记录,但不能编辑和插入记录。
dsBrowse 状态可以认为是数据集的基本状态,在此状态下,可以进入其他状态。例
如,调用 Insert 或 Append 函数将使数据集的状态从 dsBrowse 变成 dsInsert(当然,这还
取决于其他因素,如 CanModify 属性的值),调用 SetKey 将使数据集从 dsBrowse 变成
dsSetKey 状态。
TDataSet 有两个方法可以使数据集回到 dsBrowse 状态,一个是 Cancel,它将取消当
2
前正在进行的编辑、插入、搜索等操作,使数据集回到 dsBrowse 状态。另一个是 Post,
它将试图把修改了的数据保存到数据集中,如果成功的话,数据集将回到 dsBrowse 状态,
如果没有成功,数据集仍然保持原先的状态。
6.2.4 dsEdit 状态
如果应用程序要修改数据集的数据,必须首先进入 dsEdit 状态。要进入 dsEdit 状态,
可 以 调 用 Edit 。 不 过 , 调 用 Edit 并 不 能 保 证 一 定 能 进 入 dsEdit 状 态 , 这 还 取 决 于
CanModify 属性的值。如果这个属性返回 True 的话,表示数据集是可以读和写的。
对于 TTable 构件来说,如果 ReadOnly 属性设为 True,CanModify 属性肯定返回
False。对于 TQuery 构件来说,如果 RequestLive 属性设为 False,CanModify 属性肯定
返回 False。
即使数据集进入了 dsEdit 状态,也并不意味着用户就一定能修改数据,数据控件的
ReadOnly 属性还必须设为 False。此外,对于 SQL 数据库来说,用户能不能修改数据还
取决于用户有没有修改数据的权限。
要从 dsEdit 状态返回到 dsBrowse 状态,可以调用 Cancel、Post 或 Delete 函数,其
中,如果 Post 和 Delete 没有调用成功的话,就仍然保持 dsEdit 状态。
在数据控件中,当用户修改了数据后把输入焦点移走,就相当于调用 Post 函数,将使
数据集回到 dsBrowse 状态。
6.2.5 dsInsert 状态
如果应用程序要插入新的记录,必须首先进入 dsInsert 状态。要进入 dsInsert 状态,
可以调用 Insert 或 Append 函数。不过,调用 Insert 或 Append 并不能保证一定能进入
dsInsert 状态,这还取决于 CanModify 属性的值是否返回 True。
即使数据集进入了 dsInsert 状态,也并不意味着用户就一定能插入记录,数据控件的
ReadOnly 属性还必须设为 False。此外,对于 SQL 数据库来说,用户能不能插入记录还
取决于用户有没有修改数据的权限。
要从 dsInsert 状态返回到 dsBrowse 状态,可以调用 Cancel、Post 或 Delete 函数,其
中,如果 Post 没有调用成功的话,就仍然保持 dsInsert 状态。
在数据控件中,当用户修改了数据后把输入焦点移走,就相当于调用 Post,将使数据
集回到 dsBrowse 状态。
6.2.6 dsSetKey 状态
可以调用 Locate、Lookup 在数据集中搜索特定的记录。对于 TTable 构件来说,还可
以调用 GotoKey、GotoNearest、FindKey 或 FindNearest 在表格中搜索特定的记录。在调
用上述方法之前,必须首先使数据集进入 dsSetKey 状态。要使数据集进入 dsSetKey 状态,
可以调用 SetKey。调用了上述方法后,数据集又回到 dsBrowse 状态。
另外,可以对数据集进行过滤。对于 TTable 构件来说,还可以预先设置范围。在进行
过滤和范围操作前,也要首先进入 dsSetKey 状态。
6.2.7 dsCalcFields 状态
当 OnCalcFields 事件 被触 发 时, 就会 使数 据 集进 入 dsCalcFields 状 态。 在处 理
OnCalcFields 事件的句柄中,应当给出“计算字段”的值。
在 dsCalcFields 状态下,除了“计算字段”外,应用程序不能修改其他字段的值,因为
如果其他字段的值发生变化,又会导致 OnCalcFields 事件被触发,从而导致无限循环。
当 OnCalcFields 事件处理完毕,数据集又回到 dsBrowse 状态。
6.2.8 dsFilter 状态
当 OnFilterRecord 事件被触发时,就会使数据集进入 dsFilter 状态。在此状态下,不
允许修改数据集的记录,否则,过滤就无法正确执行。
3
剩余12页未读,继续阅读
资源评论
- asefasdf2013-10-31有用 谢谢 不过不应该这么多分吧
- fdddddddddg2013-06-07介绍的详细的
- icylove92015-10-20对于delphi的学习有帮助,多谢分享。
- WALL-EC2014-09-12恩,还行,有所收获
护士长
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 202304910142原道明(1).pbix
- 基于Lua的聊天过滤修改版设计源码
- Uibot6.0 (RPA财务机器人师资培训第5天 ) 报销汇总机器人案例实战
- 基于Vue的西安美食攻略应用程序设计源码
- tensorflow-2.6.2-cp38-cp38-win-amd64.whl
- 2023-04-06-项目笔记 - 第八十六阶段 - 4.4.2.84全局变量的作用域-84 -2024.03.28
- 基于C语言解决九宫重排问题(源码+剖析)
- 考研分数计算神器(通过考研分数计算规则制作出来的计算工具,结果精准,操作简单,并且还可以与第二个人进行比较)
- 脚本监控重要文件,并邮箱报警
- 九宫重排介绍.zip说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功