Page 1 of 1

Inicializa al Crear la Instancia de una Clase

Posted: Sat Oct 19, 2013 7:31 am
by 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)Â

Inicializa al Crear la Instancia de una Clase

Posted: Mon Oct 21, 2013 9:48 am
by 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

Inicializa al Crear la Instancia de una Clase

Posted: Mon Oct 21, 2013 8:06 pm
by alexherrera@equipo.com.mx
Muchas Gracias Ignacio !!!