⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 035.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基础教程-->第十四章 简单数据库应用的创建及MASTAPP介绍(三)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基础教程 第十四章 简单数据库应用的创建及MASTAPP介绍(三)">
<META NAME="description" CONTENT=" - DELPHI基础教程 - 第十四章 简单数据库应用的创建及MASTAPP介绍(三)">

<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%"  bgcolor="#e0e0e0"><strong><A HREF="036.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="034.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>

<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">第十四章 简单数据库应用的创建及MASTAPP介绍(三)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p>&nbsp;&nbsp;&nbsp; 利用GotoNearest方法执行不精确查找</p>
<p>窗体中的“不精确查找”按钮的事件处理过程代码如下:</p>
<p>procedure TForm1.Button1Click(Sender: TObject);</p>
<p>begin</p>
<p>with table1 do</p>
<p>begin</p>
<p>IndexFieldNames:='Company';</p>
<p>setkey;</p>
<p>FieldByName('Company').AsString:=Edit1.text;</p>
<p>GotoNearest;</p>
<p>label3.caption:=FieldByName('Company').AsString;</p>
<p>end;</p>
<p>end;</p>
<p>&nbsp;&nbsp;&nbsp; 读者可以利用 FindNearest
方法执行上面的不精确查找, 具体使用方法可以参看Findkey方法的使用。</p>
<p>在上面的例子中要设置table1的IndexFieldNames属性为Company。</p>
<p>GotoNearest方法进行不精确查找</p>
<p align="center">14.6 修改数据库中的记录 </p>
<p>
&nbsp;&nbsp;&nbsp; 我们掌握了字段对象的概念和如何查找数据库中的记录之后,下面我便可以很方便地修改数据库中现存的记录了,一般来说,在程序中修改数据库中的记录包括下面这些步骤:</p>
<p>1、在数据库中找到要修改的记录,并将记录指针移至该记录。</p>
<p>2、调用Edit方法将与数据库表相连的TTable部件设置成编辑状态。</p>
<p>3、修改一个或多个字段。</p>
<p>4、调用post方法将修改后的记录写入数据库。</p>
<p>
&nbsp;&nbsp;&nbsp; 以上这几个步骤只是概述性的,具体实现时还有很多细节需要留心,我们通过一个例子来演示上面的全过程,以便让读者进一步地了解和掌握修改记录的方法。</p>
<p>&nbsp;&nbsp; 例14.6
我们为四个按钮分别编写了事件处理过程,用来遍历数据库中的记录并对每个客户记录的Company字段进行修改,
在程序对记录进行更新操作时窗口中的控件都是无效的,在这个例子中我们还编写了一个简单的异常代码块用来确保在更新过程中出现异常时使控件恢复正常操作。 </p>
<p> 修改数据库记录</p>
<p>14.6.1 Edit方法Post方法 </p>
<p>&nbsp;&nbsp;&nbsp; 为了能让用户通过程序修改数据库表中的记录,TTable部件必须要处在编辑状态下。在大多数情况下,数据库表都是以浏览(只读方式)方式打开的,也就是说它的每一个字段可以被读取介不能被编辑修改。调用Edit
方法能够将 TTable 部件置成编辑状态, 当TTable部件处于编辑状态后,我们才可以通过程序修改当前记录指针所指向的记录,但这样修改后的记录不会立即被写入到磁盘上的实际数据库表中。要想保存对记录的修改,必须要调用Post方法,Post方法才真正将我们对记录的修改写入实际的数据库表中。</p>
<p>一般来说,用来扫描整个数据库表并修改每个记录的某一个字段的程序如下所示:</p>
<p>with Table Do</p>
<p>begin</p>
<p>DisableControls;{在修改记录的过程中,使其它部件无效}</p>
<p>First; {将记录指针指向第一条记录} </p>
<p>while not EOF do </p>
<p>begin</p>
<p>&lt;读取记录的一个字段值到一个变量中&gt; </p>
<p>&lt;做适当的修改&gt;</p>
<p>Edit; {将TTable部件置成编辑状态} </p>
<p>&lt;将修改后的字段值写回到其对应的字段&gt; </p>
<p>post; {将修改后的记录写回数据库} </p>
<p>next; {修改下一条记录} </p>
<p>end;</p>
<p>enablecontrols; {恢复其它部件的功能}</p>
<p>end;</p>
<p>&nbsp;&nbsp;&nbsp; 程序都是对TTable部件进行操作,因此使用With语句来防止错误的扩散是很有意义的。在这里要注意Disablecontrols方法和EnableControls方法的使用。DisableControls方法是在程序修改TTable部件中的记录时,切断TTable部件与数据访问部件TDatasource
部件的联系。否则,在对TTable中的每一修改之后,TDataSource
部件都会更新窗体中所有数据浏览部件的显示内容,这样会急剧减慢处理过程而且浪费时间。EnableControls方法是与DisableControle方法执行相反的操作,它是用来恢复TTable部件与TDatasource部件的联系并促使所有的数据浏览部件更新显示。</p>
<p>&nbsp;&nbsp;&nbsp; 调用First方法是将记录指针移到数据库表中的第一条记录,
确保程序从表中的第一条记录开始进行修改。调用Next方法是将记录指针从当前的记录移到下一条记录,这样保证了从表中的第一条记录开始逐条记录进行修改,直到修改完最后一条记录。如果不调用Next方法,程序将会陷入无穷的死循环。 </p>
<p>14.6.2 实现异常保护的TRY...FINALLY语句 </p>
<p>
&nbsp;&nbsp;&nbsp; 上面的程序存在着潜在的危险,在实际应用过程中,可能因为某些原因使得对数据库表的更新不能进行下去。如当程序试图执行Post方法将修改后的记录写回磁盘时,而又因为某种原因磁盘没有准备好,这时便出现了异常。当出现异常时,应用程序会暂停下来并且会弹出一对话框显示有关的错误信息,在用户单击错误信息对话框之后,程序将继续执行到某一个地方去,而这个地方常常不是用户所能预料到的。
在我们的程序中, 在执行Post方法之前,窗体中所有的部件与TTable部件都已失去联系。因此,这种异常将导致窗体中显示的数据和数据库无关。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object Pascal中的Try...Finally语句为我们解决上述异常问题提供了一个解决方法。在Delphi中仍然采用了这一语句用来处理异常问题。实际上,Try...Finally
语句是把两组语句组合在一起。语句的Try部分包含了可能产生异常的程序代码,Finally部分包含了即使发生了异常也必须执行的一条或多条语句。
在本例中, Finally 部分只包含了EnableControls方法调用这一条语句,我们将前面的代码改写并组合进Try...Finally
语句: </p>
<p>with Table Do</p>
<p>begin</p>
<p>DisableControls;{在修改记录的过程中,使其它部件无效}</p>
<p>Try;</p>
<p>First; {将记录指针指向第一条记录} </p>
<p>while not EOF do </p>
<p>begin</p>
<p>&lt;读取记录的一个字段值到一个变量中&gt; </p>
<p>&lt;做适当的修改&gt;</p>
<p>Edit; {将TTable部件置成编辑状态} </p>
<p>&lt;将修改后的字段值写回到其对应的字段&gt; </p>
<p>post; {将修改后的记录写回数据库} </p>
<p>next; {修改下一条记录} </p>
<p>end;</p>
<p>enablecontrols;</p>
<p>Finally;{出现异常时,执行下面的程序} </p>
<p>enablecontrols; {恢复其它部件的功能}</p>
<p>end; {结束Try...Finally语句}</p>
<p>end;</p>
<p>&nbsp;&nbsp;&nbsp; 在保留字Try和Finally之间的代码跟前面的代码是一样的,它们用于在记录之间移动记录指针并处理对记录的修改,这一段代码可能会出现异常,当异常发生时,我们想保证执行EnableControls,
以便窗体中各控件恢复与 TTable 部件的联系, 因此我们必须将EnableControls语句放在Finally和结束语句End之间。</p>
<p>&nbsp;&nbsp;&nbsp; 在这里要特别注意,请读者们不要混淆了Try...Finally语句和Try...Except
语句。如果真正想在发生异常时采取相应的处理,就要使用Try...Except语句。Try...
Finally语句只是用来处理当异常出现时,使应用程序执行Finally部分的语句,
使程序继续执行下去。Try...Except语句是实现异常处理,Try...Finally语句是实现异常保护。</p>
<p>
&nbsp;&nbsp;&nbsp; 有了上述这些概念,我们便可以提供这个例子的一些程序代码,它涉及了所有这些内容。</p>
<p>程序清单:修改数据库中的记录 </p>
<p>unit Unit26;</p>
<p>interface </p>
<p>uses</p>
<p>Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, </p>
<p>Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, DB, DBTables, Buttons; </p>
<p>type</p>
<p>TForm1 = class(TForm)</p>
<p>DataSource1: TDataSource;</p>
<p>customerTable: TTable;</p>
<p>Panel1: TPanel;</p>
<p>DBGrid1: TDBGrid;</p>
<p>Panel2: TPanel;</p>
<p>UpperCaseFirstAddBtn: TButton;</p>
<p>UpperCaseSecondAddBtn: TButton;</p>
<p>MixedCaseFirstAddBtn: TButton;</p>
<p>MixedCaseSecondAddBtn: TButton;</p>
<p>BitBtn1: TBitBtn;</p>
<p>procedure ForceCase(TargetField:String;ToUpper:Boolean);</p>
<p>procedure UpperCaseFirstAddBtnClick(Sender: TObject);</p>
<p>procedure MixedCaseFirstAddBtnClick(Sender: TObject);</p>
<p>procedure UpperCaseSecondAddBtnClick(Sender: TObject);</p>
<p>procedure MixedCaseSecondAddBtnClick(Sender: TObject);</p>
<p>procedure FormCreate(Sender: TObject);</p>
<p>private</p>
<p>{ Private declarations }</p>
<p>public</p>
<p>{ Public declarations }</p>
<p>end; </p>
<p>var</p>
<p>Form1: TForm1; </p>
<p>implementation</p>
<p>const</p>
<p>upper=true;</p>
<p>Mixed=False; </p>
<p>{$R *.DFM}</p>
<p>Function IsUpper(ch:char):Boolean;</p>
<p>begin</p>
<p>If (ch&gt;='A')and(ch&lt;='Z')then</p>
<p>IsUpper:=true</p>
<p>else</p>
<p>IsUpper:=False;</p>
<p>end;</p>
<p>procedure TForm1.ForceCase(TargetField:String;ToUpper:Boolean);</p>
<p>var</p>
<p>WorkBuffer:string;</p>
<p>i:Integer;</p>
<p>begin</p>
<p>with customerTable do</p>
<p>begin</p>
<p>DisableControls;</p>
<p>TRY</p>
<p>First; {将记录指针移到第一条记录处 }</p>
<p>While not EOF do</p>
<p>begin</p>
<p>WorkBuffer:=FieldByName(TargetField).AsString;</p>
<p>If ToUpper then</p>
<p>for i:=1 to Length(WorkBuffer)do</p>
<p>WorkBuffer[i]:=UpCase(WorkBuffer[i])</p>
<p>else</p>
<p>begin</p>
<p>for i:=1 to Length(WorkBuffer) do</p>
<p>If IsUpper(WorkBuffer[i]) then</p>
<p>WorkBuffer[i]:=chr(ord(WorkBuffer[i])+32);</p>
<p>WorkBuffer[1]:=UpCase(WorkBuffer[1])</p>
<p>end;</p>
<p>Edit;</p>
<p>FieldByName(TargetField).AsString:=WorkBuffer;</p>
<p>post;</p>
<p>Next;</p>
<p>end;</p>
<p>Finally</p>
<p>enableControls;</p>
<p>end;</p>
<p>end;</p>
<p>end; </p>
<p>procedure TForm1.UpperCaseFirstAddBtnClick(Sender: TObject);</p>
<p>begin</p>
<p>ForceCase('Addr1',Upper);</p>
<p>end; </p>
<p>procedure TForm1.MixedCaseFirstAddBtnClick(Sender: TObject);</p>
<p>begin</p>
<p>ForceCase('Addr1',Mixed);</p>
<p>end;</p>
<p> </p>
<p>procedure TForm1.UpperCaseSecondAddBtnClick(Sender: TObject);</p>
<p>begin</p>
<p>ForceCase('Addr2',Upper);</p>
<p>end;</p>
<p> </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -