私は、XE3でうまく動作する大規模なアプリケーションがXE4でコンパイルされた後に実行された場合にのみ表示される動作をデバッグしようとしています。この問題は、Web.HTTPProdのTPageProducerによって「de-quoted」された後でも、引用符付きの文字列(「MyString」など)が引用符を保持するように見えます。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ルーチンに入る見ることができたとき、私はと呼ばれるこれを見ると、たとえば、その下に小さなこのデルファイソースユニットWeb.HTTPAppから抽出されたコードを考えます'DoStripQuotes'関数に入力します。 DoStripQuotesに移動して「結果」を見ると、Result.Removeが呼び出されても(引用符を削除するために)変更されないことが示されます。この「DoStripQuotes」ルーチンを単純なテストアプリケーションに取り込むと、コンパイルされず、「Result.anything」が許可されていないことがわかります。私はその結果を仮定しますが、 'string'はWeb.HTTPProdのコンテキスト内の別のタイプの文字列でなければなりません。
これは私が聞いたことのある「不変な文字列」と関連するかもしれないと思うかもしれません。私はこのことを約SO questionと読んでいますが、私は要点を得ていますが、もっと実用的なアドバイスをすることができました。
具体的には、私は次の質問に対する答えをしたいと思います:
- 表記Result.Lengthが許可されている場合は、「結果は」「文字列」のタイプは何?
- ユニットに「XE3」互換性を使用するようにコンパイラに指示する方法はありますか? (これにより、問題が発生している場所を知ることができます)。私は$ {ZEROBASEDSTRINGS ON}/OFFをやったことがありますが、これはもっと混乱の原因と思われ、私は何をしているのか分かりません!
ありがとうございました。
次の受諾された回答に記載されているように、これはVCLユニットWeb.HTTPApp.pasのバグで、2645行目の2か所で "Result:= Result.Remove(I、1)
あなたはまさにデビッドです。それはデルファイのWebのバグです.HTTPAppはResultへの割り当てを取りやめました。チュートリアルもありがとう。 –
品質報告書が提出されました。更新#1でこれが修正されたかどうかを後で確認します。 –
関数の結果を無視すると、警告のコンパイラオプションがないようです。この場合、コンパイラエラーが発生しているはずです(このようなディレクティブで 'TStringHelper'をマークするオプションがあれば)。 –