2024年2月20日发(作者:)

tdataset介绍

2009-03-20 8:14

tdataset

tdataset是所有数据集的虚拟类,不能直接创建它的实例,也不能直接访问它的特性和方法,因为这些特性

和方法大多是虚拟的或抽象的。从功能上分,Tdataset的成员可以分为这么几大块:打开和关闭数据集、浏

览记录、编辑数据、书签管理、访问字段、记录缓冲区管理、过滤、事件。

tdataset的常用的特性和方法。

1、active特性

声明:property active:boolean;

通过active特性来判断数据集是否打开。

2、autocalcfields特性

声明:property autocalcfields:boolean;

当程序从数据集中检索记录时,将触发oncalcfields事件。如果autocalcfields特性设为true,当非计算字

段的值被更新时,也将触发这个事件。

注意:如果autocalcfields设为true,在处理oncalcfields事件的句柄中不能再修改数据集,否则,将老是

触发这个事件,从而导致无限循环。

3、BOF特性

声明:property bof:boolean;

如果当前记录是数据集的第一条记录,则这个只读的特性将返回true.当程序第一次打开一个数据集或者调

用first()方法后,当前记录就是第一条记录。

4、bookmark特性

声明:property bookmark:tbookmarkstr;

书签用于保存数据集中某个记录的位置,这样,就可以方便地回到书签所标记的地方。如果读这个特性的,

返回当前记录的书签(如果有的话)。也可以写这个特性来指定一个已有的书签,使书签标记的记录成为当

前记录。

5、canmodify特性

声明:property canmodify:boolean;

如果这个只读的特性返回false,表示数据集的只读的,不能修改。不过,即使canmodify特性返回true,也并

不意味着数据集一定能修改。

6、constraints特性

声明:property constraints:tcheckconstraints;

这个特性用于给数据集建立纠错规则(仅限于记录级)。在运行期,可以通过tcheckconstraints对象和

tcheckconstraints对象来操纵每一个纠错规则。

7、datasetfield特性

声明:property datasetfield:tdatasetfield;

这个特性是一个tdatasetfield对象,它代表一个嵌套的数据集。

8、EOF特性

声明:property eof:boolean;

如果当前记录是数据集的最后一条记录,则这个只读的特性将返回true.当程序打开一个空的数据集或者调

用了last()方法后,当前记录就是最后一条记录。

9、fieldcount特性

这个只读的特性返回数据集中的字段数。由于数据庥中可能包含动态生成的字段,因此,这个特性返回的字

段数与物理字段数可能不同。

10、fieldlist特性

声明:property fieldlist:tfieldlist;

通过这个特性可以访问一个数据集中所有字段的名称。

11、fields特性

通过这个特性,可以访问数据集中每一个字段(tfield对象),序号从0开始。

12、fieldvalues特性

声明:property fieldvalues[const fieldname:string]:variant;default;

通过这个特性,可以按字段名来访问字段的值。fieldvalues特性的数据类型是variant.它可以表达任何类

型的值,因此不需要诸如asstring、asinteger来转换字段的值。

13、filtered特性

声明:property filtered:boolean;

在很多情况下、程序往往只关心数据集中的部分记录,这就需要把满足特定条件的记录过滤出来,要过滤记

录,有两种方式:1.调用locate()来寻找匹配的记录。2.把filtered特性设为true,并且通过filter特性来

指定一个过滤条件,这样,数据集中的指针在移动时,就会触发onfilterrecord事件。通过accept参数可以

控制是否过滤某记录。要取消过滤,可以把filtered特性设为false,这样,onfilterrecord事件不再触发。

不过,要显示所有的记录,必须调用refresh().

14、filter特性。这个特性用于设置过滤条件,实际上是一个字符串,其格式类似于sql,select语句中的

where部分。过滤条件中可以含有比较运算符,诸如<,>,>=,<=,=,<>等,如果字段的名称本身含有空格,要

用一对方括号把字段名括起来。例如:[home state]='ca' or [home state]='ma'

15、filteroptions特性,这个特性用于设置过滤选项。tfilteroptions是一个集合,可以包含下列元素:

focaseinsensitive:大小写不敏感;

fonopartialcompare:对于字符串类型的字段必须全字匹配。

16、recordcount特性

声明:property recordcount:longint;

这个只读的特性返回数据集的记录数。注意:如果对数据集进行了过滤或设置范围,则recordcount特性返

回的记录数与物理记录数可能不同,不过,对于dbase表来说,recordcount特性总返回物理记录数。

17、state特性。这个只读的特性返回数据集当前的状态,可以是以下值:

dsinactive:数据集已关闭,不能访问;

dsbrowse:数据集处于活动状态,能够浏览它的数据但不能编辑;

dsedit:数据集处于活动状态,能够编辑;

dsinsert:数据集处于活动状态,能够插入记录;

dssetkey:数据集处于活动状态,正在调用setrange;

dscalcfield:数据集处于活动状态,正在处理oncalcfields事件;

dsfilter:数据集处于活动状态,正在处理onfilterrecord事件.

18、append过程.这个过程将在数据集的末尾添加一条新的记录。只有当数据集允许修改时,才能调用

append().因此,在调用append()之前,一定要先访问canmodify特性。

19、appendrecord过程

声明:procedure appendrecord(const values:array of const);

这个过程类似于append(),它也能够在数据休的末尾添加一条记录,不同的是,appendrecord()需要传递一

个values参数,这是一个数组,用来设置记录的值。要注意,元素的顺序、个数、数据类型都必须与字段一

致。

20、bookmarkvalid函数

声明:function bookmarkvalid(bookmark:tbookmark):boolean;

如果bookmark参数指定的书签是合法的,这个函数就返回true.

21、cancel过程。在调用post()之前,要取消所作的修改,可以调用cancel().

这样,数据集的回到

dsbrowse状态。

22、clearfields过程。这个过程将把当前记录的所有字段值清空,这样,有可能导致计算字段被更新,并

触发与数据集关联的tdatasource元件的ondatachange事件。注意:如果数据集不处于dsinsert或dsedit状

态,调用clearfields()将触发异常。

23、close过程。这个过程用于关闭数据集,使它处于inactive状态,相当于把active特性设为false。在修

改数据集的其它特性前,一定要先调用close()来关闭数据集。

24、controlsdisabled函数。如果这个函数返回true,表示数据集与数据源暂时断开了连接。这是,即使数

据集的数据发生变化,数据感知控件也不会刷新。

25、delete过程。这个过程用于删除当前记录。这样,下一条记录就变成当前记录。如果删除的是最后一条

记录,则前一条记录变成当前记录。

26、disablecontrols过程。这个过程用于临时断开数据集与数据源的连接。这样,即使数据集发生变化,

关联的数据感知控件也不会随着刷新。当需要连续多次在记录之间移动时,最好调用disablecontrols()来

暂时断开与数据感知控件的连接,这样可以避免数据感知控件老是在不必要地刷新数据。

27、enablecontrols函数。这个过程用于恢复数据集与数据源的连接。调用disablecontrols()将使一个内

部的计数加1,调用enablecontrols()将使这个计数减1。当计数减到0的时候,就恢复与数据源的连接。也就

是说,调用了几次disablecontrols(),就要调用几次enablecontrols().

28、edit过程。这个过程使数据集进入编辑状态。只有在编辑状态下才能修改数据。

29、fieldbyname函数

声明:function fieldbyname(const fieldname:string):tfield;

这个函数通过字段名来访问当前记录的某个字段(tfield对象)。根据字段名来访问比用序号来访问字段要安

全些,因为序号很容易记错,也可能动态改变。不过,当根据名称来访问字段时,

如果指定的字段不存在,

将触发异常。因此,如果不能确定数据集中是否有这个字段,最好调用findfield()来访问字段。

30、first过程。这个过程使过滤范围内的第一条记录变成当前记录。如果当前有未决的记录,将首先调用

post().如果没有设置过滤范围,这个函数将返回表的第一条记录。

31、freebookmark过程

声明:procedure freebookmark(bookmark:tbookmark);

书签也是系统资源,用完后应当及时释放。

32、getbookmark函数

声明:function getbookmark:tbookmark;

这个函数创建一个书签来标记当前记录,以后可以通过gotobookmark()来回到这个记录。如果数据集是空的

,或者不处于dsbrowse状态,这个函数将返回nil。注意:当数据集关闭或索引发生变化时,书签将无效。

33、getcurrentrecord函数

声明:function getcurrentrecord(buffer:pchar):boolean;

这个函数把当前记录方到buffer参数指定的缓冲区,缓冲区的大小应不小于recordsize特性的值。如果调用

成功,这个函数将返回true。

34、getdetaildatasets过程

声明:procedure getdetaildatasets(list:tlist);

要表达master/detail关系,可以用游标来链接,也可以用嵌套数据集。getdetaildatasets()能够把当前记

录的所有detail数据集放到一个列表中。

35、getfieldnames过程

声明:procedure getfieldnames(list:tstrings);

这个过程把数据集中的所有字段的名称放到一个列表中。

36、gotobookmark过程

声明:procedure gotobookmark(bookmark:tbookmark);

这个过程使bookmark参数指定的书签所标记的记录重新成为当前记录。

37、insert过程。这个过程类似于append()。不同的是,insert把新记录插在当前位置,而不是末尾。

38、insertrecord过程

声明:procedure insertrecord(const values:array of const);

这个过程类似于appendrecord()。不同的是,insertrecord()把新记录插在当前位置,而不是数据集的末尾

39、isempty函数。如果数据集是空的,一条记录都没有,这个函数将返回true.

40、last过程。这个过程使过滤范围内的最后一条记录变成当前记录。

41、locate函数

声明:function locate (const keyfields:string;const

keyvalues:variant;options:tlocateoptions):boolean;virtual;

这个函数在数据集中搜索符合条件的记录。如果找到,就把找到的记录作为当前记录。keyfields参数是一

个字符串,用于指定要搜索的字段名,字段与字段之间用分号隔开;keyvalues参数用于指定字段的值;

options参数用于设置搜索选项。

42、lookup函数

声明:function lookup(const keyfields:string;const keyvalues:variant;

const

resultfields:string):variant;

这个函数类似于locate(),用于从数据集中搜索符合特定条件的记录。其中,keyfields参数是一个字符串,

用于指定要搜索的字段名,字段与字段之间用分号隔开;keyvalues参数用于指定这些字段的值;如果找到

匹配的记录,这个函数将返回resultfields参数所指定的字段的值。

43、moveby函数

声明:function moveby(distance:integer):integer;

这个函数用于改变游标,即当前记录的位置。distance参数指定了相对于当前记录的距离。例如,moveby

(-2)将使前面第二条记录变成当前记录;moveby(3)将使后面第三条记录变成当前记录。如果数据集处于

dsinsert或dsedit状态,moveby()将首先调用post().

44、next过程。这个过程使过滤范围内的下一条记录变成当前记录。

45、OPEN过程。这个过程将打开数据集,使它处于dsbrowse状态,相当于把active特性设为true。

46、post过程。这个过程将把修改了的记录写到数据库中。如果数据集处于dsedit或dsinsert状态,则保持

原来的状态不变。如果数据集处于dssetkey状态,则返回到dsbrowse状态。有的操作相当于调用post().例

如,当用户把输入焦点从当前记录上移走时,或者调用next()、moveby()、prior()、first()、last()时,

则隐含调用了post()。

47、prior过程。这个过程使过滤范围内的前一条记录变成当前记录。

48、refresh过程

数据库是一直在变化的,因为它不断地被添加、删除或修改记录,尤其是在一个网络环境中。为了获得最新

的数据,可以调用refresh()。refresh()相当于先调用close()来关闭数据集再调用open()来打开数据集,

但直接调用refresh()要快一些。

49、setfields过程

声明:procedure setfields(const values:array of const);

这个过程用values参数指定的值来对当前记录的字段赋值。如果数组的元素个数比字段个数少,则多余字段

的值将为NULL。要使某个字段的值不变,可以用NULL区赋值。在调用这个过程之前,先要调用EDIT()来使数

据集处于dsedit状态。在调用这个过程后,还要调用post()把修改后的记录写到数据库中。

Tdataset的事件很大一部分是在一个过程的之前之后成对出现的,比如aftercancel和beforecancel事件,

afterclose和beforeclose事件,由于它们意义很明确,一目了然,我们就不一一列举,仅以aftercancel和

beforecancel事件为例,其他以此类推。

50、aftercancel事件

声明:property aftercancel:tdatasetnotifyevent;

其中,tdatasetnotifyevent是这样声明的:tdatasetnotifyevent=procedure(dataset:tdataset) of

object;

调用cancel()从而使所做的修改被取消后,将触发这个事件。如果数据集当前不处于dsedit状态或者没有未

决的修改,则不会触发这个事件。

51、oncalcfields事件

声明:property oncalcfields:tdatasetnotifyevent;

当"计算字段"的值被重新计算时,将触发这个事件。如果autocalcfields特性设为true,当非计算字段的值

发生变化时,也能触发这个事件。这个事件发生后,数据集处于dscalcfields状态。这时,不能修改任何非

计算字段的值,但可以修改"计算字段"的值。这个事件可能频繁发生。因此,处

理这个事件的句柄应当尽可

能简单,尤其是不能在事件句柄中修改非计算字段的值,否则,将导致无限循环。

52、ondeleteerror事件

声明:property ondeleteerror:tdataseterrorevent;

其中,tdataseterrorevent是这样声明的:tdataseterrorevent=procedure

(dataset:tdataset;E:edatabaseerror; var action:tdataaction) of object;

当试图删除一条记录但出现异常时,将触发这个事件。E参数是一个异常对象,包含了有关错误信息;

action参数用于表明如何处理这个错误,设为dafail表示放弃删除并显示错误信息,设为daabort表示放弃

删除但不显示错误信息,设为daretry表示重试一遍。

53、onediterror事件。当试图编辑记录但出现异常时,将出发这个事件。这通常是因为不能独占这个记录

54、onfilterrecord事件

声明:property onfilterrecord:tfilterrecordevent;

其中,tfilterrecordevent是这声明的:tfilterrecordevent=procedure(dataset:tdataset;var

accept:boolean) of object;

如果filtered特性设为true,数据集中的每条记录都将触发一次onfilterrecord事件,让您有机会决定是否

要过滤该记录。通过dataset参数可以访问要被过滤的数据集;通过accept参数可以决定是否要过滤记录。

55、onnewrecord事件

声明:property onnewrecord:tdatasetnotifyevent;

当数据集中增加了一条新记录时,将触发这个事件。这样,就有机会给新记录的每个字段赋值。这个事件发

生的时间介于beforeinsert事件和afterinsert事件之间。

56、onposterror事件

当试图把所作的修改写到数据库中但出现异常时,将触发这个事件。这可能是因为记录违反了主索引的定义