Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asignacion en variable double perdida (https://www.clubdelphi.com/foros/showthread.php?t=79374)

elcopa 28-06-2012 22:29:44

Asignacion en variable double perdida
 
Buenas tardes.
Tengo una funcion StrToDouble que funciona y ha funcionado por mucho tiempo. Con esta funcion convierto un valor obtenido de un grid y la asigno a una variable de tipo double, pero resulta que hemos visto que la variable queda con un 0 mientras que la funcion si ha devuelto el valor correspondiente.
Para afirmar lo anterior he puesto un Showmessage donde convierto el resultado de esa funcion a string y muestro en pantalla, pero si el resultado lo pongo en una variable me deja valor 0.
Ejemplo

Código Delphi [-]
variable 
   cantidad   : Double;

begin
    Cantidad   :=StrToDouble(grid.cells[1,1]);   //el grid trae:______5.2   , 
    ShowMessage(FloatToStr(StrToDouble(grid.cells[1,1]));   //muestra el 5.2
    Cantidad   :=Cantidad; //breakpoint.... muestra cantidad como 0......  
End;

Esto me esta sucediendo con Dlephi 7 (y a un compa le paso en 2010) y no puedo migrar a Delphi 2010 porque requeriria cirugia mayor.... meses de migracion por los componentes que ya tengo establecidos en delphi 7.

Agradezco la ayuda q me puedan brindar con el tema.


Saludos.

Casimiro Notevi 28-06-2012 22:32:16

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

Casimiro Notevi 28-06-2012 22:33:27

Código Delphi [-]
ShowMessage( grid.cells[1,1] );

Y así, ¿que mensaje sale?

elcopa 28-06-2012 22:44:44

Seguimiento
 
Al mostrar los valores del grid en mensaje o debugueando salen bien. Es solo con esa variable que se pierden.
Son variables locales de la función. Este problema me ha pasado en distintas ocasiones, tanto en delphi 7 como en 2010. No se si tiene que ver con el windows 7 64B, o alguna configuracion del delphi.

La funcion StrToDouble se usa en MUCHAS partes, todo el sistema de alrededor de 1.7M de lineas usa esta funcion para las conversiones, es una variacion del StrToFloat.

Casimiro Notevi 28-06-2012 23:13:29

Prueba esto...:

Código Delphi [-]
variable     
  cantidad   : Double;  
begin     
  Cantidad   :=StrToDouble(grid.cells[1,1]);   //el grid trae:______5.2   ,      
  ShowMessage(FloatToStr(StrToDouble(grid.cells[1,1]));   //muestra el 5.2     
  Cantidad   :=Cantidad; //breakpoint.... muestra cantidad como 0......  
  //
  showmessage(floattostr(cantidad));   // Añade esto y prueba  <----------------
  // 
End;

elcopa 28-06-2012 23:25:56

Antes de leer tu respuesta trate de inicializar la variable y el compilador no me marcaba la linea como compilada... entonces hice un procedimiento en otra unidad enviando como parametro tipo var la variable para inicializarla y ahi si se compilaba..... y funcionó...
He comentado esa inicializacion para probar tu consejo y ahora antes de mostrar la variable en el mensaje esta tiene el valor que debe, y en el mensaje se muestra correctamente. Esto me parece sospechoso, como que funciona a veces, cual si el compilador no trabajase correctamente.

Gracias por la ayuda!

Casimiro Notevi 29-06-2012 00:04:54

No, lo que ocurre es que el compilador sí que está trabajando perfectamente, y en este caso son las optimizaciones lo que hacía que no vieras el valor de la variable cantidad, ¿por qué?, pues simplemente porque después de esa línea no había nada que se hiciera con esa variable, entonces el compilador decide que no sirve de nada asignarle ningún valor.
Por eso, tras poner la línea que te he indicado, la del showmessage, el compilador decide darle el valor a la variable porque ahora sí tiene algo que hacer con ella, tiene que presentar su valor.
Por lo que no te preocupes, el compilador funciona perfecto :)

elcopa 29-06-2012 00:10:54

Aclaracion
 
Me falto indicar que esas lineas que puse inicialmente son solo las del problema, pero en el procedimiento hay muchas lineas mas, y la variable en cuestion se utiliza en el mismo procedimiento enviandose como parametro a una funcion de una impresora fiscal. Esta impresora al llegarle esa variable en 0 opta por no grabar el documento.

Estas impresoras se utilizan en Panama, Chile y Argentina creo, las mismas almacenan los registros de ventas, notas de credito y funcionan para realizar el reporte al fisco.

En este caso la variable si se esta usando.

Casimiro Notevi 29-06-2012 00:16:30

El caso es que así no podemos ayudar mucho, tendríamos que ver el código fuente.

oec2509 29-10-2012 23:10:28

Gracias
 
Cita:

Empezado por Casimiro Notevi (Mensaje 436315)
No, lo que ocurre es que el compilador sí que está trabajando perfectamente, y en este caso son las optimizaciones lo que hacía que no vieras el valor de la variable cantidad, ¿por qué?, pues simplemente porque después de esa línea no había nada que se hiciera con esa variable, entonces el compilador decide que no sirve de nada asignarle ningún valor.
Por eso, tras poner la línea que te he indicado, la del showmessage, el compilador decide darle el valor a la variable porque ahora sí tiene algo que hacer con ella, tiene que presentar su valor.
Por lo que no te preocupes, el compilador funciona perfecto :)

A mi esta información me sirvió de mucho, muchas gracias por su valiosa ayuda.

Saludos desde Costa Rica

Casimiro Notevi 29-10-2012 23:22:36

Cita:

Empezado por oec2509 (Mensaje 448289)
A mi esta información me sirvió de mucho, muchas gracias por su valiosa ayuda.
Saludos desde Costa Rica

Me alegro ^\||/


La franja horaria es GMT +2. Ahora son las 08:26:43.

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