我試圖調試只有當我的大型應用程序 - 在XE3中正常工作 - 纔在與XE4編譯後運行時出現的行爲。這個問題似乎導致一些帶引號的字符串(例如「MyString」)即使在Web.HTTPProd中被TPageProducer「取消引用」之後也能保留引號。例如,請考慮下面的代碼是從這個Delphi源單元Web.HTTPApp小摘錄:爲什麼TPageProducer不能從字符串中刪除引號?
procedure ExtractHeaderFields(Separators, _WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings; Decode: Boolean; StripQuotes: Boolean = False);
{$ENDIF NEXTGEN}
var
Head, Tail: PChar;
EOS, InQuote, LeadQuote: Boolean;
QuoteChar: Char;
ExtractedField: string;
{$IFNDEF NEXTGEN}
WhiteSpaceWithCRLF: TSysCharSet;
SeparatorsWithCRLF: TSysCharSet;
{$ENDIF !NEXTGEN}
function DoStripQuotes(const S: string): string;
var
I: Integer;
InStripQuote: Boolean;
StripQuoteChar: Char;
begin
Result := S;
InStripQuote := False;
StripQuoteChar := #0;
if StripQuotes then
begin
for I := Result.Length - 1 downto 0 do
if Result.Chars[I].IsInArray(['''', '"']) then
if InStripQuote and (StripQuoteChar = Result.Chars[I]) then
begin
Result.Remove(I, 1);
InStripQuote := False;
end
else if not InStripQuote then
begin
StripQuoteChar := Result.Chars[I];
InStripQuote := True;
Result.Remove(I, 1);
end
end;
end;
我看到這個叫當我使用TPageProducer,我可以看到我的好源字符串進入ExtractHeaderFields常規及以上然後進入「DoStripQuotes」功能。進入DoStripQuotes並觀看「結果」表明它不會改變,即使調用了Result.Remove(去除引號)。當我將這個'DoStripQuotes'例程發佈到一個簡單的測試應用程序時,它不會編譯,告訴我'Result.anything'是不允許的。然後我假定Result,雖然它被定義爲'string',但它必須是Web.HTTPProd上下文中的另一種類型的字符串。
所以我開始想,也許這與我聽說過的'不可變字符串'有關。我讀了這個SO question,儘管我明白了,但我可以用更實際的建議來做。
具體來說,我想回答以下幾個問題:
- 如果符號Result.Length允許什麼類型的「字符串」的是「結果」?
- 有沒有一種方法可以讓編譯器使用'XE3'兼容性? (這可能會讓我看到問題的起源點)。我試過{$ ZEROBASEDSTRINGS ON/OFF),但這似乎導致了更多的混亂,我不知道我在做什麼!
感謝您的幫助。
後來編輯:正如在下面接受的答案中指出的那樣,這是VCL單元Web.HTTPApp.pas中的一個錯誤,它應該在2645行周圍的兩個地方讀取「Result:= Result.Remove(I,1)」,不是「Result.Remove(I,1)」
你是絕對正確的大衛,就是這樣 - Delphi的Web.HTTPApp中的一個漏洞,將結果遺漏給了Result。感謝您的教程。 –
提交QC報告。稍後我會檢查這是否在更新#1中得到修復。 –
當忽略函數結果時,似乎沒有用於警告的編譯器選項。在這種情況下,即使是編譯器錯誤也應該引發(因爲有一個選項可以用這樣的指令標記「TStringHelper」)。 –