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)");
它引用了第三个参数,因为它包含逗号,并且生成了无效代码。但是我不能做一些简单的事情,比如用空字符串替换所有的双引号,因为函数参数很可能是一个包含双引号的字符串。有没有办法让它不漏掉包含逗号的行
StringList.CommaText
中没有第1个不可能的位置。或者移动到下一个位置,直到您的StringList.CommaText
中没有使用一个。(断言你找到了一个)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
上。这真是令人惊讶。我忍不住想到了“一系列不太可能的人物”,这让我想起了“一系列不幸的事件”。-)