Использование SysUtils.WrapText () со строками, содержащими одинарные кавычки - PullRequest
6 голосов
/ 29 марта 2019

Я пытаюсь использовать функцию SysUtils.WrapText() со строкой, содержащей экранированные одинарные кавычки, и получаю неожиданный результат.

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.Text := WrapText('Can''t format message, message file not found', 15);
    ShowMessage(Lines.Text);
  finally
    Lines.Free;
  end;
end;

Кажется, чтофункция вообще не переносит строку, если строка содержит символ апострофа.

Я также пытался использовать код #39 вместо символа одинарных кавычек, но проблема сохраняется.Кроме того, я проверил Lines.Count, и это 1.

image

Я попытался удалить символ одинарной кавычки:

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.Text := WrapText('Cant format message, message file not found', 15);
    ShowMessage(Lines.Text);
  finally
    Lines.Free;
  end;
end;

И он начал оборачивать строку, как и ожидалось:

image

Мне интересно, почему это происходит, и как я должен делать для использованияфункция WrapText() с такими строками?

Ответы [ 2 ]

5 голосов
/ 29 марта 2019

То, что вы описываете, является преднамеренным поведением .

В Delphi XE и более ранних версиях WrapText () документация включала это утверждение:

WrapText не вставляет разрыв во встроенную строку в кавычках (поддерживаются как одинарные кавычки, так и двойные кавычки).

В Delphi XE2 и далее эта инструкция не указывается в документации, но поведение по-прежнему реализовано в RTL.

Я открыл билет в Embarcadero по поводу этого упущения:

RSP-24114: Важное предложение о встроенных строках в кавычках отсутствует в документации WrapText

1 голос
/ 29 марта 2019

В 10.3.1 источник включает код для обработки символов кавычек, как двойных, так и одинарных кавычек, который просто игнорирует текст между ними.Поэтому одним из решений будет использование апострофа, отличного от символа одинарной кавычки.Вторым было бы избежать использования сокращений.Начало источника функции:

function WrapText(const Line, BreakStr: string; const BreakChars: TSysCharSet;
  MaxCol: Integer): string;
const
  QuoteChars = ['''', '"'];
  FirstIndex = Low(string);
  StrAdjust = 1 - Low(string);
var
...

Одна опция:

    Lines.Text := WrapText('Can`t format message, message file not found', 15);

Вторая опция:

    Lines.Text := WrapText('Cannot format message, message file not found', 15);
...