Usar o no variables publicas.

User avatar
jvtecheto
Posts: 603
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Usar o no variables publicas.

Post by jvtecheto »

Hola el tema es este

Variables publicas si o no. ?
yo siempre he leido que no es aconsejable utilizarlas, por eso ahora utilizo el siguiente sistema.
como siempre tenemos que acceder a variables que estan en otros modulos. Yo declaro las variables static.
y las paso a otros modulos asi.

Code: Select all | Expand


FUNCTION GetWndMain()
RETURN oWndMain  
 

y en el modulo que la tengo que utilizar.

Code: Select all | Expand


oWndMain := GetWndMain()
 


El tema funciona bien, pero en cada modulo que voy a utilizarla, que sera en casi todos tengo que llamar a la funcion.
Si utilizara variable publica me ahorraria esto, seria mejor?

¿Como lo haceis vosotros para acceder a una variable de otro modulo?

Espero haberme explicado bien, muchas gracias por vuestra ayuda.

Saludos.

Jose.
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
User avatar
karinha
Posts: 7935
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 3 times
Contact:

Re: Usar o no variables publicas.

Post by karinha »

Puedes usarlo sin ningún problema. cuando salga del programa use CLEAR MEMORY.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
cnavarro
Posts: 6557
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Usar o no variables publicas.

Post by cnavarro »

Como dice el compañero, se pueden seguir utilizando, pero a mí particularmente no me gusta su uso, prefiero sólo utilizar las variables definidas en su propio módulo, por lo que en todo caso utilizo la técnica que has descrito ( llamar a la function que me devuelva la variable que utilizo )
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Antonio Mart.
Posts: 174
Joined: Sat Feb 23, 2013 10:04 am

Re: Usar o no variables publicas.

Post by Antonio Mart. »

Yo tampoco utilizo ni Public ni Private, pero si tengo una Public oApp
User avatar
cnavarro
Posts: 6557
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Usar o no variables publicas.

Post by cnavarro »

Antonio Mart. wrote:Yo tampoco utilizo ni Public ni Private, pero si tengo una Public oApp

Sí, también es una práctica muy habitual, en la que existe una clase TApp o algo asi
En ese caso, lo lógico es convertir a DATAs cada una de esas variables públicas y obtenerlas a partir del objeto oApp, o, yo incluso veo mejor hacer en una DATA un hash que contenga las el valor de las antiguas variables públicas y, en el caso de ser static la variable oApp, y no public devolver el hash del key que envías como parámetro.
Utilizando este método, sólo necesitas una llamada a una sola function

Code: Select all | Expand


Function GetVarPublic( cVar )
// Comprobar que lo que recibe como parámetro está definido como key en el hash ( hb_HHashkey() )
Return oApp:aPublics[ cVar ]
 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: Usar o no variables publicas.

Post by xmanuel »

Creo que deberías usar lo que más te guste o más práctico sea para ti.

En nuestro querido y viejo clipper había unos límites fáciles de alcanzar de variables públics y privates en la TABLA DE SÍMBOLOS, pero esa limitación ya no existe en Harbour.
Personalmente por inercia tampoco las utilizo, pero me reitero sólo por inercia.

Yo como soy muy de POO uso una clase TCore o TKernel compuesta solo de datas que serían las variables que voy a usar en mis prg
Es más se me ocurre que si esas datas son CLASDATA no habría ni que instaciar un objeto de esa clase y se podría hacer algo así:

Code: Select all | Expand


CLASS TKernel
    CLASSDATA xVar1
    CLASSDATA xVar2
    CLASSDATA xVar3
ENDCLASS
// Y en el programa se podría hacer
TKernel:xVar1 := "Esto es una prueba"
? TKernel:xVar1
 


Es mas podría haber una sola CLASSDATA de tipo Hash que aumentaria segú se requiera:

Code: Select all | Expand


CLASS TKernel
    CLASSDATA hVar
ENDCLASS

TKernel:hVar[ "DNI" ] := "89436870T"
? TKernel:hVar[ "DNI" ]

 


Bueno lo dejo porque se me está disparando la perola!!!
:D
______________________________________________________________________________
Sevilla - Andalucía
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Usar o no variables publicas.

Post by carlos vargas »

Últimamente me hecho adicto a los hash
en mis app tengo un

Code: Select all | Expand


en el modulo inicial
PUBLIC hGlobal := {=>}
hGlobal[ "userid" ] :=
hGlobal[ "userlevel" ] :=
hGlobal[ "usermodules" ] :=
 

y asi, las que necesite.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
horacio
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Usar o no variables publicas.

Post by horacio »

Hay una clase que yo utilizo que se llama TPublic, donde defines solo una variable pública y declaras las que quieras dentro de ella.

Code: Select all | Expand


Public o

With Object o := TPublic() : New()
    :Add( "usuario" )
    :Add( "passw" )
EndWith

 


Tiene varios métodos para gestionarla.
Saludos
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Usar o no variables publicas.

Post by Antonio Linares »

Horacio,

Puedes publicar aqui el código fuente de la clase TPublic que comentas ? gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
horacio
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Usar o no variables publicas.

Post by horacio »

La clase es de Daniel Andrade, un coterraneo :D


Code: Select all | Expand


 *  -----------------------------------------------------------------------------
 *  TPublic()
 *  Clase para el reemplazo de Variables Publicas
 *  Version 2.2b - 01/04/2003
 *
 *  Andrade A. Daniel
 *  Rosario - Santa Fe - Argentina
 *
 *  andrade_2knews@hotmail.com
 *  http://www.dbwide.com.ar
 *
 *  Aportes: [ER]   Eduardo Rizzolo
 *           [WA]   Wilson Alves - wolverine@sercomtel.com.br 18/05/2002
 *           [JJMG] Juan J. Mendez Gonzalez
 *
 *  DATAS
 *  -----------------------------------------------------------------------------
 * aVars      - Arreglo de variables
 * cName      - Nombre ultima variable accedida
 * nPos       - Valor ultimo variable accedida
 * lAutomatic - Asignación automatica, por defecto TRUE [WA]
 *
 *  METODOS
 *  -----------------------------------------------------------------------------
 * New()      - Contructor
 * Add()      - Agrega/define nueva variable
 * Del()      - Borra variable
 * Get()      - Accede a una veriable directamente
 * Set()      - Define nuevo valor directamente
 * GetPos()   - Obtener la posición en el array
 * Release()  - Borra todas las variables
 * IsDef()    - Chequea si una variable fue definida
 * Clone()    - Clona la DATA aVars
 * nCount()   - Devuelve cantidad de variables definidas
 * Save()     - Salva DATA aVars
 * Restore()  - Restaura DATA aVars
 *
 *  NOTA
 *  -----------------------------------------------------------------------------
 * Para acceder al valor de una variable, se puede hacer de 2 formas,
 * una directa usando oPub:Get("Codigo") o por Prueba/Error oPub:Codigo,
 * este último es mas simple de usar pero más lento.
 *
 * Para definir un nuevo valor a una variable tambien puede ser por 2 formas,
 * directamente por oPub:Set("Codigo", "ABC" ), o por Prueba/Error
 * oPub:Codigo := "ABC".
 *
 * Atencion: Los metodos Get() y Set() no controlan si la variable existe,
 * para ganar en velocidad.
 *
 * Las variables definidas NO son case sensitive.
 *
 *  MODIFICACIONES Y AGREGADOS
 *  -----------------------------------------------------------------------------
 * 2.2b Correción Bug en metodo Add() sobre FWH.
 * 2.2a Modificado para não restringir o número de variáveis em [x]Harbour [WA]
 * 2.2  Modificada para funcionar en [x]Harbour
 *
 * 2.1  Se guarda el Nombre y Posición de la última variable accedida para incrementar
 *      la velocidad. (Implementado por Eduardo Rizzolo)
 *
 *  EJEMPLO
 *  -----------------------------------------------------------------------------
 * FUNCTION Test()
 * local oP := TPublic():New(), aSave, nPos
 *
 * oP:Add("Codigo")           // Defino variable sin valor inicial
 * oP:Add("Precio", 1.15)     // Defino variable con valor inicial
 * oP:Add("Cantidad", 10 )
 * oP:Add("TOTAL" )
 *
 * // Acceso a variables por prueba/error
 * oP:Total := oP:Precio * oP:Cantidad
 *
 * // Definicion y Acceso a variables directamente
 * oP:Set("Total", oP:Get("precio") * oP:Get("CANTIDAD") )
 *
 * oP:Del("Total")         // Borro una variable
 * ? oP:IsDef("TOTAL")     // Varifico si existe una variable
 *
 * nPos := oP:GetPos("Total") // Obtengo la posición en el array
 * oP:aVars[nPos,2] := 0      // Modifico el Valor en el array directo
 *
 * aSave := oP:Save()      // Guardo las Variables
 * oP:Release()         // Borro TODAS las variables
 * oP:Restore( aSave )     // Restauro las variables
 *
 * oP:End()       // Termino
 *
 * RETURN NIL
 *
 *  EXEMPLO (Asignación Automática)
 *
 * FUNCTION MAIN()
 * LOCAL oP:=TPublic():New(.T.)
 *
 * op:nome     := "Wilson Alves"
 * op:Endereco := "Rua dos Cravos,75"
 * op:Cidade   := "Londrina-PR"
 * op:Celular  := "9112-5495"
 * op:Empresa  := "WCW Software"
 *
 * ? op:Nome,op:Endereco,op:Cidade,op:celular,op:empresa
 *
 * op:End()
 * RETURN NIL
 *
 *

# include "FiveWin.ch"

#ifdef __HARBOUR__
  # xtranslate BYNAME <V> [, <VN> ]     => ::<V> := <V> [; ::<VN> := <VN> ]
  # xtranslate BYNAME <V> DEFAULT <Val> => ::<V> := BYDEFAULT <V>, <Val>
  # xtranslate BYNAME <V> IFNONIL       => if <V> != NIL ; ::<V> := <V> ; endif
  # xtranslate BYDEFAULT <V>, <Val>     => if( <V> == NIL, <Val>, <V> )
#endif

*
* TPublic()
*
CLASS TPublic

   DATA  lAutomatic  AS LOGICAL     INIT .T.    // [WA]

   DATA  aVars       AS ARRAY       INIT NIL
   DATA  nPos        AS NUMERIC     INIT 0   READONLY // [ER]
   DATA  cName       AS CHARACTER   INIT ""  READONLY // [ER]

   METHOD New( lAutomatic )
   METHOD End()      INLINE ::Release()

   METHOD Add( cName, xValue )
   METHOD Del( cName )
   METHOD Get( cName )
   METHOD Set( cName, xValue )

   METHOD GetPos( cName )

   METHOD Release()
   METHOD IsDef( cName )

   METHOD Clone()    INLINE aClone( ::aClone )
   METHOD nCount()      INLINE Len( ::aVars )

   METHOD Save()     INLINE aClone( ::aVars )
   METHOD Restore( aVars ) INLINE ::aVars := aClone( aVars )

#ifdef __HARBOUR__
   ERROR HANDLER OnError( uParam1 )
#else
   ERROR HANDLER OnError( cMsg, nError )
#endif

ENDCLASS

*
*  TPublic:New()
*
METHOD New( lAutomatic ) CLASS TPublic // [WA]

   ::aVars := {}

   BYNAME  lAutomatic DEFAULT .T.   // [WA]

RETURN Self

*
*  TPublic:Add()
*
METHOD Add( cName, xValue ) CLASS TPublic // [ER]

  if cName != NIL
    if (::nPos := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )) != 0
      ::aVars[::nPos,2] := xValue

#ifndef __HARBOUR__                 // [WA]
    elseif Len(::aVars) < 4000      // [JJMG]
      aAdd( ::aVars, { AllTrim(Upper(cName)), xValue } )
      ::nPos := Len(::aVars)

    else
      MsgAlert("Demasiadas variables definidas para la Clase TPublic()")

#else
    else
      aAdd( ::aVars, { AllTrim(Upper(cName)), xValue } )
      ::nPos := Len(::aVars)
#endif                              // [WA]

    endif

    ::cName  := cName
  endif

RETURN Self

*
*  TPublic:Del()
*
METHOD Del( cName ) CLASS TPublic
   local nPos

   if cName != NIL
      if (nPos := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )) != 0
         aDel( ::aVars, nPos )
         ::aVars := aSize( ::aVars, Len(::aVars) - 1 )

         ::nPos   := 0
         ::cName  := ""
      endif
   endif

RETURN Self

*
*  TPublic:Get()
*
METHOD Get( cName ) CLASS TPublic                  // [by ER]

   if cName != ::cName
      ::nPos   := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )
      ::cName  := cName
   endif

RETURN ::aVars[::nPos,2]

*
*  TPublic:Set()
*
METHOD Set( cName, xValue ) CLASS TPublic             // [by ER]

   if cName != ::cName
      ::nPos   := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )
      ::cName  := cName
   endif

   ::aVars[::nPos,2] := xValue

RETURN Self

*
*  TPublic:GetPos()                         // [by ER]
*
METHOD GetPos( cName ) CLASS TPublic

   ::cName  := cName

RETURN ::nPos := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )


*
*  TPublic:Release()
*
METHOD Release() CLASS TPublic

   ASIZE(::aVars,0)
   ::cName  := ""
   ::nPos   := 0

RETURN Self

*
*  TPublic:IsDef()
*
METHOD IsDef( cName ) CLASS TPublic                // [by ER]

   local lOk := .F.

   if cName != NIL
      if (::nPos := aScan( ::aVars, { |e,n| e[1] == AllTrim(Upper(cName)) } )) != 0
         ::cName := cName
         lOk := .T.
      endif
   endif

RETURN lOk

*
*  OnError()
*
#ifdef __HARBOUR__
   METHOD OnError( uParam1 ) CLASS TPublic
      local cMsg   := __GetMessage()
      local nError := If( SubStr( cMsg, 1, 1 ) == "_", 1005, 1004 )
#else
   METHOD OnError( cMsg, nError ) CLASS TPublic
      local uParam1 := GetParam( 1, 1 )
#endif

   cMsg := Upper( AllTrim( cMsg ))

   if SubStr( cMsg, 1, 1 ) == "_"
      cMsg := SubStr( cMsg, 2 )

      if cMsg == Upper(::cName)
         ::aVars[::nPos,2] := uParam1

      elseif ( ::nPos := aScan( ::aVars, { |e,n| e[1] == cMsg } ) ) != 0
         ::cName  := cMsg
         ::aVars[::nPos,2] := uParam1

      else

         if !::lAutomatic  // [WA]
            _ClsSetError( _GenError( nError, ::ClassName(), cMsg ) )
            ::cName  := ""
            ::nPos   := 0
         else
            ::add(cmsg)
            ::aVars[::nPos,2] := uParam1
         endif
      endif
   else
      if cMsg == Upper(::cName)           // [by ER]
         RETURN ::aVars[::nPos,2]

      elseif ( ::nPos := aScan( ::aVars, { |e,n| e[1] == cMsg } ) ) != 0
         ::cName  := cMsg
         RETURN ::aVars[::nPos,2]
      else
         _ClsSetError( _GenError( nError, ::ClassName(), cMsg ) )
         ::cName  := ""
         ::nPos   := 0
      endif
   endif

RETURN NIL

// Andrade Daniel (2001-2003)

 


Saludos
surGom
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: Usar o no variables publicas.

Post by surGom »

Bueno hace años que lo que utilizo esto, que realmente lo saque de algun colaborador de nuestro foro, y disculpas por no recordar de quien, pero me funciona perfecto
En el progama principal

Code: Select all | Expand


# include "fivewin.ch"


 memvar oApp

function main()
 
 variables locales
 oApp := TApplication()


      oApp:habilito:=GetpvProfString("dgi","habilito",,cinit)
      oApp:dirpdf := GetpvProfString("camino","dirpdf",,cinit)
      oApp:dirdoc := GetpvProfString("camino","dirdoc",,cinit)
      oApp:curproga := GetpvProfString("camino","curproga",,cinit)
      oApp:dirfac := GetpvProfString("camino","dirfac",,cinit)
      oApp:             etc , etc

  if pasaje("variable")
      database oVar
      dbgotop()
      oApp:fecha := oVar:fechamae
      oApp:ndola := oVar:dolar
      oApp:ndola30 := oVar:dolar30
      etc, etc
 
  endif

 

return nil


////////////////////////////////////////////////////////////////////////////////////////////////
CLASS TApplication

   DATA dirpdf INIT Space(120)
   DATA dirdoc INIT Space(120)
   DATA docvarios INIT Space(120)
   DATA usuario INIT (GetpvProfString("usuario","nombre",,(GetWinDir()+"\mega.ini")))
   DATA permiso INIT (GetpvProfString("lugares","ctasctes",,(GetWinDir()+"\mega.ini")))
   DATA permiso1 INIT ( GetpvProfString("lugares","alicuota",,(GetWinDir()+"\mega.ini")))
   DATA contador INIT (GetpvProfString("camino","contpath",,(GetWinDir()+"\mega.ini")))
   DATA privado INIT (GetpvProfString("lugares","privado",,(GetWinDir()+"\mega.ini")))
   DATA destinozip INIT (GetpvProfString("camino","zip",,(GetWinDir()+"\mega.ini")))
   DATA desOcompra INIT (GetpvProfString("camino","ocompra",,(GetWinDir()+"\mega.ini")))
   DATA correo INIT ""
   DATA puerto INIT 0
   DATA smtp INIT ""
   DATA blat INIT ""
   DATA imppdf INIT ""
   DATA imppre INIT ""
   // etc y mas etc

ENDCLASS


return nil

 


Y después en cualquier módulo que utilizo lo que hago es

Code: Select all | Expand


memvar oApp

function pepito()
 bla bla bla

            IF  ShellExecute( , "open",   ( oApp:dirfac + oCae:nombre + ".pdf" ),,, 1 ) != 2
               cldata( aObj )
               RETURN NIL
            ENDIF

 


 


Funciona bien.


Luis
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: Usar o no variables publicas.

Post by goosfancito »

Code: Select all | Expand


en el modulo inicial
PUBLIC hGlobal := {=>}
hGlobal[ "userid" ] :=
hGlobal[ "userlevel" ] :=
hGlobal[ "usermodules" ] :=
 


esto me da error al compilar con harbour

Code: Select all | Expand


#include "fivewin.ch"

public hGlobal:= {=>}

FUNCTION main()
   hGlobal["uno"]:= "valor agregado"

   ? hGlobal["uno"]
   

   RETURN NIL


Source\clases\main.prg(15) Error E0001 Statement not allowed outside of procedure or function
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Usar o no variables publicas.

Post by nageswaragunupudi »

Code:

FUNCTION GetWndMain()
RETURN oWndMain  
 

and in the module that I have to use it.
Code:

oWndMain := GetWndMain()
 


BTW,
We can use the built-in FWH function

Code: Select all | Expand


WndMain()
 

anywhere in the application, without creating our own function GetWndMain()
PS: I know this is not the main purpose of this topic.
Regards

G. N. Rao.
Hyderabad, India
User avatar
Rick Lipkin
Posts: 2668
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Usar o no variables publicas.

Post by Rick Lipkin »

To All

I only use Publics for defining System wide user roles .. Read, Write, Supervisor and Admin... Statics work fine in a .prg with many functions .. specifically if you need to update a Static value within your .prg and have visibility within the .prg ..Hash's works great if you want to pass locals and update locals with visibility in other functions that have multiple .prgs.

My choice is to always use locals .. even statics need to be released with nil .. with locals .. use them and pass them as a value only .. I also believe Locals execute faster at run-time.

Rick Lipkin
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

Re: Usar o no variables publicas.

Post by goosfancito »

I need to save values that I can access from any of the classes I have. And I don't know how to do it, I have already tried several examples.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
Post Reply