Как в 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');
Ну и конечно убер-вариант - положить в класс.
Комментариев нет:
Отправить комментарий