Delphi 有没有办法让TStringList.CommaText不使用引号转义逗号?

Delphi 有没有办法让TStringList.CommaText不使用引号转义逗号?,delphi,code-generation,escaping,tstringlist,Delphi,Code Generation,Escaping,Tstringlist,我正在做一些代码生成的工作,我需要做的一件事是创建一个函数调用,其中一个参数是函数调用,如下所示: result := Func1(x, y, Func2(a, b, c)); TStringList.CommaText对于生成参数列表非常有用,但是当我遍历树来构建外部函数调用时,我得到的结果如下所示: result := Func1(x, y, "Func2(a, b, c)"); 它引用了第三个参数,因为它包含逗号,并且生成了无效代码。但是我不能做一些简单的事情,比如用空字符串替换所有的

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

result := Func1(x, y, Func2(a, b, c));
TStringList.CommaText对于生成参数列表非常有用,但是当我遍历树来构建外部函数调用时,我得到的结果如下所示:

result := Func1(x, y, "Func2(a, b, c)");
它引用了第三个参数,因为它包含逗号,并且生成了无效代码。但是我不能做一些简单的事情,比如用空字符串替换所有的双引号,因为函数参数很可能是一个包含双引号的字符串。有没有办法让它不漏掉包含逗号的行

  • 构建一个“不太可能的字符”数组:不可设置关键帧的字符,如-,甚至不可打印的字符,如#129、#141、#143、#144
  • 验证您的
    StringList.CommaText
    中没有第1个不可能的位置。或者移动到下一个位置,直到您的
    StringList.CommaText
    中没有使用一个。(断言你找到了一个)
  • 将此不太可能的字符用作StringList的
    QuoteChar
  • 获取
    StringList.DelimitedText
    。您将获得函数参数周围的
    QuoteChar
    ,例如:
    result:=Func1(x,y,†Func2(a,b,c)†)
  • 用空字符串替换不太可能出现的
    QuoteChar
    (此处

  • 编写自己的方法,将
    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
    ,会发生什么情况?

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


    使用
    StrictDelimiter
    控制读取属性时是否进行引用。如果这是真的,引用就根本不会发生。也许Delphi对待该属性的方式是相同的。

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

    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; 变量 利斯特:特林格利斯特; s、 LOutput:字符串; 开始 LList:=TStringList.Create; 尝试 添加('x'); 添加('y'); 添加('Func2(a,b,c)'); 因为我不知道该怎么做 百叶窗:=百叶窗+s+','; 设置长度(百叶窗,长度(百叶窗)-2; m1.AddLine('result:=Func1('+LOutput+')); 最后 免费的; 结束; 结束;
    使用Unicode版本的AnsiExtractQuotedStr删除引号怎么样?

    也有同样的问题,下面是我如何解决的:

    s := Trim(StringList.Text)
    

    就这些;-)

    你可以用正则表达式解析它?…然后我会有两个问题:P@Remko,他在生成代码,而不是解析代码。如果立即解析刚刚生成的代码是一种常见的做法,那么你就错了。我相信TStringList内置的代码是“接近,但没有雪茄”。答案是“写你自己的”,这非常简单。:-)@罗布:没错。我将解析这段代码,但要等到以后。Delphi 2010的VCL在向输出字符串添加元素之前调用
    AnsiquetDSTR
    StrictDelimiter
    在Delphi中完全不影响引用。Delphi有一个StrictDelimiter属性,但它的工作方式有点不同。看起来AV发生在
    QuoteChar=#0
    上。这真是令人惊讶。我忍不住想到了“一系列不太可能的人物”,这让我想起了“一系列不幸的事件”。-)