Заметки · 21.03.2025

Собралось, но не взлетело

Погряз в разборках на одном из файловых серверов и совсем забыл о том, с чего всё начиналось в том или ином виде. Речь о проектах прямиком из IDE Lazarus.

Изначально с ошибкой, о которой я поведу здесь речь, я столкнулся ещё летом, когда пришлось обрабатывать текстовые файлы в маленькой консольной программе. Попробую смоделировать ситуацию и показать, как избавиться от ошибки ElnOutError: File not open.

Данная ошибка побеспокоила меня в проекте Программа:

Предположим, что целью программы является запись и чтение текстового файла. Для записи я написал максимально простую функцию WriteToFile, а вот чтение из файла организовал с помощью функции ReadFileToString из модуля FileUtil.

Чтобы всё это заработало на этапе сборки — добавим зависимость от пакета LazUtils.

Основной модуль программы у меня выглядит так:

program test;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,
  FileUtil,
  Windows
  { you can add units after this };

var
   text:string;
   f: textfile;

{$R *.res}

// Функция записи текста в файл
function WriteToFile(filename:string; text:string):boolean;
begin
  assign(f,filename);
  rewrite(f);
  writeln(f,text);
  close(f);
end;

begin
  // Установим заголовок консоли
     SetConsoleTitle('Console Title');

  // Запишем текст в файл
     WriteToFile('test.txt', 'test');

  // Считаем текст из файла
     text:=ReadFileToString('test.txt');

  // Выведем текст в консоль
     WriteLn(text);

  // Ждём реакции пользователя
     ReadLn;
end.

Успешно компилирую, запускаю… И вдруг: An unhandled exception occured at… ElnOutError: File not open…

Файл на месте, текст в файле тоже. Функция WriteToFile успешно отработала. Что может быть не так?

Забегая вперёд, отмечу: оказалось, что в параметрах проекта необходимо было убрать галочку с параметра компилятора FPCГрафическое приложение Win32 (-WG).

Изначально параметры проекта в разделе Настройка и целевая платформа выглядят так:

Снимаем галку и окействуем:

Пересобираем проект и запускаем программу:

Записали в файл слово test и считали его же. Всё отлично отработало.