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


发布评论