Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-09-2011
maunix maunix is offline
Miembro
 
Registrado: jul 2007
Posts: 10
Poder: 0
maunix Va por buen camino
Exclamation Casteo y Migración

Buenos días, escribo el problema porque no he visto nada posteado al respecto y tampoco googleando veo alguna respuesta que cuadre en mi problema.

Tengo un código que anda de maravilas en Delphi 7 pero en Delphi Rapid XE y debuggeando paso a paso he encontrado el que parece ser mi problema.

Tengo una comunicación con un dispositivo de hardware y he usado siempre strings para enviar y leer de dicho positivo. La razon es porque la clase que lo controla usa strings; y de allí que yo también.

Ahora bien, yo creo buffers con strings, son pocos datos asi que me han funcionado siempre bien. En estos strings el 0 es un valor válido y no el fin del string; no obstante delphi nunca tuvo problemas con esto.

Si por ejemplo hago

Código:
str := chr(1) + chr(2) + chr(0) + chr(3) + chr(4);
Delphi me almacenara los 5 bytes y me dirá que el length(str) es de 5. Ahora bien los datos que van en el string pueden tomar un valor de 0 a 255; y es allí donde con el RapidXE noto un problema que me está volviendo loco.


Si hago

Código:
str := chr(127) ;
Lo hace bien

Pero si hago

Código:
str := chr(128);

Me asigna $0080 (128 en una variable de 16 bits).

Le he dado vueltas al problema y chr debiera devolver un valor de 8 bits no de 16 bits!! Este código en delphi7 lo hace perfecto.

Casteandolo como char, no ha solucionado el problema...

Lo único que me resta por probar es volver a trabajar con buffers de bytes y luego hacer la conversion (ya que como les mencionaba la clase que controla el dispositivo pide y responde con strings).

Lo que van entre parentesis son constantes, es decir que no son variables que se modifiquen en tiempo de ejecución. Casteandolas por ejeplo con byte(128) tampoco resuelve el problema..

¿Alguna idea?

Desde ya muchas gracias por anticipado.
Responder Con Cita
  #2  
Antiguo 23-09-2011
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por maunix Ver Mensaje
Me asigna $0080 (128 en una variable de 16 bits).
$0080 = $80 = 128

No llego a comprender el problema... ¿De qué tipo es "str"?... ¿Es un string?.. ¿No te lo estará mostrando así el Debugger pero verdaderamente estas ocupando un solo byte con $80?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 23-09-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Haz una búsqueda en los foros por "unicode", creo que tiene que ver con eso, pero no recuerdo en qué tema se trató.
Responder Con Cita
  #4  
Antiguo 24-09-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Maunix.

A partir de Delphi 2009 los caracteres (y por tanto las cadenas de caracteres también) usan el formato Unicode. Aún puedes seguir empleando el formato anterior, pero debes hacer cambios en los fuentes de tu aplicación / clases, para que todo funcione como en Delphi 7.

En este foro encontrarás muchos temas que hablan de ello, y este artículo puede servirte de introducción para entender el tema: http://www.drbob42.com/examines/examinA7.htm

Por otra parte, sin pretender otra cosa que contribuir a la cultura informática, quisiera decirte que los autores de libros (y un servidor también) suelen traducir el término type cast / casting como molde de tipo / moldear. Te recomiendo que hagas lo mismo, así evitarás el barbarismo de "castear".

Un abrazo en cirílico.

Al González.
Responder Con Cita
  #5  
Antiguo 24-09-2011
maunix maunix is offline
Miembro
 
Registrado: jul 2007
Posts: 10
Poder: 0
maunix Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
$0080 = $80 = 128

No llego a comprender el problema... ¿De qué tipo es "str"?... ¿Es un string?.. ¿No te lo estará mostrando así el Debugger pero verdaderamente estas ocupando un solo byte con $80?
Ocupa 2 bytes, ese es el problema. Si hago ord(str[xx]) donde xx es la posición donde está dicho caracter me devuelve un valor de 16 bits!! 8432 por darte un ejemplo

Cita:
Empezado por Al Gonzalez
A partir de Delphi 2009 los caracteres (y por tanto las cadenas de caracteres también) usan el formato Unicode. Aún puedes seguir empleando el formato anterior, pero debes hacer cambios en los fuentes de tu aplicación / clases, para que todo funcione como en Delphi 7.
Conozco el tema Unicode, pero como leyendo el ayuda del Delphi XE me dice que la funcion "chr" devuelve un valor de 1 byte de 0 a 255... y lo mismo para otros ejemplos, es por que me confundo. Una cosa es usar AnsiStrings y los Widestrings y otra el viejo tipo string.

No obstante hablo esto a priori antes de leer el link que me pasaste.

PD: agradezco la sugerencia por mi "spanglish" del termino cast... a veces por mi trabajo usamos muchos terminos así y la verdad que está mal pero es pegadizo.

Desde ya agradezco a todos por su tiempo y velocidad de respuesta!!
Responder Con Cita
  #6  
Antiguo 26-09-2011
maunix maunix is offline
Miembro
 
Registrado: jul 2007
Posts: 10
Poder: 0
maunix Va por buen camino
Finalmente (eso creo, al menos en las pruebas preliminares no he tenido inconvenientes) lo he resuelo poniendo el modo unicode en off

Tal cual como se explica en el siguiente link que lo dejo por si a algún otro le surge la misma inquietud

No me permite poner el link porque no tengo privilegios para ello, pero en la página de dr bobs está la respuesta, en donde sugirió Al González

Pero por cierto la sintaxis delphi sería

Código:
{$HIGHCHARUNICODE OFF}

Saludos
Responder Con Cita
  #7  
Antiguo 26-09-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por maunix Ver Mensaje
No me permite poner el link porque no tengo privilegios para ello
Puedes "engañar" al sistema quitando alguna letra, ejemplo: ttp://www.clubdelphi.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Migracion a excel oscarac Varios 1 07-07-2011 09:02:17
Migración DavidSG4 OOP 0 20-10-2008 16:04:23
migracion de datos kejos MS SQL Server 1 18-01-2006 04:18:36
Casteo en tiempo de ejecución moesis OOP 4 21-07-2005 15:21:56
Herencia y Casteo PeLuCa OOP 9 05-04-2005 01:29:15


La franja horaria es GMT +2. Ahora son las 00:45:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi