Исправление ошибки 105 при записи TStringList в Delphi 2010
В процессе разработки программного обеспечения на языке Object Pascal в среде Delphi часто возникают различные ошибки, которые требуют внимательного анализа и корректного решения. Одной из таких ошибок является ошибка 105, которая обычно указывает на то, что файл не открыт для записи. В данной статье мы рассмотрим, как исправить подобную ошибку на примере работы с TStringList в Delphi 2010.
Описание проблемы
Разработчик столкнулся с ошибкой 105 при попытке записи данных из TStringList в файл. Ошибка возникает в момент выполнения операции WriteLn. Это происходит из-за того, что функция WriteLn не получает файл, в который необходимо записать данные, что приводит к попытке записи в стандартный вывод (консоль), который в данном случае недоступен.
Оригинальный код
Вот пример кода, который приводит к ошибке 105:
procedure TForm1.Panel23Click(Sender: TObject);
var
contents: TStringList;
i: integer;
filestream: TFileStream;
begin
// Загрузка данных в TStringList
contents := TStringList.Create;
filestream := TFileStream.Create((GetAppData + '\RFA\fhpre.ini'), fmShareDenyNone);
Contents.LoadFromStream(filestream);
filestream.Destroy();
// Поиск соответствующего пресета
i := 0;
if ComboBox4.Text <> Contents[i] then
begin
Repeat
i := i + 1;
Until ComboBox4.Text = Contents[i];
end;
contents.Delete(i); // Удаление названия пресета
contents.Delete(i); // Удаление строки с кодом пресета
// Запись TStringList обратно в файл
AssignFile(fil, (GetAppData + '\RFA\fhpre.ini'));
ReWrite(fil);
for i := 0 to Contents.Count - 1 do
WriteLn(Contents[i]); // Ошибка 105 здесь
CloseFile(fil);
Contents.Free;
end;
Исправление ошибки
Чтобы исправить ошибку 105, необходимо передать в функцию WriteLn файл, в который нужно записать данные из TStringList. Исправленный код будет выглядеть следующим образом:
// Запись TStringList обратно в файл
AssignFile(fil, (GetAppData + '\RFA\fhpre.ini'));
ReWrite(fil);
for i := 0 to Contents.Count - 1 do
WriteLn(fil, Contents[i]); // Теперь указываем файл для записи
CloseFile(fil);
Также стоит отметить, что начиная с Delphi 2009, функции Read/WriteLn не поддерживают Unicode, поэтому для работы с Unicode-текстами следует использовать другие методы.
Альтернативный подход
Вместо использования функций WriteLn и ReadLn для работы с файлами, рекомендуется использовать методы LoadFromFile и SaveToFile класса TStringList. Это упростит код и сделает его более надежным. Пример использования этих методов:
// Загрузка данных в TStringList
contents := TStringList.Create;
contents.LoadFromFile((GetAppData + '\RFA\fhpre.ini'));
// ... (код по удалению строк из TStringList)
// Сохранение измененных данных в файл
contents.SaveToFile((GetAppData + '\RFA\fhpre.ini'));
contents.Free;
Также стоит рассмотреть использование класса TIniFile для работы с файлами в формате INI, что может упростить управление конфигурационными данными.
Заключение
Исправление ошибки 105 заключается в правильной передаче файла в функцию WriteLn. Для удобства и безопасности использования рекомендуется применять методы LoadFromFile и SaveToFile класса TStringList. В случае работы с INI-файлами стоит рассмотреть использование класса TIniFile.
Разработчик в Delphi 2010 столкнулся с ошибкой 105 при попытке записи данных из TStringList в файл из-за неправильного использования функции WriteLn, которая не получает файл для записи.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.