Quer você queira ou não, existe um bug que não pode ser ignorado nos componentes que acompanham o Delphi.
A princípio não pensei que houvesse um bug no controle do próprio Delphi. Foi tão frustrante que depurei-o várias vezes e descobri-o após o rastreamento.
Veja o controle TSpinEdit na página Samples? Possui as propriedades MaxValue (valor máximo) e MinValue (valor mínimo).
Bug1: Primeiro defina Valor como 7, depois defina MaxValue como 5 e MinValue como 0, mas o valor não mudará automaticamente! ! !
Bug2: Você definiu MaxValue como -7 e MinValue como 7. Você viu isso? O valor máximo pode ser menor que o valor mínimo.
Bug3: Quando o valor máximo e o valor mínimo são iguais, o valor pode ser definido casualmente...
Não entendo como o autor projetou tantos bugs naquela época e não entendo por que a Borland adotou esse controle. Talvez o gatekeeper da Borland seja um GG, e esse desenvolvedor seja um MM, então...
Vamos voltar ao ponto e abrir o diretório de instalação do Delphi /Source/Samples/Spin.Pas
Encontre PRoperty MaxValue: LongInt lê FMaxValue escreve FMaxValue;
propriedade MinValue: LongInt lê FMinValue escreve FMinValue;
Bug1 e Bug2 foram encontrados ao mesmo tempo! Não há julgamento, os valores de FMaxValue e FMinValue são definidos diretamente, ou seja, os valores máximo e mínimo não são restritos e podem ser definidos à vontade. Após definir os valores máximo e mínimo, o Valor não é atualizado, o que leva à ocorrência do Bug1.
Alterar para:
propriedade MaxValue: LongInt lê FMaxValue escreve SetMaxValue;
propriedade MinValue: LongInt lê FMinValue escreve SetMinValue;
Adicione dois procedimentos em Privado:
procedimento SetMaxValue(Valor: LongInt);
procedimento SetMinValue(Valor: LongInt);
O conteúdo é o seguinte:
procedimento TSpinEdit.SetMaxValue(Valor: LongInt);
começar
se Valor >= FMinValue então
FMaxValue := Valor;
SetValue(Self.Valor);
fim;
procedimento TSpinEdit.SetMinValue(Valor: LongInt);
começar
se Valor <= FMaxValue então
FMinValor := Valor;
SetValue(Self.Valor);
fim;
Existe claramente uma função CheckValue em Private, deixe-me dar uma olhada.
função TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
começar
Resultado := NovoValor;
se (FMaxValue <> FMinValue) então
começar
se NovoValor < FMinValue então
Resultado := FMinValor
senão se NewValue > FMaxValue então
Resultado:=FMaxValue;
fim;
Encontrado o motivo do Bug 3. O autor deste controle não julgou se FMaxValue e FMinValue são iguais.
Alterar para:
função TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
começar
Resultado := NovoValor;
se (FMaxValue <> FMinValue) então
começar
se NovoValor < FMinValue então
Resultado := FMinValor
senão se NewValue > FMaxValue então
Resultado:=FMaxValue;
fim
outro
começar
Resultado:=FMaxValor;
fim;
fim;