我正在做一些代码生成工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示:
result := Func1(x, y, Func2(a, b, c));
TStringList.CommaText对于生成参数列表非常有用,但是当我遍历树以构建外部函数调用时,我最终得到的结果如下所示:
result := Func1(x, y, "Func2(a, b, c)");
它引用了第三个参数,因为它包含逗号,并且产生了无效的代码。但是我不能像StringReplace那样简单地做一些带空字符串的双引号,因为函数参数很可能是一个带双引号的字符串。有没有办法让它不能逃避包含逗号的行?
答案 0 :(得分:4)
您可以将QuoteChar
设置为空格,并且您只需在输出中获得一些额外的空格,这通常是正常的,因为生成的代码通常不会看起来很漂亮。但是,字符串文字会受到影响;他们会插入额外的空格,改变字符串的值。
Free Pascal's TStrings
class使用StrictDelimiter
来控制在阅读DelimitedText
属性时是否发生引用。当它是 true 时,根本不会发生引用。也许德尔福以同样的方式对待这个财产。
答案 1 :(得分:1)
StringList.CommaText
中的第一个不太可能。或者移动到下一个不太可能,直到你的StringList.CommaText
没有使用。 (断言你找到了一个)QuoteChar
StringList.DelimitedText
。您将获得QuoteChar
围绕功能参数,例如:result := Func1(x, y, †Func2(a, b, c)†);
QuoteChar
(此处†)...... 答案 2 :(得分:1)
编写您自己的方法,将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
会发生什么?
答案 3 :(得分:1)
我们编写了一个TStringList的后代类,其中重新实现了DelimitedText属性。您可以复制原始实现中的大部分代码。
答案 4 :(得分:1)
如何使用Unicode版本的AnsiExtractQuotedStr删除引号?
答案 5 :(得分:0)
var LList: TStringList; s, LOutput: string; begin LList := TStringList.Create; try LList.Add('x'); LList.Add('y'); LList.Add('Func2(a, b, c)'); for s in LList do LOutput := LOutput + s + ', '; SetLength(LOutput, Length(LOutput) - 2); m1.AddLine('result := Func1(' + LOutput + ')'); finally LList.Free; end; end;
答案 6 :(得分:0)
有同样的问题,我在这里修理它:
s := Trim(StringList.Text)
全部; - )