网站首页 工具软件 操作系统 办公软件 网页制作 PHP教程 script脚本专栏 photoshop教程 其他精品教程
我发布的文章 - 教程搜索 - 交流论坛 - 帮助中心 - 网站首页 网络工具 - 常用工具 - 媒体工具 - 系统工具 - 实用工具 NT/2003 - Win Xp - Win2000 - DOS/Win9x - IE/注册表 - Linux - 苹 果 Office - Word - Excel - PowerPoint - 输入法 - 邮件处理 Flash - Dreamweaver - Fireworks - FrontPage - HTMLCSS 基础文章 - PHP函数 - PHP技巧 - 数据库相关 - 高级应用 - PHP安装 - 转载精华 - 常见问题 综 合 类 - 状 态 栏 - 游 戏 类 - 页面背景 - 页面特效 - 页面导航 - 文本操作 - 文本特效 - 图形特效 - 鼠标特效 - 时间日期 - 密 码 类 文字特效 - 按钮与图标 - 色彩运用 - 滤镜魔法 - 综合实例 XML教程 - DELPHI基础教程 - VB教程
首页 -> 其他精品教程 -> DELPHI基础教程

TOP

利用控件技术来消除Delphi中的一个BUG
文章内容
相关信息
用户评论
文章内容


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过程刷新数据集。


五.实现的重要步骤

1.继承原有的Tquery控件


点击Componet/New Componet,出现一个窗口如图1:



Ancestor type是要继承的控件名称,我们选择Tquery。

Class Name是在你要生成的控件的注册名称,写TMyQuery。

Palette Page:是在安装控件时,要安装到的面板名称。就选Samples了。

Unite file name:是此控件对应的文件名。

Search path:是控件的搜索路径。

填写完毕,Delphi会自动生成对应代码。

2.增加一个属性Show


<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
所属专题:
用户评论
称  呼:
内  容:

广告位

广告招租,欢迎抢订

热门信息

·Delphi客户服务器应用开发..
·SQL编程(一)
·数据浏览部件的应用及编程..
·数据浏览部件的应用及编程..
·SQL编程(二)
·数据访问部件的应用及编程..
·在线播放器DIY
·Delphi客户服务器应用开发..

推荐信息