Que vous vouliez le croire ou non, il existe un bug qui ne peut être ignoré dans les composants fournis avec Delphi.
Au début, je ne pensais pas qu'il y avait un bug dans le contrôle de Delphi. C'était tellement frustrant que je l'ai débogué plusieurs fois et je ne l'ai découvert qu'après le traçage.
Vous voyez le contrôle TSpinEdit sur la page Exemples ? Il possède les propriétés de MaxValue (valeur maximale) et MinValue (valeur minimale).
Bug1 : définissez d'abord Value sur 7, puis définissez MaxValue sur 5 et MinValue sur 0, mais Value ne changera pas automatiquement ! ! !
Bug2 : vous définissez MaxValue sur -7 et MinValue sur 7. Avez-vous vu ça ? La valeur maximale peut être inférieure à la valeur minimale.
Bug3 : Lorsque la valeur maximale et la valeur minimale sont égales, la valeur peut être définie de manière informelle...
Je ne comprends pas comment l'auteur a conçu autant de bugs à cette époque, et je ne comprends pas pourquoi Borland a adopté ce contrôle. Peut-être que le gardien de Borland est un GG, et ce développeur est un MM, alors...
Revenons au sujet et ouvrons le répertoire d'installation de Delphi /Source/Samples/Spin.Pas
Rechercher PRerty MaxValue : LongInt lire FMaxValue écrire FMaxValue ;
propriété MinValue : LongInt lit FMinValue écrit FMinValue ;
Bug1 et Bug2 ont été trouvés en même temps ! Il n'y a pas de jugement, les valeurs de FMaxValue et FMinValue sont directement définies, c'est-à-dire que les valeurs maximales et minimales ne sont pas limitées et peuvent être définies à volonté. Après avoir défini les valeurs maximale et minimale, la valeur n'est pas actualisée, ce qui conduit à l'apparition du Bug1.
Remplacer par :
propriété MaxValue : LongInt lire FMaxValue écrire SetMaxValue ;
propriété MinValue : LongInt lit FMinValue écrit SetMinValue ;
Ajoutez deux procédures en Privé :
procédure SetMaxValue(Valeur : LongInt);
procédure SetMinValue(Valeur : LongInt);
Le contenu est le suivant :
procédure TSpinEdit.SetMaxValue(Value: LongInt);
commencer
si Valeur >= FMinValue alors
FMaxValue := Valeur ;
SetValue(Self.Value);
fin;
procédure TSpinEdit.SetMinValue(Valeur : LongInt);
commencer
si Valeur <= FMaxValue alors
FMinValue := Valeur ;
SetValue(Self.Value);
fin;
Il y a clairement une fonction CheckValue dans Private, laissez-moi y jeter un œil.
fonction TSpinEdit.CheckValue (NewValue : LongInt) : LongInt ;
commencer
Résultat := NouvelleValeur ;
si (FMaxValue <> FMinValue) alors
commencer
si NouvelleValeur < FMinValue alors
Résultat := FMinValue
sinon si NewValue > FMaxValue alors
Résultat := FMaxValue;
fin;
Trouvé la raison du bug 3. L'auteur de ce contrôle n'a pas jugé si FMaxValue et FMinValue sont égaux.
Remplacer par :
fonction TSpinEdit.CheckValue (NewValue : LongInt) : LongInt ;
commencer
Résultat := NouvelleValeur ;
si (FMaxValue <> FMinValue) alors
commencer
si NouvelleValeur < FMinValue alors
Résultat := FMinValue
sinon si NewValue > FMaxValue alors
Résultat := FMaxValue;
fin
autre
commencer
Résultat :=FMaxValue ;
fin;
fin;