改良控制元件-Delphi自帶控制元件Bug的消除 (轉)

worldblog發表於2007-12-12
改良控制元件-Delphi自帶控制元件Bug的消除 (轉)[@more@]

不管你想不相信自帶的裡竟然存在著一個不容忽視的。
開始我一點都沒有想到是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目錄下SamplesSpin.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;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992122/,如需轉載,請註明出處,否則將追究法律責任。

相關文章