declarar - ¿Cómo pueden los delphi ''string'' literales ser más de 255?
delphi substring (6)
estoy trabajando en Delphi 7 y estaba trabajando en una cadena, me encontré con esto
Para una cadena de longitud predeterminada, es decir, declarada simplemente como cadena, el tamaño máximo siempre es 255. A ShortString nunca se le permite crecer a más de 255 caracteres.
una vez que tuve que hacer algo como esto en mi código delphi (que era para una consulta realmente grande)
var
sMyStringOF256characters : string;
ilength : integer;
begin
sMyStringOF256characters:=''ThisStringisofLength256,ThisStringisofLength256,.....''
//length of sMyStringOF256characters is 256
end;
me sale este error
[Error] u_home.pas (38): los literales de cadena pueden tener como máximo 255 elementos.
pero cuando intento esto
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
Como puede ver, la longitud de myExtremlyLongString es de 8894 caracteres.
¿Por qué Delphi no dio ningún error al decir que la longitud está más allá de 255 para myExtremlyLongString ?
EDITAR uso
SetLength(sMyStringOF256characters,300);
pero no funciona
¿Por qué Delphi no dio ningún error al decir que la longitud está más allá de 255 para myExtremlyLongString?
Usted tiene su respuesta un poco abajo en el texto en la sección Long String (AnsiString) .
En las versiones actuales de Delphi, el tipo de cadena es simplemente un alias para AnsiString,
Entonces, la cadena no está limitada a 255 caracteres, sino que 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'';
De vuelta en los viejos tiempos de DOS / Turbo Pascal, "cadenas" estaban de hecho limitadas 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 cadena 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 tienen por defecto cadenas de múltiples bytes Byte Unicode "WideString". WideStrings, como AnsiStrings, también son efectivamente "ilimitadas" en longitud máxima.
Este artículo explica con más detalle:
Dividirlo en:
sMyStringOF256characters :=
''ThisStringis'' +
''ofLength256'' +
''And ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''ManyManyManyManyManyManyManyManyManyManyManyManyMany'' +
''CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters'';
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.
Podría intentar 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;
Si necesita cadenas realmente largas en Delphi, puede cargarlas desde otros recursos como archivos de texto o simplemente texto sin formato 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í, los archivos con texto como formatos de var -
sometext:string=
''txt...''+
''txt...''+
''txt...'';
son malos para futuras ediciones.
pros: puedes usar cualquier texto largo.
contras: el código de texto está abierto, cualquiera puede leerlo abriendo archivo en el bloc de notas, etc.