不管你想不相信Delphi自帶的組件里竟然存在著一個(gè)不容忽視的Bug。
開(kāi)始我一點(diǎn)都沒(méi)有想到是Delphi自帶的控件有Bug。害的我調(diào)試了很多遍,后來(lái)經(jīng)過(guò)跟蹤才發(fā)現(xiàn)的。
看到Samples頁(yè)上的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,而這位開(kāi)發(fā)這是位MM,于是......
言歸正轉(zhuǎn)讓我們打開(kāi)Delphi安裝目錄下/Source/Samples/Spin.Pas
找到PRoperty MaxValue: LongInt read FMaxValue write FMaxValue;
property MinValue: LongInt read FMinValue write FMinValue;
Bug1、Bug2同時(shí)被找到!竟然連判斷都沒(méi)有,直接設(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è)過(guò)程:
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ù)嘛,讓我來(lái)看看。
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的原因此控件作者竟然沒(méi)有判斷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;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注