Page 2 of 2

Re: Variables PRIVATE no existen.

Posted: Wed Mar 26, 2014 4:39 am
by Javier Tovar
So is Esgici :D :D :D

Saludos

Re: Variables PRIVATE no existen.

Posted: Wed Mar 26, 2014 8:20 pm
by edufloriv
Saludos amigos,

Como amablemente respondió esgici, lo he resuelto haciendo la variable pública, hasta ahora va bien, espero siga asi. Sin embargo me quedó la duda e hice un pequeño .prg para emular, al mínimo, el entorno del problema.

Code: Select all

#include <hmg.ch>

FUNCTION MAIN()

   DEFINE WINDOW Win_Main ;
      AT 0 , 0 ;
      WIDTH 1020 HEIGHT 730 ;
      TITLE "PRINCIPAL" ;
      FONT "Arial" SIZE 9 ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Menú"
            ITEM 'Orden de compra'     ACTION Orden()
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW Win_Main

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC ORDEN()

   IF IsWindowDefined(Win_Orden)=.T.
      MINIMIZE WINDOW Win_Orden
      RESTORE WINDOW Win_Orden
      RETURN
   ENDIF

PRIVATE OH_MODO := 'Inicial'

   IF ! ISDIR('c:\Farmacom\Ordenes')
      CreateFolder('c:\Farmacom\Ordenes')
   ENDIF

   DEFINE WINDOW Win_Orden ;
      AT 0 , 0 ;
      WIDTH 600 HEIGHT 500 ;
      TITLE "ORDEN DE COMPRA" ;
      FONT "Arial" SIZE 9 ;
      CHILD ;
      NOMAXIMIZE ;
      ON INIT OrdenIniciar() ;
      ON RELEASE OrdenSalir()

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM 'Crear'     ACTION OrdenCrear()
            ITEM 'Grabar'    ACTION OrdenGrabar()
            ITEM 'Abrir'     ACTION OrdenAbrir()
            SEPARATOR
            ITEM 'Ver estado'  ACTION OrdenVer()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_Orden
   ACTIVATE WINDOW Win_Orden

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenIniciar

   OH_MODO := 'Nada'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenSalir

   IF OH_MODO = 'Crear'
      MsgInfo('OH_MODO = Crear')
   ENDIF

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenCrear

   OH_MODO := 'Crear'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenGrabar

   OH_MODO := 'Grabar'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenAbrir

   OH_MODO := 'Abrir'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenVer

   MsgInfo( 'Estado : '+OH_MODO )

RETURN
La verdad me desconcierta, porque he probado y reprobado este test y no puedo hacer que me salga el mismo error. Bueno, será porque en el test el código esta más limpio, de todas formas voy a seguir haciendo pruebas y les informo.


Saludos cordiales a todos.

Re: Variables PRIVATE no existen.

Posted: Wed Mar 26, 2014 8:47 pm
by Javier Tovar
Hola edufloriv,

El ERROR te va a ocurrir cuando tu declares variables Privadas en un nivel inferior de donde las quieres llamar. tu codigo es igual que el tuyo solo que llamo a la función "OrdenVer()" desde "Win_Main". Espero que te haya quedado claro.


Saludos

Code: Select all

#include <hmg.ch>

FUNCTION MAIN()

   DEFINE WINDOW Win_Main ;
      AT 0 , 0 ;
      WIDTH 1020 HEIGHT 730 ;
      TITLE "PRINCIPAL" ;
      FONT "Arial" SIZE 9 ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Menú"
            ITEM 'Orden de compra'     ACTION Orden()
	    ITEM 'Orden Ver'              ACTION OrdenVer()    // <============================AQUI TE SALTA EL ERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOR!
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW Win_Main

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC ORDEN()

   IF IsWindowDefined(Win_Orden)=.T.
      MINIMIZE WINDOW Win_Orden
      RESTORE WINDOW Win_Orden
      RETURN
   ENDIF

PRIVATE OH_MODO := 'Inicial'

   IF ! ISDIR('c:\Farmacom\Ordenes')
      CreateFolder('c:\Farmacom\Ordenes')
   ENDIF

   DEFINE WINDOW Win_Orden ;
      AT 0 , 0 ;
      WIDTH 600 HEIGHT 500 ;
      TITLE "ORDEN DE COMPRA" ;
      FONT "Arial" SIZE 9 ;
      CHILD ;
      NOMAXIMIZE ;
      ON INIT OrdenIniciar() ;
      ON RELEASE OrdenSalir()

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM 'Crear'     ACTION OrdenCrear()
            ITEM 'Grabar'    ACTION OrdenGrabar()
            ITEM 'Abrir'     ACTION OrdenAbrir()
            SEPARATOR
            ITEM 'Ver estado'  ACTION OrdenVer()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_Orden
   ACTIVATE WINDOW Win_Orden

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenIniciar

   OH_MODO := 'Nada'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenSalir

   IF OH_MODO = 'Crear'
      MsgInfo('OH_MODO = Crear')
   ENDIF

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenCrear

   OH_MODO := 'Crear'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenGrabar

   OH_MODO := 'Grabar'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenAbrir

   OH_MODO := 'Abrir'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenVer

   MsgInfo( 'Estado : '+OH_MODO )

RETURN

Re: Variables PRIVATE no existen.

Posted: Wed Mar 26, 2014 8:54 pm
by Javier Tovar
Ahora cheque este Código.

Code: Select all

#include <hmg.ch>

FUNCTION MAIN()
PRIVATE OH_MODO := 'Inicial'     //    <AQUÍ DECLARO LA VARIABLE Y ES VISIBLE EN TODO EL *.PRG

   DEFINE WINDOW Win_Main ;
      AT 0 , 0 ;
      WIDTH 1020 HEIGHT 730 ;
      TITLE "PRINCIPAL" ;
      FONT "Arial" SIZE 9 ;
      MAIN

      DEFINE MAIN MENU
         POPUP "&Menú"
            ITEM 'Orden de compra'     ACTION Orden()
			ITEM 'Orden Ver'     ACTION OrdenVer()    
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW Win_Main

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC ORDEN()

   IF IsWindowDefined(Win_Orden)=.T.
      MINIMIZE WINDOW Win_Orden
      RESTORE WINDOW Win_Orden
      RETURN
   ENDIF

   IF ! ISDIR('c:\Farmacom\Ordenes')
      CreateFolder('c:\Farmacom\Ordenes')
   ENDIF

   DEFINE WINDOW Win_Orden ;
      AT 0 , 0 ;
      WIDTH 600 HEIGHT 500 ;
      TITLE "ORDEN DE COMPRA" ;
      FONT "Arial" SIZE 9 ;
      CHILD ;
      NOMAXIMIZE ;
      ON INIT OrdenIniciar() ;
      ON RELEASE OrdenSalir()

      DEFINE MAIN MENU
         POPUP "&Operaciones"
            ITEM 'Crear'     ACTION OrdenCrear()
            ITEM 'Grabar'    ACTION OrdenGrabar()
            ITEM 'Abrir'     ACTION OrdenAbrir()
            SEPARATOR
            ITEM 'Ver estado'  ACTION OrdenVer()
         END POPUP
      END MENU

   END WINDOW

   CENTER WINDOW Win_Orden
   ACTIVATE WINDOW Win_Orden

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenIniciar

   OH_MODO := 'Nada'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenSalir

   IF OH_MODO = 'Crear'
      MsgInfo('OH_MODO = Crear')
   ENDIF

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenCrear

   OH_MODO := 'Crear'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenGrabar

   OH_MODO := 'Grabar'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenAbrir

   OH_MODO := 'Abrir'

RETURN


*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC OrdenVer

   MsgInfo( 'Estado : '+OH_MODO )

RETURN
Saludos

Re: Variables PRIVATE no existen.

Posted: Wed Mar 26, 2014 8:57 pm
by Javier Tovar
CORRECCIÓN DE ERRATAS, :D
Javier Tovar wrote:El ERROR te va a ocurrir cuando tu declares variables publicas en un nivel inferior de donde las quieres llamar. tu codigo es igual que el tuyo solo que llamo a la función "OrdenVer()" desde "Win_Main". Espero que te haya quedado claro.
No es Variables publicas, sino lo correcto es "Variables Privadas".

Saludos

Re: Variables PRIVATE no existen.

Posted: Fri Mar 28, 2014 2:32 am
by luisvasquezcl
Hola Eduardo,
Cuando declaras una variable a nivel de módulo, me refiero a que es creada cuando inicia el programa y no dentro de una funcion o procedimiento, la variable será visible en todo el programa, ya sea dentro o fuera de un procedimiento o funcion.
Si la defines dentro de un procedimiento o función su visibilidad estará restringuida a esa porción de programa.

Por ejemplo

/* Variable creada a nivel de módulo */

Private MiVar := "Hola"
alert( mivar ) // Aqui muestra "Hola"
Cambiar_valor()
alert( mivar ) // Aqui muestra "Adios"
procedure cambiar_valor()
// aqui cambia la variable creada al inicio del módulo y no crea una nueva.
mivar := "Adios"
Return

/* Variable creada a nivel de procedimiento */
Procedure main
Private Mivar := "Hola"
alert( mivar )
cambiar_valor()
mostrar()
return

procedure cambiar_valor()
// probablemente aqui no te de error porque directamente creará una nueva variable mivar
// pero visible sólo para este procedimiento.
mivar = "Adios"
return

procedure mostrar()
// aqui debería mostrar un error porque la variable no es visible porque fue definida en el main
alert( mivar )
return
Espero te sea de ayuda.
Saludos cordiales,
Luis Vasquez