Заметки · 25.08.2023

False значит ноль

Немного позанудствуем про тонкости работы с IDE Lazarus и Object Pascal.

Наверное, сталкивались с ситуацией, когда при использовании функции BoolToStr (входит в состав модуля sysutils) ответ True превращается в -1. Например, вот так:

Технически, это правильно, потому что любое значение отличное от 0 это истина. Конечно, это неудобно, но всё же такая форма ответа будет встречаться, если в параметрах функции BoolToStr не было указано явного значения.

Для наглядности создадим проект и поместим на форму кнопку:

Теперь напишем простейшую логическую функцию, которая будет принимать строчный параметр year. В операторе сравнения принимаемый параметр будет сравниваться со значением 2023 и исходя из этого будет возвращаться значение True или False.

Функция будет выглядеть так:

function BooleanFunction(year:string):boolean;
begin
  if year='2023' then result:=true else result:=false;
end; 

Повесим на кнопку процедуру с выводом сообщения:

procedure Tmain_form.Button1Click(Sender: TObject);
begin
  ShowMessage(BooltoStr(BooleanFunction('2023')));
end;

Так как в функции BoolToStr сейчас только один параметр, а именно функция BooleanFunction(‘2023’) — в сообщении будет всё тот же -1 для True и 0 для False.

Добавим в процедуру две константы с соответствующим значением — ok и notok. Отредактируем BoolToStr в соответствии с документацией:

procedure Tmain_form.Button1Click(Sender: TObject);
const
  ok='Всё правильно!';
  notok='Что-то пошло не так...';
begin
  ShowMessage(BooltoStr(BooleanFunction('2023'), ok, notok));
end;

Порядок параметров функции таков: функция, значение истины, значение лжи.

В итоге получаем:

Закрываем программу. Изменяем 2023 на 2024:

procedure Tmain_form.Button1Click(Sender: TObject);
const
  ok='Всё правильно!';
  notok='Что-то пошло не так...';
begin
  ShowMessage(BooltoStr(BooleanFunction('2024'), ok, notok));
end;

Пересобираем. По нажатию на кнопку выходит соответствующее сообщение:

И больше не нужны никакие дополнительные операторы сравнения ответов от функций.

А если необходимо получить именно классическую пару True-False — можно указать в функции только параметр истины и BoolToStr сам разберётся, что именно от него хотят.

procedure Tmain_form.Button1Click(Sender: TObject);
begin
  ShowMessage(BooltoStr(BooleanFunction('2024'), True));
end;

После пересборки проекта процедура выдаст вот такое окно: