Хотите верьте, хотите нет, но в компонентах, поставляемых с Delphi, есть ошибка, которую нельзя игнорировать.
Сначала я не подумал, что в системе управления Delphi есть ошибка. Это было настолько неприятно, что я много раз отлаживал это, а потом обнаружил после трассировки.
Видите элемент управления TSpinEdit на странице «Образцы»? Он имеет свойства MaxValue (максимальное значение) и MinValue (минимальное значение).
Ошибка 1: сначала установите значение Value равным 7, затем установите MaxValue равным 5 и MinValue равным 0, но значение не изменится автоматически! ! !
Ошибка 2: вы установили MaxValue на -7, а MinValue на 7. Вы это видели? Максимальное значение может быть меньше минимального значения.
Ошибка 3: если максимальное и минимальное значения равны, значение можно установить случайно...
Я не понимаю, как автор в то время спроектировал столько ошибок, и не понимаю, почему Borland принял на вооружение этот элемент управления. Может быть, привратник Borland - GG, а этот разработчик - MM, так что...
Вернемся к делу и откроем каталог установки Delphi /Source/Samples/Spin.Pas.
Найти PROperty MaxValue: LongInt прочитать FMaxValue записать FMaxValue;
свойство MinValue: LongInt чтение FMinValue запись FMinValue;
Ошибка1 и Ошибка2 были обнаружены одновременно! Здесь нет никаких суждений, значения FMaxValue и FMinValue задаются напрямую, то есть максимальное и минимальное значения не ограничены и могут быть установлены по желанию. После установки максимального и минимального значений Значение не обновляется, что приводит к возникновению Bug1.
Изменить на:
свойство MaxValue: LongInt чтение FMaxValue запись SetMaxValue;
свойство MinValue: LongInt чтение FMinValue запись SetMinValue;
Добавьте две процедуры в Private:
процедура SetMaxValue(Значение: LongInt);
процедура SetMinValue(Значение: LongInt);
Содержание следующее:
процедура TSpinEdit.SetMaxValue(Значение: LongInt);
начинать
если Значение >= FMinValue, то
FMaxValue := Значение;
SetValue(Self.Value);
конец;
процедура TSpinEdit.SetMinValue(Значение: LongInt);
начинать
если Значение <= FMaxValue, то
FMinValue := Значение;
SetValue(Self.Value);
конец;
В Private явно есть функция CheckValue, позвольте мне взглянуть.
функция TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
начинать
Результат: = НовоеЗначение;
если (FMaxValue <> FMinValue), то
начинать
если НовоеЗначение < FMinValue, то
Результат: = FMinValue
иначе, если NewValue > FMaxValue, тогда
Результат: = FMaxValue;
конец;
Нашел причину ошибки 3. Автор этого элемента управления не проверял, равны ли FMaxValue и FMinValue.
Изменить на:
функция TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
начинать
Результат: = НовоеЗначение;
если (FMaxValue <> FMinValue), то
начинать
если НовоеЗначение < FMinValue, то
Результат: = FMinValue
иначе, если NewValue > FMaxValue, тогда
Результат: = FMaxValue;
конец
еще
начинать
Результат:=FMaxValue;
конец;
конец;