搜档网
当前位置:搜档网 › Delphi数据集介绍

Delphi数据集介绍

Delphi数据集介绍
Delphi数据集介绍

第六章什么是数据集

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

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 (CustT able.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,它将取消当前正在进行的编辑、插入、搜索等操作,使数据集回到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状态。在此状态下,不允许修改数据集的记录,否则,过滤就无法正确执行。

当OnFilterRecord事件处理完毕,数据集就回到dsBrowse状态。

6.2.9 dsNewValue、dsOldValue或dsCurValue

在允许缓存更新的情况下,当用户修改数据集的记录时,数据集有可能会进入

dsNewValue、dsOldValue或dsCurValue状态。在这三种状态下,可以通过字段(TField)的NewValue、OldValue或CurValue属性来访问当时的值。

上述三个状态是由Delphi 4内部使用的,应用程序无法主动进入上述三种状态。

6.3 浏览记录

每个活动的数据集都有一个指针,指向当前记录。很多对数据集的操作都是针对当前记录,许多数据控件也只显示当前记录的数据,因此,在数据库应用程序中知道当前记录的位置是非常重要的。

数据库应用程序往往要改变当前记录的位置,这时候就要用到下面这些方法:

.First使第一条记录成为当前记录;

.Last使最后一条记录成为当前记录;

.Next使下一条记录成为当前记录;

.Prior使前一条记录成为当前记录;

.MoveBy使距离当前记录若干行的记录成为当前记录。

此外,Delphi 4中有一个TDBNavigator构件,专门用来浏览记录,它把上述方法用按钮来实现。

除了上述方法外,TDataSet中还有两个只读的布尔类型的属性用来判断当前记录的位置,一个是Bof,如果这个属性返回True,表示现在已到了数据集的开始位置。另一个是Eof,如果这个属性返回True,表示现在已到了数据集的末尾。

6.3.1 First和Last

调用First函数能够使数据集的第一条记录成为当前记录,并且把Bof属性设为True。如果第一条记录已经是当前记录了,First就什么也不干。程序示例如下:CustTable.First;

调用Last函数能够使数据集的最后一条记录成为当前记录,并且把Eof属性设为True。如果最后一条记录已经是当前记录,Last就什么也不干。程序示例如下:https://www.sodocs.net/doc/8318077127.html,st;

用TDBNavigator构件实现的导航器上有两个按钮,分别对应着First和Last。

6.3.2 Next和Prior

调用Next函数能够使下一条记录成为当前记录。如果当前记录已经是数据集的最后一条记录,Next就什么也不干。程序示例如下:

CustTable.Next;

调用Prior能够使前一条记录成为当前记录。如果当前记录已经是数据集的第一条记录,Prior就什么也不干。程序示例如下:

CustTable.Prior;

6.3.3 MoveBy

调用MoveBy函数使数据集中的另一条记录成为当前记录,该记录距原先的当前记录若干行。MoveBy需要传递一个参数,指定相隔的行数,正数表示向记录编号增大的方向移动,负数表示向记录编号减小的方向移动。程序示例如下:

CustTable.MoveBy(-2);

MoveBy返回实际移动的行数,返回值与传递给MoveBy的参数有可能不同。

注意:在多用户环境下,其他用户有可能正在修改、插入或删除记录,这样,一条记录原来距当前记录是5行,现在有可能变为4行和6行,甚至该记录都不存在了,因为其他用户修改该记录的数据或删除了该记录。

6.3.4 Eof和Bof属性

TDataSet有两个只读的属性Eof和Bof,分别用于判断是否到了数据集的末尾和开头。

在遍历数据集的所有记录时经常要用到这两个属性。

如果Eof属性返回True,表示现在已到了数据集的末尾。

进行下列操作时会把Eof属性设为True:

.打开一个空的数据集;

.调用了Last;

.调用了Next,而现在已经在数据集的最后一条记录;

.调用了SetRange,而范围是无效的。

除了上述情况外,Eof属性都将返回False。

Eof属性通常用在一个循环中,每调用一次Next就要判断一下Eof属性,以避免对不存在的记录进行操作。程序示例如下:

CustTable.DisableControls;

Try

CustTable.First;

While not CustTable.EOF Do

Begin

...

CustTable.Next;

End;

Finally

CustTable.EnableControls;

End;

上述代码同时演示了在遍历数据集的所有记录时怎样暂时禁止数据控件跟着刷新。在遍历数据集的所有记录前应当调用DisableControls禁止刷新,这样能够加快遍历的速度,因为刷新也是要花时间的。遍历结束后,应当调用EnableControls恢复刷新。

EnableControls最好在Try...Finally结构的Finally部分调用,这样能保证即使在遍历时出现异常,也能保证刷新能得到恢复。

如果Bof属性返回True,表示现在已到了数据集的开头。

进行下列操作时会把Bof属性设为True:

.打开一个非空的数据集;

.调用了First;

.调用了Prior,而现在已经在数据集的第一条记录。

除了上述情况外,Bof属性都将返回False。与Eof属性一样,Bof属性通常用在一个循环中,每调用一次Prior就要判断一下Bof属性,以避免对不存在的记录进行操作。程序示例如下:

CustTable.DisableControls;

Try

While not CustTable.BOF Do

Begin

...

CustTable.Prior;

End;

Finally

CustTable.EnableControls;

End;

6.4 书签

书签的作用是在数据集的某个位置做一个标记,以后可以快速方便地回到那个位置。TDataSet中提供了若干个属性和方法用于管理书签。

如果读Bookmark属性,返回当前记录的书签。如果写Bookmark属性,它能使一个指定的书签成为当前书签。

TDataSet中有关书签的几个函数都是虚拟的,TDataSet的派生类TBDEDataSet重新定义了这些方法,包括:

.BookmarkValid判断某个书签是否合法;

.CompareBookmarks比较两个书签是否相同;

.GetBookmark创建一个书签来标记当前记录;

.GotoBookmark回到用GetBookmark标记的位置;

.FreeBookmark删除一个书签。

要创建一个书签,首先要声明一个TBookmark类型的变量,然后调用GetBookmark 函数创建一个标记当前记录的书签。TBookmark类型的变量实际上是一个无类型的指针。

在调用GotoBookmark之前,最好先调用BookmarkValid判断书签是否合法,因为书签标记的记录有可能已删掉。如果BookmarkValid返回True,说明书签是合法的,可以调用GotoBookmark跳转到书签标记的位置。

可以调用CompareBookmarks比较两个书签是否相同,如果两个书签不同,这个函数就返回1。如果两个书签相同或者都是NIL,这个函数就返回0。

GotoBookmark需要传递一个参数,即书签。

FreeBookmark用于删除一个书签。当一个书签已用不到时,应当及时删除它,因为书签也是一种资源。

下面这段代码演示了书签的用法:

Procedure DoSomething (const Tbl: TT able)varBookmark: TBookmark;

Begin

Bookmark := Tbl.GetBookmark;

Tbl.DisableControls;

Try

Tbl.First;

While not Tbl.EOF Do

Begin

...

Tbl.Next;

End;

Finally

Tbl.GotoBookmark(Bookmark);

Tbl.EnableControls;

Tbl.FreeBookmark(Bookmark);

End;

End;

6.5 搜索特定的记录

可以调用Locate和Lookup函数在数据集中搜索特定的记录。

Locate用于在数据集中定位一条特定的记录,并使该记录成为当前记录。Locate需要传递三个参数,第一个是KeyFields参数,用于指定要按哪些字段搜索,第二个是KeyValues

参数,用于指定每个字段相应的值,第三个是Options参数,用于设置搜索选项。

下面这个例子搜索Company字段的值为“Professional Ltd.”的记录:

var

LocateSuccess: Boolean;

SearchOptions: TLocateOptions;

Begin

SearchOptions := [loPartialKey];

LocateSuccess := CustT able.Locate(Company, Professional Ltd.,SearchOptions);

End;

如果Locate找到了一条符合条件的记录,就把该记录变为当前记录,并返回True。如果Locate没有找到匹配的记录,就返回False。

对于Locate来说,KeyFields参数指定的字段越多,搜索的条件就越精确。如果KeyFields参数需要指定多个字段,彼此之间要用分号分开。由于字段的数据类型可能各不相同,因此,KeyValues是一个Variant类型的参数。如果KeyFields参数指定了多个字段,KeyValues参数必须是一个可变类型的数组。程序示例如下:

With CustTable Do

Locate(Company;Contact;Phone, VarArrayOf([Sight Diver,P]), loPartialKey);

Lookup与Locate非常相似,也是在数据集中搜索特定的记录。不同的是,如果找到匹配的记录,Lookup能返回该记录中若干个字段的值。

Lookup需要传递三个参数,第一个是KeyFields参数,用于指定要按哪些字段搜索,第二个是KeyValues参数,用于指定每个字段相应的值,第三个是ResultFields参数,用于指定要返回哪些字段的值。

下面这个例子在CustTable中搜索Company字段的值为“Professional Ltd.”的记录,并返回Company、Contact、Phone等字段的值:

var

LookupResults: Variant;

Begin

With CustTable Do

LookupResults := Lookup(Company, Professional Divers, Ltd., Company;Contact; Phone); End;

如果ResultFields参数指定了多个字段,Lookup返回一个可变类型的数组。如果没有找到匹配的记录,Lookup将返回一个空的数组。程序示例如下:

var

LookupResults: Variant;

Begin

With CustTable Do

LookupResults := Lookup(Company; City, VarArrayOf([Sight Diver,

Christiansted]), Company; Addr1; Addr2; State; Zip);

End;

6.6 过滤

一个应用程序往往只对数据集的部分记录感兴趣,例如,可能只对一个客户表中来自广东的客户感兴趣。这种情况下,可以用过滤技术把符合特定条件的记录过滤出来。

不过,对于一个字段很多的数据集来说,最好还是使用查询。

6.6.1 允许过滤

要对数据集进行过滤,首先要指定过滤条件,并设置FilterOptions属性设置有关选项(可选),然后把Filtered属性设为True。以后如果不想进行过滤,只要把Filtered属性设为False。

要指定过滤条件有两种方式:一是设置Filter属性,二是在处理OnFilterRecord事件的句柄中给出过滤条件。

Filter属性适合于在运行期使用,它能够动态地指定过滤条件,能够根据需要改变过滤条件。不过,Filter属性是一个字符串,过滤条件相对比较简单。虽然可以用运算符构成复合的条件表达式,但只限于几个常见的运算符。更主要的是,用Filter属性指定的表达式中只能出现数据集中已有的字段名和常量,不能出现其他数据。

而OnFilterRecord事件则灵活得多,它能够在设计期就指定好过滤条件。而在处理OnFilterRecord事件的句柄中,可以任意指定过滤条件,过滤条件可以很复杂。

6.6.2 Filter属性

Filter属性是一个字符串,可以这样设置Filter属性:

Dataset1.Filter := State = CA;

也可以这样设置Filter属性:

Dataset1.Filter := Edit1.T ext;

上面这行代码允许让用户自己输入过滤条件。甚至还可以把上述两行代码结合起来:Dataset1.Filter := State = + Edit1.Text;

设置了过滤条件后,只要把Filtered属性设为True,过滤即有效。

可以用比较和逻辑运算符构造复合的过滤条件,这些运算符包括:

. <小于;

. >大于;

. >=大于等于;

. <=小于等于;

.=等于;

. <>不等于;

.AND两边的表达式都必须为True;

.NOT表达式不能为True;

.OR两个表达式只要有一个为True。

下面这个例子用AND运算符限制CustNo字段必须大于1400且小于1500:

(CustNo > 1400) AND (CustNo < 1500);

注意:在Filtered属性设为True的情况下,用户修改、插入的记录有可能不符合过滤的条件,这时候,会拒绝接受与过滤条件矛盾的记录。

6.6.3 OnFilterRecord事件

在Filtered属性设为True的情况下,数据集中的每条记录都会触发OnFilterRecord事件,这样,就有机会决定是否要把记录过滤。

处理OnFilterRecord事件的句柄中有一个布尔类型的Accept参数,把这个参数设为True表示接受此记录,把这个参数设为False表示把此记录过滤掉。程序示例如下:Procedure TForm1.Table1FilterRecord(DataSet: TDataSet;

var Accept: Boolean);

Begin

Accept := DataSet[State] = CA;

End;

上面这个例子的意思是,只有State字段的值为CA的记录才被接受。

注意:由于数据集的每条记录都会触发OnFilterRecord事件,因此,处理OnFilterRecord

事件的代码要尽可能地简短,尤其是对一个有很多条记录的大型数据集。

有时候,程序需要按多种不同的过滤条件进行过滤,可以建立多个处理OnFilterRecord 事件的句柄,然后在运行期动态地切换事件句柄,程序示例如下:

DataSet1.OnFilterRecord := NewYorkFilter;Refresh;

6.6.4 设置过滤选项

FilterOptions属性用于设置过滤的选项。这个属性是一个集合,可以是空集(默认),也可以包含下列元素:

.foCaseInsensitive比较字符串时忽略大小写;

.foPartialCompare对于字符串类型的字段必须全字匹配,不允许部分匹配。

例如,为了在比较State字段时忽略大小写,可以这样设置:

FilterOptions := [foCaseInsensitive];

Filter := State = CA;

6.6.5 在过滤后的数据集中浏览记录

过滤后的数据集实际上是原来的数据集的一个子集。TDataSet提供了四个方法用于在过滤后的数据集中浏览记录,它们是:

.FindFirst使过滤后的数据集中的第一条记录成为当前记录;

.FindLast使过滤后的数据集中的最后一条记录成为当前记录;

.FindNext使过滤后的数据集中的下一条记录成为当前记录;

.FindPrior使过滤后的数据集中的前一条记录成为当前记录。

上述四个方法如果调用成功,就返回True,否则,就返回False。可以检查一个只读的Found属性,看看上次调用是否成功。

如果通过Filter属性或OnFilterRecord事件设置了过滤条件,而Filtered属性设为False,调用上述四个方法时会自动暂时允许过滤,然后移动当前记录的位置,最后又禁止过滤。换句话说,上述四个方法可以不理会Filtered属性是怎样设置的。

如果没有设置过滤条件,上述四个方法即相当于First、Last、Next和Prior。

6.7 修改数据

TDataSet中提供了一些方法用于在数据集中更新、插入和删除记录,它们是:

.Edit使数据集进入dsEdit状态;

.Append在数据集的末尾添加一条记录;

.Insert在数据集的当前位置插入一条记录;

.Post试图把用户对数据的修改写到数据集中;

.Cancel取消用户对数据的修改,使数据集回到dsBrowse状态;

.Delete删除当前记录。

6.7.1 进入dsEdit状态

要编辑数据集的记录,首先要进入dsEdit状态。要进入dsEdit状态,调用Edit函数。不过,调用Edit不一定会使数据集进入dsEdit状态,还取决于CanModify属性的值。

一旦数据集进入了dsEdit状态,用户就可以在数据控件上修改当前记录的值。当用户把输入焦点从当前记录上移走,即相当于调用了Post函数。程序示例如下:

With CustTable Do

Begin

Edit;

FieldValues[CustNo] := 1234;

Post;

End;

要取消当前未决的修改,用户可以按ESC键或单击用TDBNavigator构件实现的导航器上的Cancel按钮。

在使用缓存更新技术(CachedUpdates属性设为True)的情况下,调用Post只是把数据写到缓存中,而不是直接写到数据集中。要把缓存中的数据写到数据集中,需调用ApplyUpdates函数。

6.7.2 插入新的记录

要在数据集中插入新的记录,首先要进入dsInsert状态。要进入dsInsert状态,可以调用Insert或Append函数。不过,调用Insert或Append不一定会使数据集进入dsInsert 状态,还取决于CanModify属性的值。

一旦进入了dsInsert状态,用户就可以在数据控件(一般是TDBGrid)中插入一条新的记录,并给这条记录输入数据。

如果要通过编程来插入新的记录,就要注意Insert和Append的区别。Insert将把一条新的记录插入到当前记录的前面,而Append将把一条新的记录添加到数据集的末尾。

插入了新的记录后,应当调用Post或在CachedUpdates属性设为True的情况下调用ApplyUpdates把新的记录写到数据集中。

如果数据集是已建立了索引的Paradox或dBASE表,新记录将自动移到恰当的位置。

如果数据集没有建立索引,新记录就插入到数据集的当前位置(Insert)或末尾(Append)。

6.7.3 删除记录

调用Delete函数将删除当前记录,并且使数据集回到dsBrowse状态。如果窗体上有TDBNavigator构件的话,用户可以单击导航器上的“Delete”按钮删除当前记录。当前记录被删除后,下一条记录就成为当前记录。

如果删除的本来就是最后一条记录,则前一条记录成为当前记录。

6.7.4 修改整条记录

除了TDBGrid和TDBNavigator外,大部分数据控件只能工作于数据集的一个或几个字段,而不是整条记录。

不过,TDataSet提供了若干个方法可以直接修改整条记录而不是单独的字段,这些方法包括:

.AppendRecord类似于Append,但可以给字段赋值,不需要调用Post;

.InsertRecord类似于Insert,但可以给字段赋值,不需要调用Post;

.SetFields对当前记录的字段赋值,需要显式地调用Post。

上述三个方法都要传递一个TVarRec类型的数组作为参数,该数组的每一个元素对应着一个字段的值。如果数组的元素个数小于数据集的字段个数,剩下字段的值就是NULL。

对于没有建立索引的数据集来说,AppendRecord把一条新的记录加到数据集的末尾。对于已建立索引的数据集来说,新记录将自动移到一个恰当的位置。

SetFields用于对当前记录的字段赋值。在调用SetFields之前,首先要调用Edit,使数据集进入dsEdit状态。调用了SetFields后,需要显式地调用Post函数。

调用SetFields时,如果您只想对部分字段赋值,让其他字段的值保持不变,可以用NULL或NIL去赋值。

假设一个数据集中有五个字段,分别是Name、Capital、Continent、Area和Population,可以这样对它们赋值:

CountryTable.InsertRecord([Japan, T okyo, Asia]);

上述程序在数据集中插入了一条新的记录,并且对前三个字段赋了值。现在可以再次对当前记录赋值,不过,这次只想对Area字段和Population字段赋值,程序就要这样写:With CountryTable Do

Begin

If Locate(Name, Japan, loCaseInsensitive) then

Begin

Edit;

SetFields(NIL, NIL, NIL, 344567, 164700000);

Post;

End;

End;

注意:此处要用NIL而不是NULL,否则,前三个字段会被设为空。

6.8 事件

TDataSet的事件主要分为两大类,一类是Before系列,另一类是After系列,列表如下:

.BeforeOpen,AfterOpen发生在数据集打开前后;

.BeforeClose,AfterClose发生在数据集关闭前后;

.BeforeInsert,AfterInsert发生在插入了一条新的记录前后;

.BeforeEdit,AfterEdit 发生在进入dsEdit状态前后;

.BeforePost,AfterPost 发生在写数据集的前后;

.BeforeCancel,AfterCancel发生在取消修改的前后;

.BeforeDelete,AfterDelete发生在删除记录的前后。

此外,当数据集中增加了一条新的记录时就会触发OnNewRecord事件,当“计算字段”的值需要重算时将触发OnCalcFields事件。

Before系列的事件常常用来中止操作。例如,当调用Delete函数试图删除当前记录时,在当前记录将要删除前会触发BeforeDelete事件,可以在处理BeforeDelete事件的句柄中调用Abort或触发一个异常放弃删除当前记录,程序示例如下:

Pocedure TForm1.TableBeforeDelete (Dataset: TDataset)

Begin

If MessageDlg(Delete This Record?, mtConfirmation, mbYesNoCancel, 0) <> mrYes Then Abort;

End;

After系列的事件往往用来在状态栏上通知用户,程序示例如下:

Procedure TForm1.Table1AfterDelete(DataSet: TDataSet);

Begin

StatusBar1.SimpleText := Format(有%d 条记录,[DataSet.RecordCount]);

End;

OnCalcFields事件主要用于给出“计算字段”的值。AutoCalcFields属性的值决定了什么时候会发生OnCalcFields事件。

如果AutoCalcFields属性设为True,下列情况下会发生OnCalcFields事件:

.数据集被打开时;

.在数据控件中,输入焦点从一条记录移到另一条记录;

.在数据控件中,输入焦点从一个字段移到另一个字段;

.当前记录被修改或从数据库中检索了一条记录。

不过,即使AutoCalcFields属性设为False,当数据集中的任意一个非计算字段的值发生变化时都会触发OnCalcFields事件。

由于OnCalcFields事件有可能是频繁发生的,因此,处理OnCalcFields 事件的代码

要尽可能地简短。在AutoCalcFields属性设为True的情况下,在处理OnCalcFields事件的句柄中不能修改数据集的数据,因为一旦当前记录被修改,又要触发OnCalcFields事件,从而导致无限循环。例如,假设您在处理OnCalcFields事件的句柄中调用了Post,就会触发OnCalcFields事件,导致再次调用Post,再次触发OnCalcFields事件……

6.9 TBDEDataSet

TBDEDataSet是从TDataSet继承下来的,它提供了通过BDE(BorlandDatabase Engine)访问数据的能力。这一节主要介绍TBDEDataSet,读者应当对前面介绍的TDataSet 已经有了比较深刻的认识。

与TDataSet一样,TBDEDataSet也是虚拟的和抽象的,除非您想建立自定义的数据集,否则,一般不需要直接用到TBDEDataSet。

TBDEDataSet重载了TDataSet中涉及记录导航、索引和书签的方法,增加了一些处理BLOB字段、缓存更新的属性、方法和事件。

6.9.1 CacheBlobs属性

TBDEDataSet的CacheBlobs属性用于控制BDE是否把BLOB字段的内容放到缓存中。如果这个属性设为True,当应用程序读取BLOB字段的值时,BDE将把BLOB字段的内容放在缓存中,这样,当应用程序下次要读取这个字段的值时,就不必再从数据库服务器那儿去检索,只要直接从内存中取过来就行了,这样可以提高应用程序的性能。

不过,如果应用程序需要频繁地更新BLOB字段的值,这时候反而应当把CacheBlobs 属性设为False,这样能保证检索到的BLOB字段的值总是最新的。

6.9.2 缓存更新

TBDEDataSet提供了缓存更新的技术。所谓缓存更新就是,应用程序从数据库中检索数据,在本地缓存中建立一个副本,用户对数据进行修改后,也只是反映在缓存中,以后可以调用ApplyUpdates一次性地把所有的修改反映到数据集中。

可以看出,缓存更新技术可以明显地提高应用程序的性能,而且可以方便地取消修改,只要还没有调用ApplyUpdates。下面列出了TBDEDataSet中有关缓存更新的属性、方法和事件:

.CachedUpdates如果这个属性设为True,缓存更新有效;

.UpdateObject用于指定一个TUpdateSQL构件来更新基于查询的数据集;

.UpdatePending如果缓存中有未决的记录,这个属性就返回True;

.UpdateRecordTypes指定数据集中哪些记录是可见的;

.UpdateStatus返回当前的更新状态;

.OnUpdateError如果更新过程中出错将触发这个事件;

.OnUpdateRecord每更新一条记录就会触发一次这个事件;

.ApplyUpdates把缓存中的数据写到数据集中;

.CancelUpdates把缓存中未决的修改取消;

.CommitUpdates把缓存清掉;l FetchAll从数据库检索所有记录到缓存中;

.RevertRecord撤消对当前记录的修改。

6.10 TDBDataSet

TDBDataSet是从TBDEDataSet继承下来的,它提供了数据库和会话期管理的能力。

TDBDataSet中增加了若干个属性和方法用于管理数据库和BDE会话期,包括:

.CheckOpen检查数据库是否已打开;

.Database返回一个TDatabase构件;

.DBHandle返回一个BDE句柄,调用BDE的API时要用到这个句柄;

.DBLocale返回当前的国际语言驱动程序;

.DBSession返回一个BDE会话期对象;

.DatabaseName用于指定要访问的数据库;

.SessionName用于指定一个BDE会话期对象。

这里详细解释一下DatabaseName属性和SessionName属性。如果应用程序要访问远程数据库服务器如Sybase、Oracle或InterBase,应当用TDatabase构件来连接数据库,此时,应当设置DatabaseName属性指定要连接的数据库,可以设为TDatabase构件的名称。如果没有显式地使用TDatabase构件,DatabaseName属性应当设为BDE 别名。对于Paradox和dBASE表来说,可以设为表的路径。

SessionName属性用于指定一个BDE会话期对象。如果应用程序没有显式地使用TSession构件,不必设置这个属性。如果应用程序显式地使用了多个TSession构件,应当设置SessionName属性指定其中一个。

一般来说,应用程序用不到DBHandle、DBLocale和DBSession等属性,除非要直接调用BDE的API。这三个属性都是只读的。

TDBDataSet中还有一个只读的Provider属性,它能够返回一个IProvider接口。在多层的Client/Server应用程序中,客户程序需要通过IProvider接口与应用服务器通讯。

DELPHI 中WEBBROWSER控件详解实例

Delphi中WebBrowser控件详解实例 2008-10-18下午06:58 很久都没有原创了,前几天帮朋友做了个网址发布程序,主要应用到了WebBrowser控件。今天主要给大家演示一下过程,让大家学习一下Delphi工具。 WebBrowser功能: 1。自动加载网页 2。去除WebBrowser滚动条 3。WebBrowser自身打开页面 4。禁止右键 1。首先,新建一个FROM窗体: 2。加入一个WEBBROWSER控件

3。调整后如下: 4.这样一个webbrowser就完成了,下一步我们来让程序打开后自动加载一个网页。 核心代码:WebBrowser1.Navigate('https://www.sodocs.net/doc/8318077127.html,'); 双击窗体灰色处,对窗体进行初始化,在代码窗口中输入(Begin与End间输入核心代码): procedure TForm1.FormCreate(Sender:TObject); begin WebBrowser1.Navigate('https://www.sodocs.net/doc/8318077127.html,');//窗体初始化完成WEBBROWSER加载一个网页end; 5。下面我们来实现禁止WEBBROWSER控件的滚动条功能:

核心代码:WebBrowser1.oleobject.Document.body.Scroll:=‘no’; 利用这个代码去掉滚动条的前提是webbrowser中必须有打开的网页,也就是在网页加载完完毕后再去掉滚动条。所以首先要判断页面是否加载完毕,如果加载完毕,就执行上面的语句 去掉滚动条。这时就要引入一个按扭控件来触发程序 加入SPEEDBUTTEN 调整形后:

Delphi与各数据库数据类型比较

Delphi与各数据库数据类型比较 Delphi数据类型与各数据库数据类型对比如下表,如有具体说明见表中脚注: Delphi Type Oracle Types SQL Server Types MySQL Types[1] ftSmallint NUMBER(p,0)[2] (p<5) SMALLINT TINYINT(M)(M>1) SMALLINT ftWord-TINYINT TINYINT(M)UNSIGNED(M> 1) SMALLINT UNSIGNED YEAR ftInteger NUMBER(p,0)[2] (4 (4

【VIP专享】delphi 三层架构CS简单例子一步步做

delphi 三层CS架构一步步建立的简单例子 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。 在Delphi中可以使用Socket或者Dcom组件来连接他们相互间的通讯。 本例使用SOCKET组件. DCOM用在局域网, SOCKET用在互联网. 环境为windows xp+ delphi 7 + access2000 创建过程: 1、请用ACCESS2000新建一个数据库database02.mdb. 2、请在delphi7执行file-new- application, 新建一个桌面, 上面放一个label, label.caption =’服务器端已运行….’

3、接下来在delphi7执行file --new--other,选择"Multitier"--"Remote data module"。在跳出来的对话框里面输入名称(任意),例如: AppSqlConn。选择确定,进入remote data module窗口。 界面如下图所示

4、加入组件:adodataset,点击connectionstring属性,点击后面的…,进 入设定连接窗口。在选择数据库中选择自己想要使用的数据库 database02.mdb。一般只要地址正确、用户名和密码无误,肯定可以连接通过。确定。 3、ADODATASET1在commandtext中点击后面的…,啥也不用设定,默认 配置; 4、ADODATASET1将active属性设置为false。

5、再加入组件:datasetprovider。设定其dataset属性为上面的adodataset1。 5.1 接着设置datasetprovider1的属性,poallowcommandtext=true, 其他的参数默认即可. datasetprovider1的属性如下图所示

自动创建数据库(DELPHI+SQL SERVER)

自动创建数据库(DELPHI+SQL SERVER) 转载自小李飞刀 procedure TForm1.Btn_OKClick(Sender: TObject); var sqlconn:string; begin Sqlconn:='Provider=SQLOLEDB.1;'+'password='+Edit_Password.Text +';Persist Security Info=true;User ID='+Edit_Name.Text +';Data Source='+Edit_Server.Text; if Edit_Server.Text=EmptyStr then begin showmessage('请输入SQL服务器的名称或者IP地址!'); Edit_Server.SetFocus; exit; end; if Edit_Name.Text=EmptyStr then begin ShowMessage('请输入登陆数据库的用户名!'); Edit_Name.SetFocus; exit; end; with ADO_Test do begin Close; ConnectionString :=Sqlconn; end; Try Try Ado_Test.LoginPrompt:=false; Ado_Test.Connected:=true; Messagebox(Handle,'连接成功。','提示',MB_OK or MB_ICONINFORMATION); Button2.Click; except Messagebox(Handle,Pchar('连接['+Edit_Server.Text+']失败!'),'警告',MB_OK or MB_ICONWARNING); end; Finally Ado_Test.Connected:=false; end; end; procedure TForm1.Button2Click(Sender: TObject); Var memExec,s:TStringList; I,J:integer; strSql,sqlstr,sqlconnstr:string;

Delphi调用WebService的实例(非常经典)

Delphi 调用webservice 经典实例 Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口 TReomtable: WebService中自定义类都是继承自该类 TSOAPAttachment: Attachment:附件,一种流类型,可以返回流数据 CGI:(EXE) ISAPI:(DLL) Base64编码: uses EncdDecd; s := EncodeString(s); //加 base64 编码 s := DecodeString( str ); //解码 UTF8: UTF8 是8位的UNICODE字符,而ASCII是7位 ,gb2312和unicode是2字节/字,utf8是3字节/字utf8类似以前的8位转7位的编码,是为了在网络间不同系统的通讯方便而作的转换。几乎所有用.Net写的WebService只支持DOC方式、Delphi写的只支持RPC方式;J2ME目前对Web Service的支持仅限于RFC172,而 RFC172要求必须为DOC方式(sun怎么偏袒MS?)! 为了在设计中减少障碍,下面还介绍几个概念。 1) SOAP:SOAP是一种简单有效的数据传输协议,用于分布式网络环境下数据信息交换,它以XML 作为数据传输的格式,搭配Internet上标准的传输协议HTTP、SMTP、TCP等来传送信息。从本质上看,SOAP事实上只是将Request和Response经由XML格式把数据打包,达到双方沟通的目的。 2) WSDL:WSDL(Web Service Description Language)是一种以XML格式描述的Web Service语言,当Web Service Provider 要对外公布提供的 Web Service,就需要通过WSDL来构建描述语言。在WSDL中有两个非常重要的要素::此WSDL文件所要描述的Web Service集合;每一个Port代表外界Client可以和此Service沟通的一个进入点,一个Port会指定一个Binding方式。 3):处理中文乱码的问题: 将HttpRio的 Converter 的 Options 的 soUTF8InHeader 设为 True 将生成soap消息的HTTPSoapDispatcher控件,添加encoding为gb2312 https://www.sodocs.net/doc/8318077127.html,eUTF8InHeader := True; 4)在Delphi中,能够传递的自定义类型的对象要继承TRemotable, 5:修正一个服务器端的一个Bug:将ISAPIThreadPool和ISAPIApp的次序变一下:ISAPIApp必须在 ISAPIThreadPool之前: uses ... ISAPIApp, ISAPIThreadPool 解决如下错误: Received content of invalid Content-Type setting:text/html -SOAP"expects"text/xml" 6:"XML document must have a top level element. Line: 0" 错误,我该如何解决??哈纳斯 (2002-08-05 17:26:00) 我也曾碰到同样的问题解决方法是:别设httprio的wsdllocation,设它的url 如http://localhost/mydir/project1.exe/wsdl/IFIRST mydir是你的可执行的虚拟目录,IFIRST是你定义的接口名 ********************************************************************* **************************

Delphi7.0中如何用代码访问数据库的方法

Delphi7.0中如何用代码访问数据的方法 一、第一种方法: 1、设计的界面如下: 2、主要代码: (1)启动窗口中的主要代码: Se:= ExtractFilePath(Application.ExeName) + 'data\jczk.mdb'; //动态取出系统文件的路径ADOADOQuery1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ Se+';Persist Security Info=False'; ADOADOQuery1.Close; ADOADOQuery1.SQL.Clear; ADOADOQuery1.SQL.Add('select * from yhz'); ADOADOQuery1.Open;//ADOADOQuery1.ExecSQL;本句表示不返回值时的记录集合ADOADOQuery1.Active:=true; (2)查询其它表时的代码: ADOADOQuery1.Close; ADOADOQuery1.SQL.Clear; ADOADOQuery1.SQL.Add('select * from jf11'); ADOADOQuery1.Open; ADOADOQuery1.Active:=true; (3)提示窗口:Application.MessageBox('ss','提示',64); (4)说明:DataSource1必须要与ADOADOQuery1连接在一起;DBGrid1必须要与DataSource1连接在一起。 (5)取值:EDIT1.Text:=ADOADOQuery1.FieldByName('yhz04').AsString (6)怎么使用ADOQuery1给数据库添加数据? ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('insert into "Tab_Contron_record"'); ADOQuery1.SQL.Add('('+str_V+')'); ADOQuery1.SQL.Add('values('+str_T+')'); ADOQuery1.ParamByName('用户名').AsString:='admin'; ADOQuery1.ParamByName('连接设备IP').AsString:='192.168.18.66'; ADOQuery1.ParamByName('用户类型').AsString:='管理员'; ADOQuery1.ParamByName('连接时间').AsString:=datetimetostr(now); ADOQuery1.ParamByName('备注').AsString:='无'; ADOQuery1.ExecSQL; (7)、怎么样查询数据库中表的值,即条件查询(注意:Quotedstr()函数的使用):cnn:='select * from sinfo where sid=200601001'; //“sid”字段为数值型可以直接使用; cnn:='select * from sinfo where sclass='+Quotedstr('高一一');//“sclass”字段为字符类型; //多条件进行查询的例子 cnn:='select * from sinfo where sclass='+Quotedstr('高一一')+' and ssex='+quotedstr('男'); ADOQuery1.Close ;

delphi7串口通信(spcomm控件)实例

Delphi7串口通信(spcomm控件)实例 最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下: 功能简介 功能比较简单,只是从串口接收单片机发送的数据,给memo1 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, SPComm, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Comm1: TComm; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word); procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal); private { Private declarations } public { Public declarations } end; var

Delphi数据库处理组件

Delphi数据库处理组件 BDE、ADO、InterBase和dbExpress详细说明 第一节BDE、ADO、InterBase和dbExpress Delphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi6.0开始还加入了一种dbExpress方法。另外,Delphi还提供了专门处理Borland公司自己的数据库产品InterBase数据库的专门的方法。 BDE(Borland Databas Engine),是Delphi中最古老的技术,从delphi2.0加入BDE技术以后,一直是Delphi处理数据库的事实上的标准。BDE是一个基于驱动程序的体系结构,每一种数据格式或数据源都有一种驱动程序来驱动相近的数据源。BDE可以很好的支持现在最流行的ODBC API方法,ODBC是一种C/C++应用程序编程接口(API),无论是对任何一种客户/服务器关系型数据库管理系统(RDBMS),还是最流行索引顺序访问方法(ISAM)数据库(Jet、Foxpro),都能很好的访问。 同时,由于BDE的驱动程序主要直接来自于第三方开发商,所以,对于像Oracle这些非微软的数据库,执行效率上比较高。正是这些特点,使BDE技术还是得到了很多数据库开发程序员的欢迎。 ADO技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,它基于微软被称为OLE DB的数据访问模式,它是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、Internet资源等。ADO所需内存更少,更适合大流量和大事务量的网络计算机系统。 ADO顶层有三个对象:Connection、Command、Recordset。 Connection用以指定数据源,建立和数据源的连接。 Command对象用以对数剧源执行指定的命令,可以接受SQL语句,表和存储过程的名称,执行SQL查询,更新数据,插入纪录等。 Recordset对象表示的是来自表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。 由于ADO技术的迅速普及,从Delphi5.0开始,加入了ADO技术的模块,并逐步成为Delphi数据库设计的主流。但是,和VB的ADODC相比,它还是有所不同的,在数据绑定上,它更多的吸收了BDE的特点,以做到和原来的程序兼容,同时,它又可以接受标准ADO技术的各种属 性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的选择。 dbExpress是Delphi6.0加入的最新的数据库模块,它不使用缓存,可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标准方式是只读的。它一个重要的特点是交叉平台,可以和Linux数据库连接,速度相当快。 下面的讨论,将以ADO技术为主线,最后再说明BDE和dbExpress的应用方式。Top

delphi_三层架构简单例子.

delphi 三层架构简单例子(经测试成功2009-01-22 下午 02:45所谓三层: (1 客户端 (2 服务器端 (3 数据库在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。在Delphi中可以使用Socket或者Dcom来连接他们相互间的通讯。如果使用Scocket在系统使用时必须提供Scocket连接器,而Dcom 则不用。客户端和服务器的连接需要Broker来联系。环境为winxp sp2 + delphi 7 + db7.(MSSQL2000 创建过程: 1、请不要新建application.file-new-activex-activex library,file --new--other,选择"Multitier"--"Remote data module"。在跳出来的对话框里面输入名称(任意),例如:AppSqlConn。选择确定,进入remote data module窗口。 2、加入组件:adodataset,点击connectionstring属性,点击后面的…,进入 设定连接窗口。选择:use connection string--build,在提供程序中选择:"Microsoft ole db provider for sql server",在连接中:服务器名称输入sql server的ip地址,登录信息中输入用户名和密码(sql server),在选择数据库中选择自己想要使用的数据库。一般只要地址正确、用户名和密码无误,肯定可以连接通过。确定退出。 3、在commandtext中点击后面的…,进入sql 语句设定,根据自己的要求设定。 4、将active属性设置为true。只要前面的设定是正确的,这里应该顺利通过。 5、加入组件:datasetprovider。设定其dataset属性为上面的adodataset。 6、到此服务器端已经设置完成。请保存并且运行一次,从而使服务注册。 7、运行delphi的bin目录下面的scktsrvr,因为下面要使用socket连接。运行后任务栏中出现socket server的图标。 8、新建程序(application),然后file--new--data module,会创建客户端的data module。 9、加入组件:socketconnection,在address中输入sql server的ip地址,然后在servername中输入刚才创建的remote data module的服务程序。程序会自动在serverguid中加入id。然后选择connected属性为true。只要 此处不报告错误,此程序基本成功了。 10、加入组件:clientdataset,选择remoteserver属性为socketconnection,选择providename为服务器程序的datasetprovider。然后选择active属性为true。 11、到程序的form窗口状态,首先选择file--use unit,选择上面创建的data module,确定。然后加入组件datasource 和dbgrid。选择datasourece的dataset属性为data module的clientdataset,选择dbgrid的datasource为这里的datasource组件。现在应该可以看到dbgrid的窗口中

Delphi两个经典数据库控件集详解

Delphi两个经典数据库控件集详解 Delphi强大的数据库功能一直是Delphi程序员们的最爱,然而,BDE强大功能的后面,却有太多的限制。当程序员们绞尽脑汁编出短小精悍的程序而兴高采烈时,他们不得不尴尬的面对发布程序时BDE那几兆大的附加文件。有没有其他控件,既可以使用Delphi强大的数据库功能而又不要那几兆大的BDE?答案时肯定的,那就是使用第三方控件或者Delphi5的ADO控件。在这里,我将具体介绍Delphi第三方数据库控件集:DiamondAccess1.7和ODBCExpress5.06。DiamondAccess控件集使用微软数据访问对象DAO访问数据库。利用此控件集访问数据库,可以完全摆脱BDE,当然,发布程序时也就无需考虑BDE的麻烦了。而且,DAO的访问速度比BDE更快。ODBCExpress控件集使用大家都很熟悉的ODBC访问数据库,只要设置好数据源,就可以访问大部分类型的数据库;而且,使用ODBC接口的程序具有更大的可移植和通用性。ADO数据库访问控件在Delphi5中已经加入进来,假如要在Delphi4或者更低的版本使用ADO,就必须使用第三方控件,比如:DiamondDAO,同样可以提供强大的更能。以下,我们通过实例的形式具体介绍DiamondAccess1.7和ODBCExpress5.06的使用,我们将利用这两个控件集实现同样的功能:在DBGrid中列出数据库所有数据,通过输入检索数据。通过这些实例,我们可以基本了解以下内容:1)Delphi 中应用这两个控件集访问数据库的基本技术;2)发布采用这两个控件集的程序需要注重的问题和基本方法;3)两个控件集的优缺点和下载安装方法; DiamondAccess控件集演示 >一、控件说明DiamondAccess是一套高速连接MicrosoftAccess数据库的控件集,包括TDAODatabase,TDAOTable,TDAOQuery和TDAOQueryDef四个控件。它不依靠BDE访问数据库,而是使用微软的DataAccessObjects3.5和JetDatabaseEngine访问数据库,利用Access自带数据库引擎,DiamondAccess可以提供高速的数据库访问接口。 图1DiamondAccess控件集 控件TDAODatabase用于定义要访问的Access数据库,主要属性是DataBaseName;TDAOTable和Delphi自带数据库控件Tabel相似;TDAOQuery和Delphi自带控件Query相似;TDAOQueryDef和DAOQueryDefobject一起使用,平时编程中较少用到。二、演示程序现在,我们用实例了解DiamondAccess的用法。在程序中,我们将用到TDAODatabase 控件,TDAOQuery控件,Delphi自带Datasource控件,Edit和Button控件。程序打开数据库DataBase的main表并列出所有数据,Edit1控件用于输入数据检索。为了更好的了解,我们先看看main的表结构。1)数据库DataBase表main的结构字段名数据类型字段大小/格式ID自动 编号长整型姓名文本50电话文本50生日日期/时间常规日期说明文本100 表1数据库DataBase表main的结构 2)程序中控件属性为了程序有更好的可迁移性,我们尽量不再属性面板中设置控件属性,而是在程序代码中设置。以下属性,只是控件最基本的要求,进一步设置请看程序源代码。控件属性Form1Caption:DiamondAccess演示;DAODatabase1默认;DAOQuery1Database:DAODatabase1;SQL:selectfrommain;DBGrid1DataSource:DataSource1;DataSource1Dataset:DAOQuery1;Edit1 Text:空;Button1Caption:检索

Delphi数据库开发完美教程 第1章 Delphi数据库应用系统基础

数据库应用技术Delphi应用系统开发

第1章Delphi数据库应用系统基础 学习要点 学习Delphi数据库应用系统的基本概念 理解Delphi应用系统的组成 学习Delphi基本概念和术语 掌握Delphi可视化编程的基本步骤 学习创建简单的数据库应用系统 理解本书实例数据库应用系统需求

概述: Borland公司的Delphi是一个非常优秀的数据库应用系统前端开发工具。这是由于Borland Delphi自1995年2月诞生Version 1.0以后,1996年3月,Borland Delphi Client/Server Suite 2.0以其高效的数据重用功能得以在美国国家软件测试实验室进行的软件评估中获得了最高评价。随后,Borland又推出Delnhi的第三代版本——Delphi 3.0多层Client/Server的32位快速开发工具。

※1.1 数据库应用系统概述 数据库应用系统是一种应用计算机技术完成数据处理的计算机应用系统,数据处理则指对各种形式的数据进行采集、存储、加工和传播的一系列活动的总和。进行数据处理的目的是为了从大量原始数据中获得对人类社会活动有价值的信息,以作为行动和采取对策的依据。 数据处理的中心问题是数据管理,包括对数据的分类、组织、编码、存储、检索和维护,这就构成了数据库应用系统的功能需求。

可见,数据库应用系统包括如下三个部分: (1)数据库; (2)数据库管理系统; (3)数据库应用程序。 因此,开发数据库应用系统需要选择一种数据库管理系统;然后,在其支持之下建立数据库;最后,使用一种开发工具编制数据库应用程序。本书所要介绍的Borland Delphi就是一种可用于编制数据库应用程序的开发工具。

DELPHI 数据库(基本编辑操作)

五、数据库1(基本编辑操作) 步骤一:开始---程序---Borland Delphi 6---BDE---Object---New---OK(默认STANDARD)---PATH---设置为含有数据库文件的目录下。 步骤二:向Form1中添加Table组件(BDE组中),DatabaseName---STANDARD1(上一步创建的),TableName---Pza.DBF。添加DataSource 组件(Data Access组中),DataSet---Table1。添加DBGrid组件(Data Controls 组中)DataSource---DataSource1。添加DBNavigator1组件(Data Controls 组中)DataSource---DataSource1。 向Form1中添加6个Button(Button1…Button6) , Caption依次为”添加”,”删除”,”修改”,”确定”,”取消”,”退出”

步骤三: 1.声明一个procedure (public后面一行): procedure setstate(s:integer); //0:browse;1:edit or insert 定义这个procedure(implementation {$R *.dfm}后面一行): procedure TForm1.setstate(s:integer); begin if s=0 then begin button1.Enabled:=True; button2.Enabled:=True; button3.Enabled:=True; button4.Enabled:=False; button5.Enabled:=False; button6.Enabled:=True; end else begin button1.Enabled:=False; button2.Enabled:=False; button3.Enabled:=False; button4.Enabled:=True; button5.Enabled:=True; button6.Enabled:=False; end; end; 2.定义变量x(implementation下面一行): var x:integer; 3.打开Table(Form1---OnActivate) : Table1.Open; setstate(0);

DELPHIXE移动开发调用的例子方法

调用的例子方法: uses Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, https://www.sodocs.net/doc/8318077127.html,; procedure Call_URI(const AAction : JString;const AURI: string); var uri: Jnet_Uri; Intent: JIntent; begin uri := StrToJURI(AURI); Intent := TJIntent.JavaClass.init(AAction, uri); {Intent.putExtra() 如果是要发短信等复杂的应用,需要传递各种其他的参数.要用到Intent.putExtra()传递多个参数. 这里只封装最简单的,具体Intent.putExtra()的用法,可以查询Java的资料.大把的 } SharedActivityContext.startActivity(Intent); end; //使用例子: //打电话 Call_URI(TJIntent.JavaClass.ACTION_CALL, 'tel:137114553XX'); //打开地图显示某个坐标点 Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'geo:38.899533,-77.036476'); //发送电子邮件 Call_URI(TJIntent.JavaClass.ACTION_SENDTO, 'mailto:wr960204@https://www.sodocs.net/doc/8318077127.html,'); //播放音乐 Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'file:///sdcard/download/最炫民族风.mp3'); 调用的例子方法: ===========================我是分割线================================================== android 系统常用URI: android 系统常用URI: android 系统常用URI: android 系统常用URI: 显示网页: 1. Uri uri = Uri.parse("https://www.sodocs.net/doc/8318077127.html,"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); 显示地图:

0 Delphi专家群体法项目案例

1. 系统功能描述 教务管理主要完成以下功能: 对于教师而言,登录系统后,应提供以下功能:1)录入成绩:每位任课教师在学期末考试后拿到成绩表时,都应将每位学生的成绩准确的录入到教务系统中,方便学生查询。 2)个人课表:系统根据学校排课情况和教师的任课情况自动生成教师个人课表,以备教师查阅。 3)会议通知:系统实时更新和上传教师的会议通知,同时用该具备起草和发布通知的功能,起草和发布通知也应设定相应的权限。 4)个人日志:系统应为每位教师提供可用于个人记事的功能。 5)专业概况:每位教师都需知道自己所工作的专业的最新情况,系统应为教师提供可以了解专业信息的功能,在此功能中,教师还可以了解到其他同行教师的情况。 6)日程安排:该功能是系统设置用来为教师提醒每日行程的,由于权限的限制,每位教师可以对自己的个人行程进行删除和修改,也可定义提醒时间。 对于学生而言,登录系统后,应提供以下功能:1)网上选课:在此功能中,学生可以根据自已的情况分别网上选修体育课、非专业选修课和专业选修课。 2)活动报名:系统应及时更新、删除和修改由学校举办的各种活动的通知,以便学生及时查询和报名参加。同时,该功能应及时更新活动的现况,比如获奖情况、参赛名单、成绩公布以及后续情况。 3)教学质量评价:此功能提供给学生网上评教的方法。每学期期中,教师评价都尤为重要,除了教师之间可以进行评价以外,学生也必须为每个教师的教学情况进行评价。该功能也要有权限,只有当给每个教师均评教完后,方能生效。 4)信息维护: 5)信息查询:信息查询包括: a)专业推荐课表查询:在此项中,学生可以 查询所在专业班级的课表。 b)教师个人课表查询:在此项中,学生可以 在权限范围内查询学校教师的个人课表。 c)学生个人课表:在此项中,学生可以查询 个人课表。 d)学生考试查询:在此项中,学生可以查询 学期考试安排。 e)成绩查询:在此项中,学生可以查询自己 每学期的期末考试成绩及所修学分等。 f)等级考试查询:在此项中,学生可以查询 在校期间参加的所有等级考试的成绩。 g)培养计划:在此项中,学生可以查询有学 校举办的各种培养计划。 h)教室查询:在此项中,学生可以查询上课 所在教室的情况及空闲教室的使用情况。 i)课程介绍查询:在此项中,学生可以查询专业 课及非专业课的情况,便于选课。 j)学生补考考试查询:此项设有权限,只有参加过补考的学生可以查询其补考成绩。 2. 系统需求分析 高校教务管理系统需要完成教学资源管理、教师管理、学生管理、选课管理、考务管理、开课/选课管理、成绩管理和教学计划管理。 2.1 教学资源管理 1. 学年校历编排:给定学年起止日期,自动生成校历。并能对其进行人工调整。 2. 教室资源维护:对教室个数、可容纳人数、教室功能、教室属性(语音室、实验室、微机室、体育场馆等)、相应的管理人员进行维护。 2.2 教师管理 该子系统提供对每位教师的基本信息、教学考勤和教学工作量等信息的维护功能。 1. 教师基本信息:职称、姓名、性别、、年龄、教工号、所属系别。 2. 教师教学考勤:教师到课情况。 3. 教师工作量:教学总课时、专业班级、学生人数、个人课表。 2.3学生管理 该子系统提供对每位学生的档案管理、考勤管理、选课管理、学期/学年资格审核管理等功能的管理。 1. 学生档案管理:系统可从招办提供的电子档中导入学生档案,实现新生基本信息表,并能对基本信息表数据进行存档和维护。 2. 学生考勤管理:对学生每周上课的考勤情况进行登记,每周提交一次。开通班主任办公室/教学服务中心两个输入端口,只有教学服务中心对数据有更改权限。对有关考勤情况的按班级、时间段等不同类别的统计,并根据校规对违规学生进行标记。存在违规情况时,根据相关规定处理各违规学生,并生成备注存入个人临时档案。 3. 选课情况:学生可根据专业班级的不同进行选课,可选择体育课、专业选修课和非专业选修课,并将选课计入学年计划中。 4. 学期/学年资格审核管理:从成绩管理系统获得每学年的学生信息数据和学分信息数据,实现个人学分信息统计。实现对学生升级资格标准信息维护,系统对不符合要求的学生进行自动标记。最终输出学生学年资格审核信息报表。

delphi中dll综合运用的例子

delphi中dll综合运用的例子(动态加载插件) 2008年01月15日星期二 10:59 1,新建dll客户端模块 ---------------dll工程文件PlugIns.dll------------------------------- library PlugIns; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes, PlugInFrm in 'PlugInFrm.pas' {FrmPlugIns}; {$R *.res} //输出接口函数 exports ShowDLLForm,GetCaption; begin end. -------------新建模块PlugInFrm.pas的窗体文件--------------- unit PlugInFrm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFrmPlugIns = class(TForm) Label1: TLabel; private { Private declarations }

delphi数据库的增删改查

查询: V ar strSQL:String; begin strSQL:='Select Checkupid,CustomCode,CustomName,CheckupDate,LeftMoney,CurrMoney,OperatorName,Note from T_Fee_CheckupRecord Where '; strSQL:=strSQL+' CheckupDate between ' +''''+FormatDateTime('yyyy-mm-dd', DateTPbegin.DateTime)+''''+' and ' +''''+FormatDateTime('yyyy-mm-dd', DateTPend.DateTime+1)+''''; if not (Trim(edtCustomCode.Text)='') then begin strSQL:=strSQL+' and CustomCode like '+''''+Trim(edtCustomCode.Text)+'''' end; if not (Trim(edtCustomName.Text)='') then begin strSQL:=strSQL+' and CustomName like '+''''+Trim(edtCustomName.Text)+'''' end; //ShowMessage(strSQL); RefleshGrid(strSQL); end; 其中自定义的函数: procedure RefleshGrid(strSQL:String); begin with DataMD.ADOQuery1 do begin Close; SQL.Clear ; SQL.add(strSQL); Open; end; end; procedure ExeSQL(strSQL:String); 增: procedure TfrmImport.sButton1Click(Sender: TObject); begin frmInportAdd.Showmodal;

相关主题