|
TOP
|
| 文章内容 |
Delphi具有代码编译速度快、执行效率高和程序设计平台强大的有点,因此受到了广大程序爱好者的欢迎。不过,我们在享受Delphi给我们带来的快乐、便捷的同时,有时也不得不在不同程度上忍受着其本身的BUG给我们带来的烦恼。那么,是否能够利用Delphi提供给我们的强大功能来改正其自身的BUG呢?下面我们就介绍如何利用Delphi的控件技术来消除其本身的一个BUG。
一.使用的工具
Delphi5.0和Microsoft SQL SERVER 7.0。
二.问题的提出
我们首先构造一个测试环境。
1.在控制面板ODBC里面加入一个数据源temp,使之与SQL SERVER 7.0保持连接。
2.在Delphi中新建立一个应用程序。放入Database1、Query1、Datasource1、Dbgrid1控件。设置Database1,是他和数据源temp连接,Query1打开Database1的一张表,且其属性RequestLive=True。并且使Dbgrid1显示出Query1中的数据集。
在搭建完测试环境后。我们运行程序,看看会有什么情况出现。首先我们进行添加记录操作,此时在Dbgrid1面板中显示出来这条记录。但当我们按动PageUp或者PageDown键,使记录翻动,并且让刚才添加得记录移出在Dbgrid1中后,我们再来查找这条记录,发现在Dbgrid1显示面板中找不到。这就使我我们有些困惑了,是不是没有正确添加到数据库中?但当我们退出程序并重新运行程序时,这条记录又出现了,可见我们已经成功添加了记录。但为什么添加的记录无法在Dbgrid1中正确显示呢?
三.问题的解释
1.为什么刚刚添加完,可以看到刚添加的记录显示出来?这应该是显存的缘故:显存里面保留了此记录暂时的映像。
2.为什么在添加后,明明看到此记录已经显示到了Dbgrid1显示面板中,但在按动PageUp或者PageDown键,当记录消失在Dbgrid1显示面板中后,再查找却无法找到此条记录?这是因为虽然程序已经成功的添加了记录,但Query1还没有刷新,数据集还是以前的,并不是更新后的数据集。在按PageUp或者PageDown键使的程序不断访问此Query1,而在显存里面暂时保存的映像,在此记录消失在Dbgrid1显示面板中后,显存里面暂时保存的映像被替代,所以也就无法显示了这新添加的记录了。
四.问题解决思路
我们注意到,当重新运行程序后,刚才添加的记录就显示出来了,这是由于重新运行程序,同时也就刷新了Query1数据集。我们设想能否通过完善原有的Tquery控件来消除这个BUG。因为这种修改才是从根本上解决这个的问题。经过一些探索,我们可以得出以下解决思路:
1.继承原有的Tquery控件。 2.增加一个属性Show,布尔型,功能是是否打开新控件的功能。Show=false:和原来的Tquery控件一样。Show=True:更新数据集。 3.继承并完善Tquery的AfterPost过程。就是在AfterPost过程刷新数据集。 |
五.实现的重要步骤
点击Componet/New Componet,出现一个窗口如图1:
Ancestor type是要继承的控件名称,我们选择Tquery。
Class Name是在你要生成的控件的注册名称,写TMyQuery。
Palette Page:是在安装控件时,要安装到的面板名称。就选Samples了。
Unite file name:是此控件对应的文件名。
Search path:是控件的搜索路径。
填写完毕,Delphi会自动生成对应代码。
<1>在生成的代码中的private段落下面加入下面代码:
showvalue:boolean;//Show属性的值的取值范围 function GetValue:boolean;//获得Show属性值 procedure SetValue(const value:boolean);//设置Show属性值 |
<2>在published中段落下面加入下面代码:
| Property Show : boolean read GetValue write SetValue ;//定义Show属性操作对应的函数或过程 |
<3>在程序的后端加入GetValue、SetValue对应的函数或过程:
此时如果我们安装此控件,就会发现安装后的控件不仅继承Tquery的所有功能,还多了一个布尔型的属性Show。
| 3.继承并完善Tquery的AfterPost过程 |
<1>在private段落下面加入:
| procedure MyPost(DataSet: TDataSet);//在本控件中,MyPos过程了继承AfterPost过程并完善了它 |
<2>在public段落下面加入:
| constructor Create(AOwner:TComponent);override; |
<3>也在程序后端写入Create、MyPost对应的代码。
六.下面程序的就是此控件的全部源代码
unit MyQuery; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables; type TMyQuery = class(TQuery) private showvalue:boolean;//Show属性的值的取值范围 function GetValue:boolean;//获得Show属性值 procedure SetValue(const value:boolean);//设置Show属性值 procedure MyPost(DataSet: TDataSet);//在本控件中,继承AfterPost过程后的名称。 { Private declarations } protected { Protected declarations } public constructor Create(AOwner:TComponent);override; { Public declarations } published Property Show : boolean read GetValue write SetValue ;//定义Show属性操作对应的函数或过程 { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TMyQuery]); end; constructor TMyQuery.create(AOwner: TComponent); begin inherited; Afterpost := MyPost;//把在本控件中Afterpost过程用定义的MyPost过程来代替 end; procedure TMyQuery.MyPost(DataSet: TDataSet); begin if (Assigned(Afterpost)) and (Show=true) then begin//如果执行了Afterpost过程,并且属性Show=True则执行 disablecontrols; active:=false; active:=true;//完成刷新 Last; enablecontrols; end; end; function TMyQuery.GetValue:boolean; begin result:=showvalue; end; procedure TMyQuery.SetValue(const value:boolean); begin showvalue:=value; end; end. |
这时一个新的控件基本就产生了。我们还要为这个的控件加上一个图标。具体的实现方法是用Delphi中的Tools/Image Editor来创建一个24X24的Bitmap位图,并保存为一个DCR文件,文件名称必须与控件的PAS文件名称相同。位图名称必须与控件名称相同且全部为大写(在本程序中应为TMYQUERY)。至此我们就解决了Delphi中添加数据库记录无法正确显示的问题,也产生了一个新的控件。
【 |
|
| 相关信息 |
![]() |
利用控件技术来消除Delphi中的一个BUG
发布者:mmcbbs
浏览量:310
发布日期:2005-04-10 11:07:25
所属专题: |
|
|
|
|