3

我正在做一些代码生成工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示:

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

TStringList.CommaText 对于生成参数列表非常有用,但是当我遍历树来构建外部函数调用时,我最终得到的结果如下所示:

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

它引用了第三个参数,因为它包含逗号,并且产生了无效代码。但是我不能做一些简单的事情,比如 StringReplace all double quotes with empty strings,因为函数参数很可能是一个内部带有双引号的字符串。有没有办法让它不逃避包含逗号的行?

4

7 回答 7

7

您可以设置QuoteChar为一个空格,并且您只会在输出中获得一些额外的空格,这通常是可以的,因为通常不期望生成的代码看起来很漂亮。但是,字符串文字会受到影响;他们将插入额外的空格,从而更改字符串的值。

Free Pascal 的TStrings用于控制在读取属性StrictDelimiter时是否发生引用。DelimitedText如果为true,则根本不会进行引用。也许 Delphi 以同样的方式对待该属性。

于 2010-06-10T18:55:02.557 回答
2
于 2010-06-10T18:09:15.843 回答
2

使用 Unicode 版本的 AnsiExtractQuotedStr 删除引号怎么样?

于 2010-06-10T23:32:37.823 回答
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

于 2010-06-10T18:54:48.577 回答
1

我们编写了一个 TStringList 的后代类,其中重新实现了 DelimitedText 属性。您可以从原始实现中复制大部分代码。

于 2010-06-10T19:41:52.960 回答
0
变量
  LList:TStringList;
  s,L输出:字符串;
开始
  LList := TStringList.Create;
  尝试
    LList.Add('x');
    LList.Add('y');
    LList.Add('Func2(a, b, c)');
    对于 LList 中的 s 做
      LOutput := LOutput + s + ', ';
    SetLength(LOutput, 长度(LOutput) - 2);
    m1.AddLine('结果 := Func1(' + LOutput + ')');
  最后
    LList.免费;
  结尾;
结尾;
于 2010-06-10T22:42:59.193 回答
0

遇到了同样的问题,我是这样解决的:

s := Trim(StringList.Text)

就这样 ;-)

于 2016-03-23T12:15:48.513 回答