2012-01-07 30 views
20

im trabajando en delphi 7 y yo estaba trabajando en una cadenas, me encontré con este¿cómo puede delphi 'cadena' literales ser más de 255?

Para una cadena de longitud por defecto, es decir, declararon simplemente como una cadena, el tamaño máximo es siempre 255. Un ShortString nunca se permite crecer a más de 255 caracteres.

en delphi strings

vez que tenía que hacer algo como esto en mi código de Delphi (que era para una consulta muy grande)

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

consigo este error

[Error] u_home.pas (38): Los literales de cadena pueden tener como máximo 255 elementos.

pero cuando intento esta

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; 

y el resultado es

enter image description here

Como se puede ver la longitud de myExtremlyLongString es caracteres.

¿por qué Delphi no dio ningún error al decir que la longitud está más allá de 255 para myExtremlyLongString?

EDITAR he usado

SetLength(sMyStringOF256characters,300); 

pero no funciona.

+0

Tal vez usted se acaba de leer documentos equivocadas. Por cierto, no está claro a qué te refieres con "asignados dinámicamente" en lugar de ... ¿qué? – OnTheFly

+0

@ user539484: significa que durante el tiempo de ejecución durante un ciclo puede ser strVal: = mystring, como un valor de ciclo asignado a la variable de cadena – PresleyDias

+1

ah, rayar "dinámicamente", es sobre asignación frente a ** declaración **. Lo que está citando arriba se trata de declaraciones, más específicamente: acerca de la limitación del compilador en el carácter ** literales **. Se ha conectado a cadenas de Turbo Pascal solo por medios históricos. – OnTheFly

Respuesta

31

¿por qué no delphi dio ningún error diciendo que la longitud está más allá de 255 para myExtremlyLongString?

Usted tiene su respuesta un poco más abajo en el texto en la sección cadena larga (AnsiString).

En las versiones actuales de Delphi, el tipo de cadena es simplemente un alias para AnsiString,

Así cadena no está limitado a 255 caracteres, pero es una cadena literal. Eso significa que puede compilar una cadena de más de 255 caracteres, pero no puede tener un valor de cadena en un código que tenga más de 255 caracteres. Necesitas dividirlos si quieres eso.

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

funciona, gracias por la explicación y el ejemplo – PresleyDias

2

La diferencia es que en el primer ejemplo de código usted está poniendo la cadena como parte de su código - cadena literal. Eso tiene una limitación en la cantidad de caracteres que permitirá.

En el segundo ejemplo de código lo está generando dinámicamente y no lo está poniendo como una cadena literal grande.

El tipo de cadena en Delphi (a diferencia de la banda corta que solo puede tener hasta 255) puede ser tan grande como la memoria.

+0

+1, "puede ser tan grande como la memoria". Esa es una cadena muy grande, entonces – PresleyDias

+1

No puede ser tan grande como la memoria. Los tipos de cadenas de Delphi más grandes todavía están limitados a 2 GB de caracteres. http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types – alcalde

7

dividirlo en:

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

+1, había intentado algo similar (menos de 255 seguro), para una consulta una vez, esa vez pensé, el límite es 255, también lo hice no ir más allá de 255 ... ejemplo agradable thanx – PresleyDias

4

De vuelta en los viejos días de DOS/Turbo Pascal, "cadenas" de hecho se limita a 255 caracteres. En gran parte porque el 1er byte contenía la longitud de la cadena, y un byte solo puede tener un valor entre 0 y 255.

Eso ya no es un problema en las versiones contemporáneas de Delphi.

"ShortString" es el tipo del antiguo tipo de serie DOS/Pascal.

"LongString" ha sido el tipo de cadena por defecto durante mucho tiempo (incluido el Borland Delphi 2006 que actualmente uso para la mayoría del trabajo de producción). LongStrings (también conocido como "AnsiStrings") contienen caracteres de 8 bits, y están limitados solo por la memoria disponible.

Las versiones recientes de Delphi (Delphi 2009 y superior, incluido el nuevo Delphi XE2) ahora se usan por defecto en cadenas de múltiples bytes Byte Unicode "WideString". WideStrings, como AnsiStrings, también son efectivamente "ilimitadas" en longitud máxima.

En este artículo se explica con más detalle:

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

+0

+1 para buena explicación – PresleyDias

+2

Esto ya no es un problema en las versiones contemporáneas de Delphi, excepto en dos lugares; Literales de cadena, y en cadenas subscritas como cadena [50], donde (¡obviamente!) El límite es 250 o menos, en el caso que menciono, el límite es 50. –

+0

@Warren P: tiene toda la razón. La solución alternativa para los literales de cadenas es utilizar la sintaxis "'mystring' +" discutida en otros hilos. – paulsm4

0

Si necesita realmente larga cadena en Delphi, puede cargarla de otros recursos como un txt o texto simplemente con cualquier extensión. Lo estoy usando y funciona. Puede crear tablas de matriz "como a" usando números de líneas de texto sin formato. En el código delphi, puedes hacer lo mismo que @arjen van der Spek y otros solo dicen.

Para mí, archivos de texto con var como de formateado -

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

son malas para su posterior edición.

profesionales: puede usar cualquier texto largo.

contras: código de texto está abierto, cualquiera puede leerlo al abrir el archivo en el bloc de notas, etc.

1

Usted podría tratar de usar la clase 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; 
Cuestiones relacionadas