Spanish [Solucionado] ¿Como acceder a variables publicas entre distintos B4XPages?

Sergio Castellari

Active Member
Licensed User
Situación:
a) Tengo un B4XPage con una variable declarada Publica en Class Global (por ejemplo: nIDCaja)
b) Quiero acceder al contenido de nIDCaja desde otro B4XPage. ¿Como se hace?

Actualmente para poder acceder a variables entre distintos B4XPages, las declaro Publicas en el MAIN. Luego accedo a las mismas, anteponiendo "Main." al nombre de la variable y funciona.
En el tutorial de B4Xpages, indica que es fácil utilizar variables entre distintas paginas...pero no encuentro o no me doy cuenta como.
Saludos!
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Situación:
a) Tengo un B4XPage con una variable declarada Publica en Class Global (por ejemplo: nIDCaja)
b) Quiero acceder al contenido de nIDCaja desde otro B4XPage. ¿Como se hace?

Actualmente para poder acceder a variables entre distintos B4XPages, las declaro Publicas en el MAIN. Luego accedo a las mismas, anteponiendo "Main." al nombre de la variable y funciona.
En el tutorial de B4Xpages, indica que es fácil utilizar variables entre distintas paginas...pero no encuentro o no me doy cuenta como.
Saludos!
Yo lo tengo hecho asi:
B4X:
ConfigurationPage = B4XPages.GetPage("ConfigurationPage")
ConfigurationPage.VariablePublica ="Hello, World"
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
He encontrado otra manera que estaba buscando, pero no acababa de encontrar.
Si la página que tiene la variable deseada la tienes declarada en la MainPage, entonces puedes hacer esto también:
B4X:
Log(B4XPages.MainPage.ConfigurationPage.VariablePublica)
 

TILogistic

Expert
Licensed User
Longtime User
He encontrado otra manera que estaba buscando, pero no acababa de encontrar.
Si la página que tiene la variable deseada la tienes declarada en la MainPage, entonces puedes hacer esto también:
B4X:
Log(B4XPages.MainPage.ConfigurationPage.VariablePublica)
si bien
ConfigurationPage es una clase ??
 

Sergio Castellari

Active Member
Licensed User
o declara todas las variable en B4XMainPage

B4xMainPage



Y accedes a ellas con:
Gracias @oparra , claro el método que vengo usando es similar aunque utilizo directamente MAIN.

La idea es poder usar/ver/escribir variables ENTRE Paginas de manera simple y dejar las variables publicas realmente globales a nivel aplicación en el Main.
 

Sergio Castellari

Active Member
Licensed User
otra opción crea una clase con variables

y la declaras en B4XMainPage como publica

y tiene acceso a ellas de todas la paginas
Bueno, esto era lo que iba a hacer (tenia pensado). Utilizar una clase para "declarar" ahí todas las variables que necesito manipular entre paginas.
Con el tiempo, se que van a ser muuuchass! Y quiero que sea de la forma mas clara posible.
Gracias!
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
@Gabino A. de la Gala Genial!

¿ Como debo declarar a "ConfigurationPage" ?
Me refiero a: ConfigurationPage = <<<<< Como la declaraspreviamente?

se me ocurre declararla como (as CAJA) Nota: CAJA es el nombre de la Clase
Así es como lo suelo hacer cuando es una página "importante" dentro de la aplicación y voy a necesitar llamarla desde diferentes puntos del programa.
B4X:
Sub Class_Globals
  ' La defino como publica para que pueda ser llamada directamente desde otras partes del programa.
  Public ConfigurationPage As B4XConfigurationPage
End Sub

Sub B4XPage_Created
    ConfigurationPage.Initialize
    B4XPages.AddPageAndCreate("ConfigurationPage", ConfigurationPage)
    B4XPages.SetTitle(ConfigurationPage, "Configuración")
    ' Llamo al procedimiento para cargar todos los parámetros de la configuración
    ConfigurationPage.CargarConfiguracion
    ' Pongo por defecto el usuario con el que se hizo login la última vez.
    EditUsuario.Text = ConfigurationPage.ConfigMap.GetDefault("usuario", "")

    ' Aunque, tal y como lo puse en otro post, también lo podrías hacer
    EditUsuario.Text = B4XPages.MainPage.ConfigurationPage.ConfigMap.GetDefault("usuario", "")
End Sub
 

josejad

Expert
Licensed User
Longtime User
dejar las variables publicas realmente globales a nivel aplicación en el Main

Con B4XPages, no sería correcto (aunque sí posible) ponerlas en Main. Lo mejor es dejarlas en B4XMainPage, de esta forma, el proyecto puede ser multiplataforma en caso de necesitarlo.
La otra opción es lo que te indica oparra, bien una clase o bien un "code module".

saludos,
 

Sergio Castellari

Active Member
Licensed User
Así es como lo suelo hacer cuando es una página "importante" dentro de la aplicación y voy a necesitar llamarla desde diferentes puntos del programa.
B4X:
Sub Class_Globals
  ' La defino como publica para que pueda ser llamada directamente desde otras partes del programa.
  Public ConfigurationPage As B4XConfigurationPage
End Sub

Sub B4XPage_Created
    ConfigurationPage.Initialize
    B4XPages.AddPageAndCreate("ConfigurationPage", ConfigurationPage)
    B4XPages.SetTitle(ConfigurationPage, "Configuración")
    ' Llamo al procedimiento para cargar todos los parámetros de la configuración
    ConfigurationPage.CargarConfiguracion
    ' Pongo por defecto el usuario con el que se hizo login la última vez.
    EditUsuario.Text = ConfigurationPage.ConfigMap.GetDefault("usuario", "")

    ' Aunque, tal y como lo puse en otro post, también lo podrías hacer
    EditUsuario.Text = B4XPages.MainPage.ConfigurationPage.ConfigMap.GetDefault("usuario", "")
End Sub
Gracias @Gabino A. de la Gala !!!

En tu ejemplo (si entiendo bien) estas "cargando" toda la configuración en un MAP

Yo terminé haciendo esto (mientras probaba tu idea):
1.- En la B4XPage que quiero "leer" la variable publica de otra B4Xpage:
Sub Class_Globals:
Sub Class_Globals
    Public cfgPage As Caja 'Caja es el nombre del modulo donde esta la B4Xpage (origen de la variable)'
End Sub
2.- Luego para acceder hago esto:
B4X:
    cfgPage = B4XPages.GetPage("PageCaja")
    lblSaldo.Text = cfgPage.pSalFinalCaja
Donde:
a) "PageCaja" es el nombre de la B4XPage de origen
b) pSalFinalCaja es la variable publica que quiero LEER

Esto me FUNCIONO !!! La pregunta es: ¿Es correcto esta forma de usarlo?

Saludos y muchas gracias por las pistas!!!
 

Sergio Castellari

Active Member
Licensed User
Con B4XPages, no sería correcto (aunque sí posible) ponerlas en Main. Lo mejor es dejarlas en B4XMainPage, de esta forma, el proyecto puede ser multiplataforma en caso de necesitarlo.
La otra opción es lo que te indica oparra, bien una clase o bien un "code module".

saludos,
Upsss!!!....Yo las variables las estoy declarando en el MAIN
Esto es interesante: un Modulo de Código tiene alcance Global entonces ?

Yo creo que con el tiempo haré esto, ya que seguramente voy a tener centenas de variables publicas que quiero disponer en distintas B4XPages
Gracias por las ayudas, esto era muy necesario para mi.
Saludos!!!
 

josejad

Expert
Licensed User
Longtime User
ya que seguramente voy a tener centenas de variables publicas que quiero disponer en distintas B4XPages

Como he comentado alguna vez, el ejemplo que está desarrollando Erel de una app multiplataforma y bastante grande, es una genial manera de aprender.

Este es el hilo de su app. Y en este enlace de Github puedes descargar su proyecto. (Botón Code->Download Zip)

Si te fijas, tiene un módulo llamado "Constants". Simplemente lo inicializa en B4XMainPage y después lo llama desde cualquier página con "Constants.Variable"....

saludos,
 
Top