Monday, 1 December 2008

Migrando a Delphi 2009. Preparandonos para Unicode.

La nueva versión de delphi 2009, trae grandes cambios con todo el tema del unicode. Ahora tanto la RTL como la VCL soportan totalmente unicode. Por lo tanto uno de los cambios es que el tipo "string", pertenece a "UnicodeString" en vez de "AnsiString". "Widestring" aún existe y seguirá funcionando, pero si queremos notar las mejoras del reference counting i del Delphi's fast memory manager, debemos sustituir los "WideString" por "UnicodeString". Entonces al declarar una variable de tipo "String", esta proviene de "UnicodeString" y no de "AnsiString" como estábamos acostumbrados.

Esta vez al asignar variables "AnsiString" a "WideString" o viceversa, en delphi 2009 obtendremos un warning. Una de las muchas diferencias que tenemos ahora, es que los char no miden 1 byte, sino 2. Así que si hacemos SizeOf(Char), este valdrá 2 bytes en vez de 1. Siguiendo esta casuística, la longitud de un String ya no es la medida de sus bytes, sino que la cosa ha cambiado un poco.
Si hacemos la llamada Length(String) esta nos creará bastantes problemas, porqué ahora para el cálculo tendremos que realizar Length(String) * SizeOf(Char).

  • Resumiendo:
  1. String proviene de UnicodeString y no de AnsiString.
  2. WideString no ha cambiado y seguirá funcionando correctamente, pero lo tendríamos que reemplazar por UnicodeString. WideString lo direcciona windows memory manager.
  3. Char proviene de WideChar y ahora es de 16 bits y no de 8.
  4. Los tipos de 8 bits desaparecen. AnsiChar y AnsiString (de 8 bits), seguirán funcionando, pero hay que ir con cuidado al castear, ya que UnicodeString es de 16 bits y si lo asignamos a un AnsiChar o AnsiString perderemos 8 bits. AnsiChar y AnsiString pasan a ser Deprecated.
  5. Para todo el tema de las llamadas API o comunicación con objetos COM, se complica un poco más debido que hay muchas llamadas que quieren la medida de lo que vas a enviar, y si ahora hacemos un SizeOf(String) siempre nos devolverá 4 bytes, ya que este és un puntero.
Podemos encontrar más información en los siguientes enlaces:

Codegear Delphi 2009 - What's new.
Micro-ISV.asia.

0 comments:

Post a Comment