2012-04-20 10 views
5

Soy nuevo en Delphi y estaba migrando un proyecto Delphi muy antiguo a Embarcadero RAD Studio 2010. Encontré un problema al utilizar cadenas. Aquí está el código:Desactivar cadenas enormes en Delphi 2010

ProgramaResultadosType = record 
    Version: string; 
    TituloPrincipal : string; 
    BloquesResultados : VectorBloquesResultadosType; 
end; 

FileOfProgramaResultadosType = file of ProgramaResultadosType; 

Y el error ...

"E2155 Tipo '% s' necesita finalización - No se permite en el tipo de archivo"

Sé que es una error bien conocido para muchos desarrolladores de Delphi cuando no especifica el tamaño de la cadena.

Básicamente me gustaría desactivar la directiva de cadenas enormes como las versiones anteriores de RAD Studio, pero no puedo averiguarlo en la versión de 2010.

+2

Se ha intentado utilizar el consejo embarcadero [E2155: Tipo '% s' necesita finalización - no se permite en el tipo de archivo (Delphi)] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2 /EN/html/devcommon/cm_finit_in_file_xml.html) y usar una matriz de char en su lugar? – RRUZ

+0

D2010 ya no puede "desactivar" cadena enorme porque el tipo de cadena se convirtió en Unicode. El soporte de Unicode está profundamente incrustado, por lo que no puede volver a ningún tipo de cadena ANSI anterior. Deberías comenzar a eliminar todos los tipos de "archivos". Ellos son realmente obsoletos. –

Respuesta

10

Sólo tiene que utilizar en su lugar:

ProgramaResultadosType = record 
    Version: shortstring; 
    TituloPrincipal : shortstring; 
    BloquesResultados : VectorBloquesResultadosType; 
end; 

Pero tenga en cuenta que:

  • Casi cada llamada a una función RTL primero hará una conversión invisible para el nuevo tipo string: se debe utilizar mejor otra variable explícita string justo después de haber leído el contenido shortstring;
  • En la versión más reciente de Delphi (comenzando con Delphi 2009), string es una cadena Unicode: por lo que puede perder algunos datos al escribir en shortstring (que es una cadena Ansi) de UnicodeString;
  • Quizás sea necesario agregar ProgramaResultadosType = packed record si su aplicación es muy muy antigua (la alineación predeterminada se modificó en Delphi 4, AFAIR).

por lo que puede que tenga que:

  • leer el contenido existente mediante estructuras como el anterior;
  • Escribir utilizando un nuevo paradigma, preparado para Unicode (por ejemplo, un DB incrustado como Midas, SQLite3 o cualquier otro).

vale la pena leer al convertir una aplicación existente a una versión más nueva de Unicode Delphi:

+0

@David ¿Cómo sabes que tengo un diente flojo? Gracias por la edición. Siempre cometí este error, sin saberlo ...:) –

+0

hay una nota mnemotécnica: elige tiene 2 "o" de las que puedes * elegir *, pero perder solo tiene 1 porque si * pierdes * 1, solo te queda 1. –

Cuestiones relacionadas