2010-06-10 69 views
2

我做的代碼生成一些工作,我需要做的事情之一就是創建一個函數調用其中的一個參數是一個函數調用,就像這樣:任何方式來獲取TStringList.CommaText不能用引號轉義逗號?

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

TStringList.CommaText是產生的參數列表非常有用的,但是當我遍歷樹建外函數調用,我結束了這個樣子的:

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

它引用了第三個參數,因爲它包含逗號,和產生無效的代碼。但是我不能做一些簡單的事情,比如StringReplace帶空字符串的雙引號,因爲函數參數很可能是一個帶雙引號的字符串。有沒有辦法讓它不能逃避包含逗號的行?

+0

你可以用正則表達式解析呢? – Remko 2010-06-10 18:30:24

+6

...然後我會遇到兩個問題。 :P – 2010-06-10 18:31:47

+2

@Remko,他*生成*代碼,不解析它。如果通常的做法是立即解析你剛剛生成的代碼,那麼你做錯了。 – 2010-06-10 18:57:30

回答

1
  1. 構建的 「不可能字符」 的數組:非可設置關鍵點狀或甚至不可打印的像#129 ,#141,#143,#144
  2. 確認您的StringList.CommaText中沒有第一個不太可能。或移動到下一個不太可能,直到你有一個不使用你的StringList.CommaText。 (聲明你找到一個)
  3. 使用這個不可能的字符作爲您的StringList的QuoteChar
  4. 獲取StringList.DelimitedText。你會得到周圍的功能參數如QuoteCharresult := Func1(x, y, †Func2(a, b, c)†);
  5. 更換不大可能QuoteChar(這裏)由空字符串...
+1

我忍不住「一系列不太可能的人物」讓我想起「一系列不幸的事件」。 :-) – 2010-06-11 21:27:11

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會發生什麼?

+0

看起來像一個AV發生在'QuoteChar =#0'。這是令人驚訝的。 – 2010-06-10 22:33:48

+1

或將QuoteChar設置爲空格 – 2010-06-10 22:43:19

4

您可以將QuoteChar設置爲空格,並且您只需在輸出中獲得一些額外的空格,這通常是可以的,因爲生成的代碼通常不會看起來很漂亮。但是,字符串文字會受到影響;他們會插入額外的空格,改變字符串的值。

Free Pascal's TStrings class使用StrictDelimiter來控制是否在讀取DelimitedText屬性時發生引用。當它是true,報價根本不會發生。也許德爾福以同樣的方式對待那個財產。

+1

在將元素添加到輸出字符串之前,Delphi 2010的VCL調用'AnsiQuotedStr'。在Delphi中'StrictDelimiter'完全不影響引用。 – afrazier 2010-06-10 18:59:05

+0

德爾福有一個StrictDelimiter屬性,但它有點不同。 – 2010-06-10 19:15:02

1

我們寫了一個TStringList的子類,其中重新實現了DelimitedText屬性。您可以複製原始實現中的大部分代碼。

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; 
1

如何使用Unicode版本的AnsiExtractQuotedStr刪除引號?

+0

+1對於純粹的kludge因子:D希思羅賓遜風格ftw! – 2010-06-11 09:18:14

0

有同樣的問題,以下是我固定它:

s := Trim(StringList.Text) 

這一切;-)