Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Избавление от Дополнительной Строки при Работе с TStrings в Delphi

Delphi , Компоненты и Классы , Списки

При работе с текстовыми файлами в среде разработки Delphi, разработчики часто сталкиваются с проблемой появления дополнительной пустой строки в конце файла. Это может быть неприятным сюрпризом, особенно если такая строка не нужна и мешает дальнейшей обработке данных. Рассмотрим, как решить эту проблему на примере класса TStrings, который используется для работы со списками строк.

Проблема

Когда мы используем метод TStrings.LoadFromFile для чтения содержимого файла и затем применяем TStrings.SaveToFile для записи данных обратно в файл, может появиться дополнительная пустая строка в конце файла. Это происходит даже в случае, если в исходном файле такая строка отсутствовала.

Пример кода, демонстрирующего проблему:

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.LoadFromFile('.\input.txt');

    // ...

    Lines.SaveToFile('.\output.txt');
  finally
    Lines.Free;
  end;
end;

Решение для Delphi 10.1 и новее

В версиях Delphi 10.1 (Berlin) и новее, проблема может быть решена с помощью свойства TrailingLineBreak. Это свойство по умолчанию установлено в True, что означает, что текст будет содержать символ перевода строки после последней строки. Если установить это свойство в False, то перевода строки в конце текста не будет.

Lines.TrailingLineBreak := False;

Альтернативное решение для старых версий Delphi

Для старых версий Delphi, например, Delphi 2007 или Delphi XE7, можно создать подкласс TStringList и переопределить виртуальную функцию GetTextStr. Это позволит контролировать, будет ли в тексте присутствовать дополнительный перевод строки.

uses
  Classes;

type
  TMyStringList = class(TStringList)
  private
    FIncludeLastLineBreakInText : Boolean;
  protected
    function GetTextStr: string; override;
  public
    constructor Create(AIncludeLastLineBreakInText : Boolean = False); overload;
    property IncludeLastLineBreakInText: Boolean read FIncludeLastLineBreakInText write FIncludeLastLineBreakInText;
  end;

// Реализация класса TMyStringList
// ...

Пример использования созданного класса:

procedure TForm1.Button1Click(Sender: TObject);
var
  Lines : TStrings;
begin
  Lines := TMyStringList.Create(False);
  try
    Lines.LoadFromFile('.\input.txt');
    Lines.SaveToFile('.\output.txt');
  finally
    Lines.Free;
  end;
end;

Дополнительные решения

Также было предложено просто обрезать последний символ строки, используя метод Trim:

Lines.Text := Trim(Lines.Text);

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

Заключение

Как видно из вышеизложенного, существует несколько способов справиться с проблемой дополнительной строки при работе с TStrings в Delphi. Выбор конкретного решения зависит от версии используемой среды разработки и конкретных требований проекта.

Создано по материалам из источника по ссылке.

При работе с текстовыми файлами в среде разработки Delphi, разработчики могут столкнуться с необходимостью удаления дополнительной пустой строки при использовании класса `TStrings`, что является распространенной проблемой при сохранении файлов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 09:39:21/0.0061540603637695/0