网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.快速导出数据到Excel(三):利用.
.Delphi数据库的动态建立.
.利用Indy的TIdFtp控件实现FTP协议.
.正确看待《Delphi高手突破》最后.
.发布delphi代码时的注意事项.
.如何将C/C++程序转译成Delphi(十.
.如何减小应用程序(EXE)的大小?.
.用Ehlib二次开发报表打印程序,实.
.绑架窗体之Delphi版.
.报表设计.
.用Delphi开发屏幕保护预览程序.
.Com接口入门细详(二).
.日历函数单元.
.流操作的语法.
.Internet编程技巧1.
.使TStringGrid自适应宽度.
.关于MIDAS的安全问题的解决方案.
.一个四舍五入的函数.
.改良控件-Delphi自带控件Bug的消.
.用Delphi进行OpenGL编程学习心得.

改良控件-Delphi自带控件Bug的消除

发表日期:2006-2-4


 

不管你想不相信Delphi自带的组件里竟然存在着一个不容忽视的Bug。
开始我一点都没有想到是Delphi自带的控件有Bug。害的我调试了很多遍,后来经过跟踪才发现的。
看到Samples页上的TSpinEdit控件了吗?他有MaxValue(最大值)、MinValue(最小值)的属性。
Bug1:先把Value设为7,再把MaxValue设为5,MinValue设为0,Value竟然不会自动改变!!!
Bug2:你设置一下MaxValue为-7,MinValue为7。看到了吗?最大值竟然可以比最小值还小。
Bug3:当最大值和最小值相等时Value竟然可以随便设置...


我不明白这个作者当时是如何设计的这么多的Bug,我不明白Borland为何采用这个控件。也许Borland的把关人员是位GG,而这位开发这是位MM,于是......

言归正转让我们打开Delphi安装目录下\Source\Samples\Spin.Pas


找到property MaxValue: LongInt read FMaxValue write FMaxValue;
    property MinValue: LongInt read FMinValue write FMinValue;
Bug1、Bug2同时被找到!竟然连判断都没有,直接设置FMaxValue、FMinValue的值,也就是最大最小值竟然不受限制可以随便设置。设置完最大最小值也不刷新Value,导致了Bug1的产生。
改为:
    property MaxValue: LongInt read FMaxValue write SetMaxValue;
    property MinValue: LongInt read FMinValue write SetMinValue;
在Private中添加两个过程:
    procedure SetMaxValue(Value: LongInt);
    procedure SetMinValue(Value: LongInt);
内容如下:

procedure TSpinEdit.SetMaxValue(Value: LongInt);
begin
  if Value >= FMinValue then
    FMaxValue := Value;
  SetValue(Self.Value);
end;

procedure TSpinEdit.SetMinValue(Value: LongInt);
begin
  if Value <= FMaxValue then
    FMinValue := Value;
  SetValue(Self.Value); 
end;

 


它的Private中明明有CheckValue函数嘛,让我来看看。

function TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
begin
  Result := NewValue;
  if (FMaxValue <> FMinValue) then
  begin
    if NewValue < FMinValue then
      Result := FMinValue
    else if NewValue > FMaxValue then
      Result := FMaxValue;
  end;
找到了Bug3的原因此控件作者竟然没有判断FMaxValue、FMinValue相等的情况
更改为:
function TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
begin
  Result := NewValue;
  if (FMaxValue <> FMinValue) then
  begin
    if NewValue < FMinValue then
      Result := FMinValue
    else if NewValue > FMaxValue then
      Result := FMaxValue;
  end
  else
  begin
    Result:=FMaxValue;
  end;
end;


上一篇:对Delphi控件的一点改良(三) 人气:3994
下一篇:理解类引用这种类型 人气:4147
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐