Страницы

Поиск по вопросам

среда, 19 декабря 2018 г.

Проверить, что переменной типа Integer было присвоено значение

Как в Delphi проверить, что Integer переменной было ранее присвоено какое либо значение ?


Ответ

По-настоящему - никак. Integer не хранит нигде никакой дополнительной информации, кроме тех 4 байт что на него выделено.
Конечно, вы можете присвоить переменной какое-либо "волшебное" значение, которое никогда не встречается в ваших данных (например -1, или MaxInt, или 777777). И в простом приложении я бы так и сделал. Но однажды такое значение может вам встретиться и программа даст сбой.
Также можно использовать другой готовый тип данных, типа Variant
Более правильный вариант - хранить информацию о присвоении в другой переменной, например IsIntegerAssigned: Boolean; и поддерживать ее состояние при каждой операции. Но это более громоздко и неудобно.
Современный вариант - можно положить обе переменных в record и переопределить присвоение, примерно так:
TMyInteger = record private fValue: Integer; fIsChanged: Boolean; public // Присвоение Integer class operator Implicit(const A: Integer): TMyInteger; // Чтение значения. Не помню, можно ли так же через неявную конвертацию или нет property Value: Integer read fValue; property IsChanged: Boolean read fIsChanged; // Тут еще надо переопределить конструктор New, который будет заполнять поля нулями // А можно сделать fIsChanged: string; тогда поле будет пустым при первом обращении) end;
....
class operator TMyInteger.Implicit(const A: Integer): TMyInteger; begin Result.fValue := A; Result.fIsChanged := True; end;
I := TMyInteger.New; I := 45; Assert(I.IsChanged, 'I is changed');
Ну и конечно убер-вариант - положить в класс.

Комментариев нет:

Отправить комментарий