Ob Sie es glauben wollen oder nicht, es gibt einen Fehler, der in den mit Delphi gelieferten Komponenten nicht ignoriert werden kann.
Zuerst dachte ich nicht, dass es einen Fehler in Delphis eigener Steuerung gibt. Es war so frustrierend, dass ich es viele Male debuggte und es dann nach der Ablaufverfolgung entdeckte.
Sehen Sie das TSpinEdit-Steuerelement auf der Seite „Beispiele“? Es verfügt über die Eigenschaften MaxValue (Maximalwert) und MinValue (Minimalwert).
Fehler 1: Stellen Sie zuerst den Wert auf 7 ein, dann setzen Sie den MaxValue auf 5 und den MinValue auf 0, aber der Wert ändert sich nicht automatisch! ! !
Bug2: Sie haben MaxValue auf -7 und MinValue auf 7 gesetzt. Hast du das gesehen? Der Maximalwert kann kleiner als der Minimalwert sein.
Fehler 3: Wenn der Maximalwert und der Minimalwert gleich sind, kann der Wert zufällig festgelegt werden ...
Ich verstehe nicht, wie der Autor damals so viele Fehler entworfen hat, und ich verstehe nicht, warum Borland diese Kontrolle übernommen hat. Vielleicht ist Borlands Gatekeeper ein GG und dieser Entwickler ein MM, also ...
Kommen wir zurück zur Sache und öffnen das Delphi-Installationsverzeichnis /Source/Samples/Spin.Pas
Find PROperty MaxValue: LongInt read FMaxValue write FMaxValue;
Eigenschaft MinValue: LongInt read FMinValue write FMinValue;
Bug1 und Bug2 wurden gleichzeitig gefunden! Es gibt keine Beurteilung, die Werte von FMaxValue und FMinValue werden direkt festgelegt, dh die Maximal- und Minimalwerte sind nicht eingeschränkt und können nach Belieben festgelegt werden. Nach dem Festlegen der Maximal- und Minimalwerte wird der Wert nicht aktualisiert, was zum Auftreten von Bug1 führt.
Ändern zu:
Eigenschaft MaxValue: LongInt read FMaxValue write SetMaxValue;
Eigenschaft MinValue: LongInt read FMinValue write SetMinValue;
Fügen Sie zwei Prozeduren in Private hinzu:
procedure SetMaxValue(Value: LongInt);
procedure SetMinValue(Value: LongInt);
Der Inhalt ist wie folgt:
procedure TSpinEdit.SetMaxValue(Value: LongInt);
beginnen
wenn Wert >= FMinValue dann
FMaxValue := Wert;
SetValue(Self.Value);
Ende;
procedure TSpinEdit.SetMinValue(Value: LongInt);
beginnen
wenn Wert <= FMaxValue dann
FMinValue := Wert;
SetValue(Self.Value);
Ende;
Es gibt eindeutig eine CheckValue-Funktion in Private, lassen Sie mich einen Blick darauf werfen.
Funktion TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
beginnen
Ergebnis := NeuerWert;
if (FMaxValue <> FMinValue) dann
beginnen
wenn NewValue < FMinValue dann
Ergebnis := FMinValue
sonst wenn NewValue > FMaxValue dann
Ergebnis := FMaxValue;
Ende;
Der Grund für Fehler 3 wurde gefunden. Der Autor dieses Steuerelements hat nicht beurteilt, ob FMaxValue und FMinValue gleich sind.
Ändern zu:
Funktion TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
beginnen
Ergebnis := NeuerWert;
if (FMaxValue <> FMinValue) dann
beginnen
wenn NewValue < FMinValue dann
Ergebnis := FMinValue
sonst wenn NewValue > FMaxValue dann
Ergebnis := FMaxValue;
Ende
anders
beginnen
Ergebnis:=FMaxValue;
Ende;
Ende;