Любой способ получить TStringList.CommaText, чтобы не экранировать запятые с кавычками?

Я делаю некоторую работу с генерацией кода, и одна из вещей, которые мне нужно сделать, это создать вызов функции, где одним из параметров является вызов функции, например, так:

result := Func1(x, y, Func2(a, b, c));

TStringList.CommaText очень полезен для генерации списков параметров, но когда я пересекаю дерево для построения вызова внешней функции, то, что я получаю в итоге, выглядит так:

result := Func1(x, y, "Func2(a, b, c)");

Он цитирует третий аргумент, потому что он содержит запятые, и это приводит к неправильному коду. Но я не могу сделать что-то упрощенное, например StringReplace, все двойные кавычки с пустыми строками, потому что вполне возможно, что аргументом функции может быть строка с двойными кавычками внутри. Есть ли способ сделать так, чтобы он не выходил за пределы строк, содержащих запятые?

7 ответов

Решение
  1. Создайте массив "неправдоподобных символов": без ключа, например , или даже без возможности печати, например #129, # 141, # 143, # 144.
  2. Убедитесь, что у вас нет 1-го маловероятного где-либо в вашем StringList.CommaText, Или переходите к следующему маловероятно, пока вы не получите один не используется в вашем StringList.CommaText, (Утверждаю, что вы найдете один)
  3. Используйте этот маловероятный символ как QuoteChar для вашего StringList
  4. Получить StringList.DelimitedText, Вы получите QuoteChar вокруг параметров функции, таких как: result := Func1(x, y, †Func2(a, b, c)†);
  5. Заменить маловероятное QuoteChar (здесь ) пустыми строками...

Вы могли бы установить QuoteChar быть пробелом, и вы просто получите несколько лишних пробелов в выводе, что обычно нормально, так как сгенерированный код обычно не выглядит симпатично. Строковые литералы будут затронуты, хотя; они будут вставлены дополнительные пробелы, изменяя значение строки.

Свободный Паскаль TStrings класс использует StrictDelimiter контролировать, происходит ли цитирование при чтении DelimitedText имущество. Когда это правда, цитирование не происходит вообще. Возможно, Delphi относится к этому свойству так же.

Как насчет использования Unicode-версии AnsiExtractQuotedStr для удаления кавычек?

Напишите свой собственный метод для экспорта содержимого вашего TStringList в строку.

function MyStringListToString(const AStrings: TStrings): string;
var
    i: Integer;
begin
    Result := '';
    if AStrings.Count = 0 then
        Exit;
    Result := AStrings[0];
    for i := 1 to AStrings.Count - 1 do
        Result := Result + ',' + AStrings[i];
end;

Слишком очевидно?:-)

Кроме того, что произойдет, если вы установите StringList.QuoteChar в #0 а потом позвонил StringList.DelimitedText?

Мы написали класс-потомок TStringList, в котором переопределено свойство DelimitedText. Вы можете скопировать большую часть кода из оригинальной реализации.

вар
  LList: TStringList;
  s, LOutput: строка;
начать
  LList:= TStringList.Create;
  пытаться
    LList.Add ('х');
    LList.Add ('у');
    LList.Add('Func2(a, b, c)');
    для S в LList сделать
      LOutput: = LOutput + s + ',';
    SetLength(LOutput, длина (LOutput) - 2);
    m1.AddLine('result:= Func1(' + LOutput + ')');
  в конце концов
    LList.Free;
  конец;
конец;

Была такая же проблема, вот как я это исправил:

s := Trim(StringList.Text)

это все;-)

Другие вопросы по тегам