国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

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

2019-11-18 18:42:01
字體:
供稿:網(wǎng)友
 

不管你想不相信Delphi自帶的組件里竟然存在著一個(gè)不容忽視的Bug。
開始我一點(diǎn)都沒有想到是Delphi自帶的控件有Bug。害的我調(diào)試了很多遍,后來經(jīng)過跟蹤才發(fā)現(xiàn)的。
看到Samples頁上的TSpinEdit控件了嗎?他有MaxValue(最大值)、MinValue(最小值)的屬性。
Bug1:先把Value設(shè)為7,再把MaxValue設(shè)為5,MinValue設(shè)為0,Value竟然不會(huì)自動(dòng)改變!!!
Bug2:你設(shè)置一下MaxValue為-7,MinValue為7。看到了嗎?最大值竟然可以比最小值還小。
Bug3:當(dāng)最大值和最小值相等時(shí)Value竟然可以隨便設(shè)置...


我不明白這個(gè)作者當(dāng)時(shí)是如何設(shè)計(jì)的這么多的Bug,我不明白Borland為何采用這個(gè)控件。也許Borland的把關(guān)人員是位GG,而這位開發(fā)這是位MM,于是......

言歸正轉(zhuǎn)讓我們打開Delphi安裝目錄下/Source/Samples/Spin.Pas


找到PRoperty MaxValue: LongInt read FMaxValue write FMaxValue;
    property MinValue: LongInt read FMinValue write FMinValue;
Bug1、Bug2同時(shí)被找到!竟然連判斷都沒有,直接設(shè)置FMaxValue、FMinValue的值,也就是最大最小值竟然不受限制可以隨便設(shè)置。設(shè)置完最大最小值也不刷新Value,導(dǎo)致了Bug1的產(chǎn)生。
改為:
    property MaxValue: LongInt read FMaxValue write SetMaxValue;
    property MinValue: LongInt read FMinValue write SetMinValue;
在Private中添加兩個(gè)過程:
    procedure SetMaxValue(Value: LongInt);
    procedure SetMinValue(Value: LongInt);
內(nèi)容如下:

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函數(shù)嘛,讓我來看看。

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;



上一篇:不知您是笨蛋,還是我是笨蛋,關(guān)于Delphi的大Bug

下一篇:對(duì)Delphi控件的一點(diǎn)改良(三)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 津市市| 遂溪县| 沙田区| 喜德县| 镶黄旗| 崇州市| 伊春市| 延寿县| 秦皇岛市| 特克斯县| 栾川县| 托里县| 海兴县| 马鞍山市| 轮台县| 黑水县| 韶关市| 句容市| 进贤县| 育儿| 松溪县| 邻水| 司法| 金山区| 丹江口市| 京山县| 丰原市| 荔浦县| 吴堡县| 乐都县| 疏勒县| 阜城县| 水富县| 清新县| 大新县| 衡东县| 清原| 富平县| 余姚市| 清丰县| 柳江县|