3

私はコード生成でいくつかの作業を行っています。私がする必要があることの 1 つは、次のように、パラメーターの 1 つが関数呼び出しである関数呼び出しを作成することです。

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

TStringList.CommaText はパラメータ リストの生成に非常に役立ちますが、ツリーをたどって外部関数呼び出しを作成すると、最終的に次のようになります。

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

3 番目の引数にカンマが含まれており、無効なコードが生成されたため、引用しています。しかし、関数の引数が内部に二重引用符を含む文字列になる可能性が十分にあるため、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

AnsiExtractQuotedStr の Unicode バージョンを使用して引用符を削除するのはどうですか?

于 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

DelimitedText プロパティを再実装した TStringList の子孫クラスを作成しました。元の実装からほとんどのコードをコピーできます。

于 2010-06-10T19:41:52.960 に答える
0
変数
  LList: TStringList;
  s、LOutput: 文字列;
始める
  LList := TStringList.Create;
  試す
    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 + ')');
  最後に
    LList.Free;
  終わり;
終わり;
于 2010-06-10T22:42:59.193 に答える