信じたいかどうかにかかわらず、Delphi に付属のコンポーネントには無視できないバグがあります。
最初は、Delphi 自体のコントロールにバグがあるとは思いませんでした。あまりに悔しかったので何度もデバッグし、トレースして初めて発見しました。
サンプル ページの TSpinEdit コントロールを参照してください。 MaxValue (最大値) と MinValue (最小値) のプロパティがあります。
バグ 1: 最初に Value を 7 に設定し、次に MaxValue を 5 に、MinValue を 0 に設定しますが、Value は自動的には変更されません。 ! !
バグ 2: MaxValue を -7 に、MinValue を 7 に設定します。それを見ましたか?最大値は最小値より小さくてもかまいません。
バグ3: 最大値と最小値が等しい場合、気軽にValueを設定できるのですが…
当時、作者がどのようにしてこれほど多くのバグを設計したのか理解できませんし、なぜボーランドがこの制御を採用したのかもわかりません。おそらく、Borland のゲートキーパーは GG で、この開発者は MM なので...
要点に戻り、Delphi インストール ディレクトリ /Source/Samples/Spin.Pas を開きます。
PROperty MaxValue の検索: LongInt 読み取り FMaxValue 書き込み FMaxValue;
プロパティ MinValue: LongInt 読み取り FMinValue 書き込み FMinValue;
Bug1とBug2が同時に発見されました! FMaxValue と FMinValue の値は判定がなく、直接設定されます。つまり、最大値と最小値は制限されず、任意に設定できます。最大値と最小値を設定した後、値が更新されず、バグ 1 が発生します。
次のように変更します。
property MaxValue: LongInt 読み取り FMaxValue 書き込み SetMaxValue;
property MinValue: LongInt 読み取り FMinValue 書き込み SetMinValue;
プライベートに 2 つのプロシージャを追加します。
プロシージャ SetMaxValue(Value: LongInt);
プロシージャ SetMinValue(Value: LongInt);
内容は以下の通りです。
プロシージャ TSpinEdit.SetMaxValue(Value: LongInt);
始める
値 >= FMinValue の場合
FMaxValue := 値;
SetValue(Self.Value);
終わり;
プロシージャ TSpinEdit.SetMinValue(Value: LongInt);
始める
値 <= FMaxValue の場合
FMinValue := 値;
SetValue(Self.Value);
終わり;
Private には明らかに CheckValue 関数があるので、見てみましょう。
関数 TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
始める
結果 := 新しい値;
if (FMaxValue <> FMinValue) then
始める
NewValue < FMinValue の場合
結果 := FMinValue
それ以外の場合、NewValue > FMaxValue の場合
結果 := FMaxValue;
終わり;
バグ 3 の理由が見つかりました。このコントロールの作成者は、FMaxValue と FMinValue が等しいかどうかを判断しませんでした。
次のように変更します。
関数 TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
始める
結果 := 新しい値;
if (FMaxValue <> FMinValue) then
始める
NewValue < FMinValue の場合
結果 := FMinValue
それ以外の場合、NewValue > FMaxValue の場合
結果 := FMaxValue;
終わり
それ以外
始める
結果:=FMaxValue;
終わり;
終わり;