2012-01-07 4 views
20

im lavorando su Delphi 7 e stavo lavorando su un corde, mi sono imbattuto in questocome possono delphi letterali 'stringa' essere più di 255?

Per una stringa di lunghezza predefinita, vale a dire, semplicemente dichiarato come stringa, la dimensione massima è sempre 255. A ShortString non è mai permesso che cresca a più di 255 caratteri.

su delphi strings

una volta ho dovuto fare qualcosa di simile nel mio codice Delphi (che è stato per davvero un grande richiesta)

var 
    sMyStringOF256characters : string; 
    ilength : integer; 
    begin 
     sMyStringOF256characters:='ThisStringisofLength256,ThisStringisofLength256,.....' 
     //length of sMyStringOF256characters is 256 
    end; 

ottengo questo errore

[Errore] u_home.pas (38): i valori letterali stringa possono avere al massimo 255 elementi.

ma quando provo questo

var 
     iCounter    : integer; 
     myExtremlyLongString : string; 
    begin 
     myExtremlyLongString:=''; 
     Label1.Caption:=''; 
     for iCounter:=0 to 2500 do 
     begin 
      myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter); 
      Label1.Caption:=myExtremlyLongString; 
     end; 
     Label2.Caption:=inttostr(length(myExtremlyLongString)); 
    end; 

e il risultato è

enter image description here

Come si può vedere la lunghezza del myExtremlyLongString è caratteri.

perché non è stato restituito alcun errore per indicare che la lunghezza è superiore a 255 per myExtremlyLongString?

EDIT ho usato

SetLength(sMyStringOF256characters,300); 

ma doesnt lavoro.

+0

Forse siete solo leggendo documenti sbagliati. A proposito, è davvero poco chiaro cosa intendi per "assegnato dinamicamente" al contrario di ... cosa? – OnTheFly

+0

@ user539484: il significato durante il tempo di esecuzione durante un ciclo può essere strVal: = mystring, come un valore di loop che assegna alla variabile stringa – PresleyDias

+1

ah, gratta "dinamicamente", quindi, relativo all'assegnazione rispetto a ** dichiarazione **. Quello che stai citando sopra riguarda le dichiarazioni, più specificamente - sulla limitazione del compilatore sul carattere ** letterali **. È stato collegato alle stringhe Turbo Pascal solo con mezzi storici. – OnTheFly

risposta

31

perché non è stato restituito alcun errore per indicare che la lunghezza è superiore a 255 per myExtremlyLongString?

Tu hai la tua risposta un po 'giù nel testo nella sezione lunga serie (AnsiString).

Nelle attuali versioni di Delphi, il tipo di stringa è semplicemente un alias per AnsiString,

Quindi stringa non è limitato a 255 caratteri, ma una stringa letterale è. Ciò significa che è possibile creare una stringa più lunga di 255 caratteri, ma non è possibile avere un valore stringa in codice più lungo di 255 caratteri. Devi dividerli se lo vuoi.

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255'; 
+0

funziona, grazie per la spiegazione e l'esempio – PresleyDias

2

La differenza è che nel primo esempio di codice si inserisce la stringa come parte del codice: stringa letterale. Questo ha una limitazione su quanti caratteri consentirà.

Nel secondo esempio di codice lo si genera dinamicamente e non lo si inserisce come un'unica grande stringa letterale.

Il tipo di stringa in Delphi (a differenza di una sequenza di stringhe che può essere solo fino a 255) può essere grande quanto la memoria.

+0

+1, "può essere grande come la tua memoria." Questa è una stringa molto grande quindi – PresleyDias

+1

Non può essere grande come la tua memoria. I più grandi tipi di stringhe Delphi sono ancora limitati a 2 GB di caratteri. http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types – alcalde

7

dividerlo in:

sMyStringOF256characters := 
    'ThisStringis' + 
    'ofLength256' + 
    'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters'; 
+1

+1, avevo provato simile (meno tha 255 di sicuro), per una query una volta, quella volta ho pensato, il limite è 255, così ha fatto non andare oltre 255 ... esempio precedente thanx – PresleyDias

4

Indietro nei vecchi giorni DOS/Turbo Pascal, "stringhe" sono stati infatti limitato a 255 caratteri. In gran parte perché il 1 ° byte conteneva la lunghezza della stringa e un byte può avere solo un valore compreso tra 0 e 255.

Questo non è più un problema nelle versioni contemporanee di Delphi.

"ShortString" è il tipo per il vecchio tipo di stringa DOS/Pascal.

"LongString" è stato il tipo di stringa predefinito per un lungo periodo di tempo (incluso il Borland Delphi 2006 che attualmente utilizzo per la maggior parte del lavoro di produzione). LongStrings (aka "AnsiStrings") contengono caratteri a 8 bit e sono limitati solo dalla memoria disponibile.

Le versioni recenti di Delphi (Delphi 2009 e versioni successive, incluso il nuovo Delphi XE2) sono tutte predefinite per le stringhe Unicode "WideString" multibyte. Anche WideStrings, come AnsiStrings, sono effettivamente "illimitate" in lunghezza massima.

Questo articolo spiega più in dettaglio:

http://delphi.about.com/od/beginners/l/aa071800a.htm

+0

+1 per una bella spiegazione – PresleyDias

+2

Questo non è più un problema nelle versioni contemporanee di Delphi, tranne che in due punti; Stringhe letterali e in stringhe con pedice come stringa [50], dove (ovviamente!) Il limite è 250 o meno, nel caso menziono, il limite è 50. –

+0

@Warren P - hai assolutamente ragione. La soluzione alternativa per gli stringhe letterali consiste nell'utilizzare la sintassi "'mystring' +" discussa in altri thread. – paulsm4

0

Se avete bisogno davvero lunga stringa in Delphi, è possibile caricare da altre risorse come un file txt o testo semplicemente con qualsiasi estensione. Sto usando e funziona. È possibile creare tabelle di tipo "like a" utilizzando numeri di linee di testo semplici. Nel codice delphi, puoi fare come @arjen van der Spek e altri solo.

Per me, i file con il testo come var di formattato -

sometext:string=
'txt...'+
'txt...'+
'txt...';

sono un male per la modifica futuro.

pros: è possibile utilizzare qualsiasi testo lungo.

contro: il codice di testo è aperto, chiunque può leggerlo apertura del file in Blocco note, ecc

1

Si potrebbe provare a utilizzare la classe StringBuilder:

procedure TestStringBuilder; 
var 
    I: Integer; 
    StringBuilder: TStringBuilder; 
begin 
    StringBuilder := TStringBuilder.Create; 
    try 
     for I := 1 to 10 do 
     begin 
      StringBuilder.Append('a string '); 
      StringBuilder.Append(66); //add an integer 
      StringBuilder.Append(sLineBreak); //add new line 
     end; 

     OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length)); 
    finally 
     StringBuilder.Free; 
    end; 
end;