Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Pasar valores entre variables tipo record

Hola amigos, voy a plantearos algo que me ha dejado perplejo.
Tengo un programa de quinielas hecho hace varios años en Delphi7.
Ahora estoy modificando algunas cosas con motivo del nuevo pleno al 15.
Guardo en un fichero los datos de cada jornada, en una variable tipo record.

Voy leyendo los registros, según la jornada que voy a trabajar.
Cuando tengo que modificar algún dato, utilizo algunas variables intermedias, para comparar si ha habido algún cambio.

Dado que las variables las tengo declaradas con comas, cuando interesa utilizo la asignación:
Código Delphi [-]
 
variable2:=varible1;
Paso los valores de la variable2 a un formulario de modificaciones.
Hago las modificaciónes en la variable2 y luego las paso a la variable1, si inateresa.
Esto lleva años funcionando correctamente.

EL PROBLEMA

Ahora he añadido algunas variables más en el record.

SORPRESA

Cuando intento rellenar el formulario con los datos de la variable2 en el evento OnShow, una parte de ellos no se rellenan.

Al comparar las dos variables, me dice que los valores son distintos, por lo que he llegado a la conclusión de que no traspasa bien los valores de una a la otra.

La asignación las variables está en el evento OnShow.

De manera que si salgo del formulario de modificación varias veces y vuelvo a entrar, va asignando los valores poco a poco, hasta asignarlos todos.

(¡¿?!) Esto me tiene perplejo......

Más aún cuando he comprobado los valores que no traspasa, antes de ponerlos en los distintos Edit del formulario, y he comprobado que no están.
Pero ahí no queda la cosa, he utilizado otra variable asignada en el form de lectura de fichero y ¡Sí ESTÁN LOS VALORES COMPLETOS!

Bien, me dije, pues voy a asignar los valores al leer el registro, a ver qué pasa. PUES TAMPOCO.

Bueno, me dije, será el nombre: PUES TAMPOCO
Bueno, me dije, el orden de declaración (una chorrada) PUES TAMPOCO

Llevo 3 días revisando el código y no consigo ver el motivo de esto.

Por favor, si alguien ha tenido esta experiencia o si puede aportarme alguna idea, (estoy abierto a probar cualquier cosa), se lo agradeceré infinitamente.

Gracias por aguantar el rollo, pero no sabía explicarlo de otro modo.
Responder Con Cita
  #2  
Antiguo 27-08-2014
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
Según entendí, cuando asignas una variable Record a otra variable Record, del mismo tipo, no todos sus campos se copian. ¿Es correcto?

¿Podrías mostrar la declaración de ese Record y el código donde haces las asignaciones? Por favor.
Responder Con Cita
  #3  
Antiguo 27-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Gracias, Al González, por tu interés.
SI. has entendido correctamente. ESO ES LO ME TENÍA LOCO.
Porque habia llegado a esa conclusión ERRÓNEA.
Acabo de resolverlo, pero NO ENTENDERLO.
Veamos:
En el evento OnExit de cada Edit, tenía puesto, lógicamente, (para ahorrar traspasos entre los distintos Edit y las variables del Record), la asignación del valor del Edit al Record.

Este evento se ejecutaba también, por supuesto, al asignar los primeros valores del Record a los distintos Edit.

Evitando la ejecución del evento OnExit, mediante una boleana global, he conseguido que los valores se transfieran correctamente.

Ahora viene mi "DESCOLOQUE MENTAL" ¿Por qué ha estado funcionando más de 7 años, con algunas corrrecciones y compilado con Delphi7, (como ahora) con el mismo evento OnExit?

Supongo que para comprender éso hay que ser MUY EXPERTO, yo no.

A pesar de todo, y visto lo visto, me queda un pequeño "come... come..." por dentro, que me genera una cierta inseguridad sobre si he resuelto correctamente el problema, y no va a resultar por otro lado.

Bueno no me extiendo.
Gracias, de nuevo, Al por tu interés. Si el problema sale por otro lado, ya te contaré. Saludos.
Responder Con Cita
  #4  
Antiguo 28-08-2014
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
Cita:
Empezado por jhonalone Ver Mensaje
A pesar de todo, y visto lo visto, me queda un pequeño "come... come..." por dentro, que me genera una cierta inseguridad sobre si he resuelto correctamente el problema, y no va a resultar por otro lado.
Eso es bueno. Significa que no te gusta dejar cabos sueltos, y esto forma parte de un buen programador.

Cuando gustes podrías mostrar algo de ese código y con gusto aquí habrá muchas manos dispuestas a ayudar en la investigación. Sólo tienes que hacernos saber con exactitud qué records son esos, cómo y dónde los asignas y qué versión de Delphi usas ahora. Código y claridad, si no fuera molestia.
Responder Con Cita
  #5  
Antiguo 28-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Gracias Al.
Hasta ahora no me ha dado ningún problema, después de los cambios.
El record es el siguiente.


Código Delphi [-]
       
DATOS=RECORD
              JORNADA:INTEGER;
              SIMIL:INTEGER;
              MAX1,MED1B,MED1A,MIN1,MAX2,MED2B,MED2A,MIN2,MAXX,MEDXB,MEDXA,MINX,
              MAX1SG,MED1SG,MIN1SG,Extra1sg,MAX2SG,MED2SG,MIN2SG,Extra2sg,
              MAXXSG,MEDXSG,MINXSG,ExtraXsg,
              MAXV0,MINV0,MAXV1,MINV1,MAXV2,MINV2,MAXV3,MINV3,
              MAX2G0,MAX2G1,MAX2G2,MAX2G3:INTEGER;
              minAB,medABB,medABA,maxAB:Byte;
              A,B,PronSorTodas,PronSorMasPro,PronSorMenosPro,PronSinSor:
                                  ARRAY [1..17] OF STRING[3];  //pleno 15 con goles
              ganadora,GR,PronQuiniMasPro:ARRAY [1..17] OF STRING[1]; //pleno 15 con goles
              Aciertos: array[10..15] of integer;
              {premios: array[10..15] of Real48;}
              ValApuEuro, ValApuPtas, ApuRedu,{se pone totreducidas para estadisticas}
              Sindefinir:Real48;
              SinDefinir2:Real48;
              RaizRandomGoles: integer;  //pleno 15 con goles la variacion de resultados aleatorios para goles
              END;

La declaración de variables es esta:
Código Delphi [-]
 
 
D,      { Siempre lleva datos de la jornada en uso }
   DDup,   { usado para la lectura de condiciones y base}
   dInter, { usado como intermediario para CambioDatJor}
   D2,     { Siempre lleva datos de la primera leída o última grabada }
   DMierda { Sin inicializar para control anticopia }
   DATOS;

y el evento OnExit ha quedado así después de los cambios:

Código Delphi [-]
 
procedure TApBasica.Edit15Exit(Sender: TObject);
begin
if EsUnaAsignacionMia then EXIT; // para que no de error al asignar yo los valores
if (TEdit(Sender).Text<>'1') and
   (TEdit(Sender).Text<>'X') and
   (TEdit(Sender).Text<>'2')
then begin
     Application.MessageBox('Entrada incorrecta. Utilice los signos  "1"   "X"   "2"  exclusivamente. ',
     '¡ Atención !',mb_OK+mb_IconExclamation);
     TEdit(Sender).SetFocus;
     EXIT;
     end;
DDup.A[15]:=TEdit(Sender).Text; // Aquí creo que es donde perdia valores la variable Record DDup
end; {Edit15Exit}

La variable "EsUnaAsignacionMia" la pongo a True antes de asignar los valores a los distintos Edit. Y la cambio a False después de asignar los valores.

Sigo sin entender por qué ha estado funcionando tantos años, si lo he compilado con la misma versión de Delphi, o sea con la versión Delphi7, que todavía conservo instalada en un ordenador más antiguo, para no complicarme la vida si tengo que hacer alguna modificación en algun programa viejo.

Gracias por tus elogios, pero es cierto que soy muy meticuloso, pero sólo soy aficionado y tengo muchiiiiiisimo que aprender.
Un Saludo.

Última edición por Casimiro Notevi fecha: 29-08-2014 a las 18:31:46.
Responder Con Cita
  #6  
Antiguo 28-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Bueno, no entiendo por qué ha salido una imagen que yo no he puesto conscientemente en la declaración de varibles. Vuelvo a copiarlo:

Código Delphi [-]
 
var
..........
   D,      { Siempre lleva datos de la jornada en uso }
   DDup,   { usado para la lectura de condiciones y base}
   dInter, { usado como intermediario para CambioDatJor}
   D2,     { Siempre lleva datos de la primera leída o última grabada }
   DMierda { Sin inicializar para control anticopia }
   DATOS;
..........

Última edición por Casimiro Notevi fecha: 29-08-2014 a las 18:32:23.
Responder Con Cita
  #7  
Antiguo 28-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Volvió a ocurrir y pienso que es por utilizar la palabra DMier??, que lógicamente debe estar prohibida en el foro.




Código Delphi [-]
var
....
....
D, { Siempre lleva datos de la jornada en uso }
DDup, { usado para la lectura de condiciones y base}
dInter, { usado como intermediario para CambioDatJor}
D2, { Siempre lleva datos de la primera leída o última grabada }
DM..... { Sin inicializar para control anticopia }
DATOS;
....








Pido disculpas, pero es que yo en el programa la llamo así para entenderme.
Saludos a todos.
Responder Con Cita
  #8  
Antiguo 28-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jhonalone.

Debe ser un problema en tu equipo... La palabra DMierda no está prohibida en este sitio y se lee perfectamente desde el mensaje #5

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 28-08-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Se ve bien
Responder Con Cita
  #10  
Antiguo 29-08-2014
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
Debe ser otra cosa, la palabra mierda no está prohibida. De hecho en el club se han publicado grandes tratados sobre ella.
Responder Con Cita
  #11  
Antiguo 29-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Gracias a todos. Me siento mejor.
En mi equipo, la palabra DATOS, la veo como ATOS.
No sé si vosotros la veis correctamente.
Saludos.
Responder Con Cita
  #12  
Antiguo 29-08-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Ah! Solamente si está enmarcada como código Delphi.
Saludos.
Responder Con Cita
  #13  
Antiguo 29-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jhonalone

Seguramente debe ser algo en tu configuración:
Código Delphi [-]
   DMierda { Sin inicializar para control anticopia }
   DATOS;

Cita:
Empezado por Al González Ver Mensaje
Debe ser otra cosa, la palabra mierda no está prohibida. De hecho en el club se han publicado grandes tratados sobre ella.
Y como otra muestra de permisión, dos compañeros:

mierda
comemierdas

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #14  
Antiguo 29-08-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jhonalone Ver Mensaje
En mi equipo, la palabra DATOS, la veo como ATOS.
Creo que es por las "caritas", tienes puesto un "dos puntos" delante de la "D" y eso es la carita riendo:
Imágenes Adjuntas
Tipo de Archivo: jpg pru.jpg (13,9 KB, 1 visitas)
Responder Con Cita
  #15  
Antiguo 30-08-2014
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
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Creo que es por las "caritas", tienes puesto un "dos puntos" delante de la [...]
En algunas ocasiones he tenido que desactivarlas para poner código con mi estilo de los dos puntos pegados al tipo de dato y no a la última variable de la lista.

Estilo tradicional:
Código Delphi [-]
A, B, C: TField
Mi "terrible" estándar:
Código Delphi [-]
A, B, C :TField
Para mí, el tipo de dato expresado en la declaración de variables, campos, parámetros, etc. lleva el prefijo ":".

Última edición por Al González fecha: 30-08-2014 a las 17:18:43.
Responder Con Cita
  #16  
Antiguo 30-08-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo prefiero un término medio
Código Delphi [-]
A, B, C : TField;
Responder Con Cita
  #17  
Antiguo 30-08-2014
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
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Yo prefiero un término medio
Código Delphi [-]
A, B, C : TField;
¡Es que tú eres suizo!
Responder Con Cita
  #18  
Antiguo 30-08-2014
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Y el noparse amigos?? donde dejamos el noparse??

Código Delphi [-]
:D :D :)

[ delphi ] [ noparse ]

[ /noparse ] [ /delphi ]

Sobre el tema original, quizás sea por el uso de exit, quiero decir, algún caso concreto donde se salga por un Exit y no asigne el valor. Yo miraría el tabOrder de los controles y que todos tengan asignado el OnExit.

Además mirar los casos raros, por ejemplo, sabemos que los SpeedButton no tienen foco, por tanto si el cursor está en un Edit y pulsas un Speedbutton, no se ejecutará el código del OnExit y ese valor no se transfiere.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #19  
Antiguo 31-08-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Lepe Ver Mensaje
Y el noparse amigos?? donde dejamos el noparse??
Siempre olvido la dichosa palabrita
Responder Con Cita
  #20  
Antiguo 01-09-2014
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Poder: 17
jhonalone Va por buen camino
Gracias a todos, amigos.
El buen humor, que no falte.
El código funciona, como ya os dije. No obstante tendré en cuenta las observaciones de LEPE.

El tema de los dos puntos debe ser lo que comenta Casimiro de las caritas.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Pasar variables entre BPL y aplicacion adeszeus OOP 3 04-07-2011 23:46:25
Pasar variables entre programas Belaix Varios 5 24-11-2008 07:06:31
pasar un tipo de datos (array of record) entre aplicaciones mauqu Varios 4 26-10-2007 20:04:31
pasar valores de variables de un form a otro oscarpinog Varios 7 12-08-2007 03:18:39


La franja horaria es GMT +2. Ahora son las 01:25:30.


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