Pregunta

¿Hay una manera de obtener las cadenas en los registros más grandes de 255 caracteres?

EDIT:

Tengo algo como lo siguiente:

TQuery = Record
  Action: string[255];
  Data: string;
end;

Si ahora digo:

Test: TQuery;
Test.Data := 'ABCDEFGHIJKLMN...up to 255...AISDJIOAS'; //Shall be 255 chars

No funciona y el compilador se queja ... Cómo arreglar eso?

¿Fue útil?

Solución

Si usted quiere ser capaz de escribir su registro en un archivo, se puede definir la cadena como una matriz de ANSIChar por ejemplo. Se puede tratar como una cuerda después.

Ejemplo:

program StrInRecTest;
{$APPTYPE CONSOLE}
uses SysUtils;

type
  TStringRec=
    packed record
        S:array[0..1023] of ansichar;
    end;

var
  StringRec:TStringRec;
  F:File of TStringRec;
begin
  StringRec.S := 'Hello';
  WriteLn(StringRec.S);
  WriteLn('First char is:'+StringRec.S[0]); // watch out with this


  // now let's try saving this to a file and reading it back...

  // make a long string with x-es
  FillChar(StringRec.S,Length(StringRec.S),'X');
  StringRec.S[High(StringRec.S)] := #0; // terminate the string

  WriteLn(StringRec.S);

  // write to a file
  AssignFile(F,'tmp.txt');
  ReWrite(F);
  Write(F,StringRec);
  CloseFile(F);

  WriteLn;

  // read from file
  AssignFile(F,'tmp.txt');
  Reset(F);
  Read(F,StringRec);
  CloseFile(F);

  WriteLn(StringRec.S); // yay, we've got our long string back

  ReadLn;
end.

Otros consejos

Delphi y las tres cadenas

Había una vez, en los primeros días de Pascal, allí donde cadenas cortas. Consistían en un bloque de bytes con un tamaño máximo de 256. El primer byte es el byte de longitud:

5, H, e, l, l, o

Se podría definir cadenas de longitud fija para ahorrar memoria:

a: string[5];

Windows utiliza cadenas de C, que son un puntero a un bloque de memoria termina con un carácter 0. Estas cadenas donde no limitados a 255 bytes. En primer lugar que siempre que se presten como el PChar (puntero a char). Pero más tarde la cadena predeterminada se interpretó como una cadena tipo C. Aún se podía utilizar shortstrings:

a: string[22];
b: ShortString;
c: string; // C (Delphi) string

Con Delphi 2009, se introdujo Unicode. Ahora cada cuerda era una cadena Unicode. Que es un puntero a un trozo de memoria que contiene caracteres Unicode. Todavía tenemos el tipo ShortString. Las viejas cadenas ANSI se puede acceder por AnsiString o PAnsiChar.

Ahora que las cadenas son punteros, no hay límite para el tamaño. Pero los literales de cadena todavía están limitados a 255 caracteres.

Normalmente sí. Usted no tiene que hacer algo especial, siempre y cuando se utiliza el tipo normal de cadena (o los otros tipos de cadena larga) y no ShortString.

type
  TMyRec = record
    Value: string;
  end;

En la práctica depende de lo que usted quiere hacer con el registro. Si desea bloquear-escribir algo en un archivo o proporcionar el registro a una función DLL, debe de cambiar a arrays de char:

type
  TMyRec = record
    Value: array[0..1023] of Char;
  end;

En Delphi hay diferentes tipos de cadena:

  • ShortString - hasta 255 caracteres
  • AnsiString - hasta 2 ^ 31 Caracteres
  • WideString - hasta 2 ^ 31 WideChars

string normalmente se interpreta como AnsiString. AnsiString y WideStrings son en realidad puntero a la memoria donde se almacena la cadena. El compilador algo de magia allí para ahorrar recursos.

Así que poner una cadena en un registro que puede dar el resultado deseado, pero supongo que el operador sizeof en el registro fallará.


Thx a Smasher por señalar esto: Esta es citado de ayuda de Delphi 2006. Diferentes versiones de Delphi pueden comportarse de manera diferente.

Si usted quiere decir, almacenarla en una base de datos, entonces es completamente dependiente de la base de datos que está utilizando. Varias cadenas de soporte de bases de datos de hasta 8K de longitud; y SQL 2005 introdujo VARCHAR (MAX) que tiene un límite de, i creo 2 GB. MySQL 5 parece estar limitada a alrededor de 65 mil para el mismo tipo de datos.

Sin embargo, algunos de los más antiguos sólo permiten [var] char (255).

¿Qué está tratando de poner en?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top