Sto cercando di eseguire il debug del comportamento che è apparso solo quando la mia app di grandi dimensioni - funzionante bene in XE3 - viene eseguita dopo la compilazione con XE4. Il problema sembra causare alcune stringhe tra virgolette (es. "MyString") per mantenere le loro quotazioni anche dopo essere state "de-quotate" da TPageProducer in Web.HTTPProd. Ad esempio, si consideri il codice qui sotto che è piccolo estratto da questa Delphi unità di fonte Web.HTTPApp:Perché TPageProducer non rimuove le virgolette dalle stringhe?
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;
vedo questo chiamato quando uso TPageProducer e posso vedere la mia buona stringa di origine andare nella routine ExtractHeaderFields sopra e quindi nella funzione 'DoStripQuotes'. Entrando in DoStripQuotes e guardando 'Result' si dimostra che non cambia, anche quando viene chiamato Result.Remove (per togliere la citazione). Quando prendo questa routine 'DoStripQuotes' in una semplice app di test, non verrà compilata, dicendomi che 'Result.Ancora' non è consentito. Presumo quindi che Result, sebbene sia definito come 'string', deve essere un altro tipo di stringa nel contesto di Web.HTTPProd.
Quindi penso che forse questo è qualcosa a che fare con le "stringhe immutabili" di cui ho sentito parlare. Ho letto questo SO question e, anche se ho capito bene, potrei fare un consiglio più pratico.
In particolare, vorrei risposte alle seguenti domande:
- Che tipo di 'stringa' è 'Risultato' se è consentito l'Result.Length notazione?
- C'è un modo in cui posso dire al compilatore di usare la compatibilità XE3 per un'unità? (Questo potrebbe permettermi di vedere dove il problema sta originando). Ho risposto {$ ZEROBASEDSTRINGS ON}/OFF ma questo sembra causare ancora più caos e non so cosa sto facendo!
Grazie per qualsiasi aiuto.
LATER EDIT: come indicato nella risposta accettata di seguito, si tratta di un bug nell'unità VCL Web.HTTPApp.pas che dovrebbe contenere "Result: = Result.Remove (I, 1)" in due punti attorno alla riga 2645 e non "Result.Remove (I, 1)"
Hai assolutamente ragione David, è quello che è stato: un bug nel Web.Help di Delphi che ha lasciato il compito a Risultato. Grazie anche per il tutorial. –
Rapporto QC inviato. Verificherò in seguito se questo è stato risolto nell'aggiornamento n. 1. –
Sembra che non ci sia un'opzione del compilatore per un avviso quando si ignora un risultato di una funzione. In questo caso dovrebbe essere stato sollevato anche un errore del compilatore (dato che c'era un'opzione per contrassegnare 'TStringHelper' con tale direttiva). –