Comportamiento extraño

HMG en Español

Moderator: Rathinagiri

jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm

Comportamiento extraño

Post by jpuntoapunto »

Hola, necesito vuestra ayuda.
Me he encontrado con un comportamiento extraño que no consigo solucionar.
He confeccionado un pequeño ejemplo por si podeis probarlo.

Probad estos pasos:
1-Ejecutar la Demo
2-Seleccionar "OPTIONS" y "Windows 1"
3-Seleccionar "OPTIONS" y "Windows 2"
4-Pinchad en "OK"
5-Se muestra el contenido de la variable "cVar". No hay problema.

Ahora cerrad "Windows 1".
Volved a pinchar en "OK".
¡¡ La variable "cVar" ha desaparecido !!.

¿ Por que ?. No le encuentro sentido que al cerrar la primera ventana desaparezcan
las variables "Private" de la segunda, no tienen relacion la una con la otra.
No lo entiendo.

Esto no ocurre si las variables son "Local" o "Static" pero estas no puedo utilizarlas
ya que tiene que estas accesibles desde otros procedimientos.

Saludos y gracias por vuestra atencion.

Aqui el ejemplo:

Code: Select all

#include "hmg.ch"

Function Main

	DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 1000 HEIGHT 800 ;
    MAIN

    DEFINE MAIN MENU OF Form_1
      POPUP "OPTIONS"
        ITEM "Windows 1" ACTION Win1()
        ITEM "Windows 2" ACTION Win2()
      END POPUP
    END MENU
		
	END WINDOW

	ACTIVATE WINDOW Form_1

Return

//**************

Function Win1()

	DEFINE WINDOW Form_2 ;
    AT 100,50 ;
    WIDTH 300 HEIGHT 300

	END WINDOW

	ACTIVATE WINDOW Form_2

Return

//***************

Function Win2()
 PRIVATE cVar:="HELLO WORLD"

	DEFINE WINDOW Form_3 ;
    AT 100,500 ;
    WIDTH 300 HEIGHT 300

    @ 10,10 BUTTON Button_1 OF Form_3 CAPTION "OK" ACTION msgdebug(cVar)
		
	END WINDOW
	ACTIVATE WINDOW Form_3

Return
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Comportamiento extraño

Post by Pablo César »

Hola J.A.

Lo que pude observar es que la variable del tipo PRIVATE sirve para el modulo actual e de las otras funciones que estén debajo del. Otra porque las variables PRIVATE solo se pueden declarar apenas una vez.
Lo cambié de lugar lo puse en el Main (arriba herarquicamente que Win1) y funcionó ademas de cambiar el tipo de windows. Fijate si te resuelve:

Code: Select all

#include "hmg.ch"

Function Main

PRIVATE cVar:="HELLO WORLD"  // Cambio de lugar

DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 1000 HEIGHT 800 ;
	TITLE 'Tutor 15 Progressbar Test' ;
    MAIN

    DEFINE MAIN MENU OF Form_1
      POPUP "OPTIONS"
        ITEM "Windows 1" ACTION Win1()
        ITEM "Windows 2" ACTION Win2()
      END POPUP
    END MENU
      
END WINDOW
ACTIVATE WINDOW Form_1
Return

//**************

Function Win1()
DEFINE WINDOW Form_2 ;
    AT 100,50 ;
    WIDTH 300 HEIGHT 300 CHILD // otro tipo de ventana

END WINDOW
ACTIVATE WINDOW Form_2
Return

//***************

Function Win2()
DEFINE WINDOW Form_3 ;
    AT 100,500 ;
    WIDTH 300 HEIGHT 300 CHILD  // otro tipo de ventana

    @ 10,10 BUTTON Button_1 OF Form_3 CAPTION "OK" ACTION msgdebug(cVar)
      
END WINDOW
ACTIVATE WINDOW Form_3
Return
No sé lo que intentas hacer con esa variable. Otra ocion es pasar por parametros cuando llamas Win1(cVar), Win2(cVar).

Todo esto se refiere a conceptos del propio lenguaje xBase, no tiene a ver con HMG. Si a Harbour. Concepto de variables.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm

Re: Comportamiento extraño

Post by jpuntoapunto »

Hola Pablo.

Tienes razon en que poniendo las variables en Main() estas no desaparecen, pero no lo puedo hacer asi ya que necesito utilizar muchas mas y se mezclarian. Poniendo solo las ventanas child tambien se produce la desaparicion de la variable.
En realidad los modulos Win1, Win2, Win3, etc son mucho mas grandes y separados, aqui los he puesto asi para demostrar el raro funcionamiento que tienen y probarlo facilmente.

Saludos.
J.A.
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Comportamiento extraño

Post by Pablo César »

jpuntoapunto wrote:Tienes razon en que poniendo las variables en Main() estas no desaparecen
Si porque es solo usado una sola vez y arriba herarquicamente de Win1(). Si declaraste una vez PRIVATE determinada variable, no puede volver a declararla otra vez PRIVATE. Entiendes? Vos todavia no dijiste para qué querés que esas variables sean PRIVATE. Talvez siendo LOCAL resulevan. Tenés otra opcion: declará en el main todas las variables PRIVATE y en el modulo Win1() atribuis los valores a esas mismas variables sin poner PRIVATE ni nada. Ejemplo:

Function Main()
PRIVATE cVar1, cVar2
...

Function Win1()
cVar1:="Hi"
cVar2:="Hola"
jpuntoapunto wrote:Poniendo solo las ventanas child tambien se produce la desaparicion de la variable.
Apenas cambié el tipo de ventanas para que pudiera dejar la dos visibles, antes una se minimizaba la ventana que estaba abierta al abrir una nueva. Como dije antes, ese comportamiento que lo ves estraño no tiene nada a ver con los componentes de HMG.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm

Re: Comportamiento extraño

Post by jpuntoapunto »

Si declaraste una vez PRIVATE determinada variable, no puede volver a declararla otra vez PRIVATE. Entiendes?
En Clipper se podia definir las misma variable Private en modulos distintos y no se mezclaban sus contenidos como ocurre aqui.
Vos todavia no dijiste para qué querés que esas variables sean PRIVATE. Talvez siendo LOCAL resulevan.
Tienen que ser Private ya que hay mas modulos llamados desde Win2 (es un ejemplo) que las utilizan y son comunes a todos esos modulos.
Por ejemplo: Win1 y los modulos llamados desde Win1 deben tener unas variables privadas comunes.
Win2 y los modulos llamados desde Win2 deben tener sus propias variables privadas comunes.

Lo que no encuentro lógico es que al cerrar Win1 se borren las variables privadas definidas en Win2. ¿ Acaso el hecho de cerrar una ventana hace algun tipo de "release" de todas las variables de memoria Private ?. No se, ando algo perdido con este problema.

Gracias por tu interes.
Saludos.
J.A.
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Comportamiento extraño

Post by Pablo César »

jpuntoapunto wrote:Lo que no encuentro lógico es que al cerrar Win1 se borren las variables privadas definidas en Win2. ¿ Acaso el hecho de cerrar una ventana hace algun tipo de "release" de todas las variables de memoria Private ?. No se, ando algo perdido con este problema.
Yo intenté explicarte, pero creo que no prestaste bien atencion o no me super hacer entender mejor...

Si tu cierras el módulo que originó el PRIVATE, es lógico (al menos para mi) que la variable se encierre por no dejar sub-funciones. En cambio aqui tu estás abriendo nuevas ventanas. Si quieres compartir variables, tendrias que definirlas de modo PUBLIC o PRIVATE pero este ultimo lo tiene que hace en la funcion madre, para que las sub funciones hijos lo reconozcan. Tambien te dije que poderias pasar variables atravez de parametros. Ejemplo: Win2(cVar1, cVar2).

Cuando abres una nueva ventana estás abriendo una nueva instancia. Es mas o menos como si abrieras otro "Prompt de comando".

Mencionaste que serian muchas variables. Ya pensaste en pasarlas como ARRAY ? Vectores pueden ser muy útil y dinámicos.

Lamento no poder te ayudar más. Sin código y bien ejemplificado, no se puede entender lo que el otro espera.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm

Re: Comportamiento extraño

Post by jpuntoapunto »

Pablo César wrote:Lamento no poder te ayudar más. Sin código y bien ejemplificado, no se puede entender lo que el otro espera.
Si, es complicado, lo siento.

He hecho una pequeña modificacion.

Code: Select all

#include "hmg.ch"

Function Main
	DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 1000 HEIGHT 800 ;
    MAIN

    DEFINE MAIN MENU OF Form_1
      POPUP "OPTIONS"
        ITEM "Windows 1" ACTION Win1()
        ITEM "Windows 2" ACTION Win2()
      END POPUP
    END MENU
		
	END WINDOW
	ACTIVATE WINDOW Form_1

Return

//**************

Function Win1()

	DEFINE WINDOW Form_2 ;
    AT 100,50 ;
    WIDTH 300 HEIGHT 300 CHILD

	END WINDOW
	ACTIVATE WINDOW Form_2

Return

//***************

Function Win2()
  PRIVATE cVar

  cVar:="HELLO WORLD"

	DEFINE WINDOW Form_3 ;
    AT 100,500 ;
    WIDTH 300 HEIGHT 300 CHILD

    @ 10,10 BUTTON Button_1 OF Form_3 CAPTION "OK" ACTION Variable()
		
	END WINDOW
	ACTIVATE WINDOW Form_3

Return

Function Variable()
  msgdebug(cVar)
RETURN
Si tu cierras el módulo que originó el PRIVATE, es lógico (al menos para mi) que la variable se encierre por no dejar sub-funciones.
Exacto, es perfectamente lógico. Pero en el ejemplo puedes ver que la variable "cVar" definida en la funcion "Win2" desaparece sólo por cerrar Windows 1 donde no existe ninguna referencia "cVar".

Por favor, solo prueba estos pasos:
-Abre Demo.exe
-Pincha OPTIONS-Windows 1
-Pincha OPTIONS-Windows 2
-Cierra Windows 1
-Pincha "OK" de Windows 2

¡¡Error!!, la variable no existe. ¿Por qué?, si lo que yo he hecho es cerrar Windows 1, no he tocado Windows 2 (que contiene "cVar").
Si me dices que eso es normal lo dejo y la solucion, como bien dices, será definirlas en Main().

Perdon por las molestias.
Saludos.
J.A.
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Comportamiento extraño

Post by Pablo César »

Hola sos Javier (no es cierto?),

Hice la secuencia que tu pedistes. Y me dió error. Claro con el PRIVATE en Win2.

Hice otro testeo pero cambié la secuencia. Abri primero el Win2 y despues la Win1, cerré la Win1 y no me dá falta de la variable.

Tambien hice otro testeo igual a tu recomendacion, solo que al invés de PRIVATE cambié por PUBLIC (claro esto toma más memória) y todo eso wn el Win2. Y con PUBLIC no dá error alguno, ni con esa secuencia ni con la otra.

Parece estraño, pero si fuera algun problema con HMG lo haria tambien con mi segundo testeo. No te parece ?

Sabes que las acciones las guarda en BlockCodes y esto es compuesto en la compilacion. Puede ser (muy probable) que las variables del tipo PRIVATE no la reconozca más cuando hay una alteracion de orden quebrada.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: Comportamiento extraño

Post by srvet_claudio »

Una sugerencia: HMG Debugger para ver el stack y la secuencia de funciones pendientes, seguramente al cerrar la ventana se cierra el MsgLoop que mantenía pendiente la subrutina. Recuerda que esto es Windows no DOS.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
jpuntoapunto
Posts: 36
Joined: Sat Jun 01, 2013 6:50 pm

Re: Comportamiento extraño

Post by jpuntoapunto »

srvet_claudio wrote:Una sugerencia: HMG Debugger para ver el stack y la secuencia de funciones pendientes, seguramente al cerrar la ventana se cierra el MsgLoop que mantenía pendiente la subrutina. Recuerda que esto es Windows no DOS.
Uff, lo siento. No se como utilizar HMG Debugger ni lo que es MsgLoop.
Demasiado para mi, estoy muy verde aun.
¿ Podrias probar el ejemplo y seguir las secuencia ?

Saludos y gracias.
J.A.
Post Reply