Любой способ получить TStringList.CommaText, чтобы не экранировать запятые с кавычками?
Я делаю некоторую работу с генерацией кода, и одна из вещей, которые мне нужно сделать, это создать вызов функции, где одним из параметров является вызов функции, например, так:
result := Func1(x, y, Func2(a, b, c));
TStringList.CommaText очень полезен для генерации списков параметров, но когда я пересекаю дерево для построения вызова внешней функции, то, что я получаю в итоге, выглядит так:
result := Func1(x, y, "Func2(a, b, c)");
Он цитирует третий аргумент, потому что он содержит запятые, и это приводит к неправильному коду. Но я не могу сделать что-то упрощенное, например StringReplace, все двойные кавычки с пустыми строками, потому что вполне возможно, что аргументом функции может быть строка с двойными кавычками внутри. Есть ли способ сделать так, чтобы он не выходил за пределы строк, содержащих запятые?
7 ответов
- Создайте массив "неправдоподобных символов": без ключа, например †, ‡ или даже без возможности печати, например #129, # 141, # 143, # 144.
- Убедитесь, что у вас нет 1-го маловероятного где-либо в вашем
StringList.CommaText
, Или переходите к следующему маловероятно, пока вы не получите один не используется в вашемStringList.CommaText
, (Утверждаю, что вы найдете один) - Используйте этот маловероятный символ как
QuoteChar
для вашего StringList - Получить
StringList.DelimitedText
, Вы получитеQuoteChar
вокруг параметров функции, таких как:result := Func1(x, y, †Func2(a, b, c)†);
- Заменить маловероятное
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)
это все;-)