In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Inicializa al Crear la Instancia de una Clase

Foro de Xailer profesional en español
Responder
Avatar de Usuario
alexherrera@equipo.com.mx
Mensajes: 37
Registrado: Vie Jun 15, 2012 5:45 am

Inicializa al Crear la Instancia de una Clase

Mensaje por alexherrera@equipo.com.mx »

Hola !
A continuación les describo un problemita que me encontre en mis primeras experiencias con Xailer 3.1 (2.6 no lo hacia)
Desarrolle un pequeño proyecto que ilustra el problema.

El Form1 lo único que hace es cargar y ejecutar el Form2
El Form2 tiene un objeto ( oD ) de la clase TObjDat(), mismo que contiene dos datos numéricos que se inicializan a cero.
Los datos del objeto se muestran en Form2
Lo que deberí­a hacer cada que se entra a Form2 es mostrar los dos datos (nDato1 y nDato2) siempre con el valor 1, sin embargo podemos observar que nDato2 se va incrementando. (No Se INICIALIZA)
A continuación esta el código utilizado, así­ como el proyecto.
Si estoy cometiendo un error, por favor dí­ganme como corregirlo.
Por favor explí­quenme que pasa?
//---------------------------------------------------------- --------------------
// Form1.prg
//---------------------------------------------------------- --------------------
#include "Xailer.ch"
CLASS TForm1 FROM TForm
COMPONENT oButton1
METHOD CreateForm()
METHOD Button1Click( oSender )
ENDCLASS
#include "Form1.xfm"
//---------------------------------------------------------- --------------------
METHOD Button1Click( oSender ) CLASS TForm1
TForm2():New(Self):ShowModal()
RETURN Nil
//---------------------------------------------------------- --------------------
//---------------------------------------------------------- --------------------
// Form2.prg
//---------------------------------------------------------- --------------------
#include "Xailer.ch"
CLASS TForm2 FROM TForm
COMPONENT oLabel1
COMPONENT oDato1
COMPONENT oLabel2
COMPONENT oDato2
COMPONENT oButton1

DATA oD INIT TObjDat()
METHOD CreateForm()
METHOD FormInitialize( oSender )
METHOD Button1Click( oSender )
ENDCLASS
#include "Form2.xfm"
//---------------------------------------------------------- --------------------
METHOD FormInitialize( oSender ) CLASS TForm2
::oD:nDato1 := 1
::oD:nDato2++ // Este dato se va incrementando al entrar, salir y volver a entrar

::oDato1:Value := ::oD:nDato1
::oDato2:Value := ::oD:nDato2
RETURN Nil
//---------------------------------------------------------- --------------------
CLASS TObjDat
DATA nDato1 INIT 00 // Se INIACIALIZAN datos ?
DATA nDato2 INIT 00 // Al crear la instancia la PRIMERA vez SI.
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD Button1Click( oSender ) CLASS TForm2
::Close() // Se Cierra la Forma actual
::End() // Se "SUPONE" que se ELIMINA la Forma (Clase TForm2)
RETURN Nil
//---------------------------------------------------------- --------------------


Attached files Test02.zip (49.2 KB)Â
Alejandro Herrera
Mexicali, B.C., Mexico
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Inicializa al Crear la Instancia de una Clase

Mensaje por ignacio »

Simplemente cambie esto:
DATA oD INIT TObjDat()
Por esto:
DATA oD
Y en FormInitialize:
::oD := TObjDat()
El problema se produce porque Harbour no recrea completamente el objeto con sus valores iniciales cada vez que se crea una nueva instancia del mismo, sino que simplemente devuelve una copia de la primera instancia. Esto es así­ simplemente por velocidad, con tipos básicos no hay ningún problema pero cuando algún elemento tiene como miembro a un objeto, entonces todos las instancias 'comparten' el mismo objeto. Solución: Ya lo ha visto, no usar INIT y crear el objeto en su constructor.
Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
alexherrera@equipo.com.mx
Mensajes: 37
Registrado: Vie Jun 15, 2012 5:45 am

Inicializa al Crear la Instancia de una Clase

Mensaje por alexherrera@equipo.com.mx »

Muchas Gracias Ignacio !!!
Alejandro Herrera
Mexicali, B.C., Mexico
Responder