Spanish Variables globales

emvpic

Member
Licensed User
Longtime User
Hola, en la app tengo 4 main, necesito pasar valores de la main 4 a la main 2.
Desde el main2 quiero leer el valor de un label que esta en el main4.
Resumiendo el código en el main4:

B4X:
Sub Process_Globals
Dim n1 As Short

End Sub

Sub Activity_Create(FirstTime As Boolean)

n1=label1.left

End Sub

El código en el main2:

B4X:
Sub num
   
        
             lbl.Text=main4.n1
           
End Sub

Necesito saber la posición de varios labels y obtengo números que no se corresponden con el valor real.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Buenas,
Yo para esos casos siempre hago un CodeModule llamado GlobalVars y ahi meto todas las variables globales que voy a necesitar en todo el programa.
Asi evito el comportamiento errático que comentas.
Un saludo.
 

emvpic

Member
Licensed User
Longtime User
He puesto un CodeModule.
Ahora siempre obtengo el valor "0"
Le doy a esa variable el valor del label y al leer ese valor en otra activity me da el valor de "0"
Voy a ir probando cosas.
 

JordiCP

Expert
Licensed User
Longtime User
Lo que haces en el primer post es "correcto", pero en el caso de elementos de una "Activity" (como es el label1), todavía no están dibujados y sus valores puede dar cualquier cosa.

Mejor pasa la linea en cuestión al Activity_Resume, a ver si así da el resultado correcto
B4X:
Sub Activity_Resume
   n1=Label1.Left
End Sub
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola, podrías probar haciendo esto, que es básicamente lo mismo que estas haciendo la única diferencia es que cambias el left por text. Lo único que le estas pasando con el label.left es la posición por eso te pasa un 0.

B4X:
Sub Process_Globals
   Dim n1 As Short
End Sub

Sub Activity_Create(FirstTime As Boolean)
   label1.text = "Hola"
   n1=label1.Text
End Sub

B4X:
Sub num
   lbl.Text=main4.n1
End Sub
 

emvpic

Member
Licensed User
Longtime User
Si, ahora me he dado cuenta que no obtengo el valor del label porque aun no se ha cargado la activity que contiene ese label.
La cargo y vuelvo a la otra activity para leer el valor y me da el valor de "730" y realmente debería ser "338".
Yo pensaba que se podían leer los valores de todas las activity antes de cargarlas.
¿Se le puede dar un valor a un label desde otra activity diferente?

rscheel, para que funcione y muestre "Hola", he tenido que declarar n1 as String, pero si me ha funcionado.
También tengo que abrir la activity "main4" y después volver a la activity "main2" para que lea el valor.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Si, ahora me he dado cuenta que no obtengo el valor del label porque aun no se ha cargado la activity que contiene ese label.
La cargo y vuelvo a la otra activity para leer el valor y me da el valor de "730" y realmente debería ser "338".
Yo pensaba que se podían leer los valores de todas las activity antes de cargarlas.
¿Se le puede dar un valor a un label desde otra activity diferente?

rscheel, para que funcione y muestre "Hola", he tenido que declarar n1 as String, pero si me ha funcionado.
También tengo que abrir la activity "main4" y después volver a la activity "main2" para que lea el valor.

Define tu variable como Int, si vas a pasar números. Es obvio que tengas que abrir el main 4 para ver los valores del 4 en el main2, lo logico seria pasar valores del main 2 al main4, y luego si quieres retornar valores del main4 al main2 lo puedes hacer sin problemas.
 

emvpic

Member
Licensed User
Longtime User
Si, ya probe a declararlo como Int, el resultado fue el mismo.
¿Hay alguna forma de obtener los datos de la posición de labels sin tener que abrir la activity donde se encuentran?
Entonces cuando espero leer el resultado "338" me da el valor falso de "730"
Cuando espero leer el resultado "314" me da el valor falso de "678"
¿Hay alguna relación?,
730 - 338= 392
678 - 314= 364
639 - 296= 343
Otra opción seria guardar las posiciones de los labels en un archivo, ir actualizando y leyendo de ahí.
Cosa que aún no me he puesto a ver como se hace.
Solo necesitare saber la posición de 24 labels, en un principio la propiedad left y mas adelante, cuando entienda como funciona tambien la funcion top.
 

rscheel

Well-Known Member
Licensed User
Longtime User
@emvpic Lo que sucede es que no puedes conocer el valor de un activity si no esta creado, por lo tanto debes abrir si o si el activity te devuelve los datos, diferente es si diseñaste un layout con esos valores, los valores de ese layout podrías leerlos desde cualquier activity.
 

emvpic

Member
Licensed User
Longtime User
Si, en cada activity tengo un layout.
Entonces debería de poder leer los valores desde otra activity.
Obtengo valores más grandes, como si fueran de una pantalla más grande.
 

emvpic

Member
Licensed User
Longtime User
Quiero guardar los valores left de cada label de la siguiente manera, para poder leer estos valores en otra activity.
Cuando entro en la activity donde esta este código se detiene la aplicación.

B4X:
Sub Process_Globals
dim n(24) as int
End Sub

Sub Activity_Create(FirstTime As Boolean)
    n(1)=b1.Left:n(2)=b2.Left:n(3)=b3.Left:n(4)=b4.Left
    n(5)=b5.Left:n(6)=b6.Left:n(7)=b7.Left:n(8)=b8.Left
    n(9)=b9.Left:n(10)=b10.Left:n(11)=b11.Left:n(12)=b12.Left
    n(13)=b13.Left:n(14)=b14.Left:n(15)=b15.Left:n(16)=b16.Left
    n(17)=b17.Left:n(18)=b18.Left:n(19)=b19.Left:n(20)=b20.Left
    n(21)=b21.left:n(22)=b22.Left:n(23)=b23.Left:n(24)=b24.left
End Sub
 

emvpic

Member
Licensed User
Longtime User
Ya lo solucione "en parte".
La variable va de 0 a 23, esto ya lo sabia de VB.
Lo que me gustaría saber es si existe algo equivalente a option base 1 en B4A.
 

mczubel

Member
Licensed User
Longtime User
otra opción es utilizar panels en vez de activities entonces tienes todo en main y copias los valores de un label a otro en el mismo main son consultas intra"main y no "inter"main.
slidingpanels permite esto es graficamente bueno y cargas 1 layout por panels.
de la otra manera tienes que usar variables globales con consultas call.
 

emvpic

Member
Licensed User
Longtime User
Probaré a hacerlo con panels, aún no he probado lo de los paneles y no se como funciona. Voy a ver si encuentro algún ejemplo. Entonces si puedo cargar cada layout en cada panel, no me supondrá invertir mucho tiempo cambiando cosas.
 

mczubel

Member
Licensed User
Longtime User
slidingpanels es la búsqueda que puedes hacer tienes varios ejemplos de Erel descargables. más nuevos y más viejos todos funcionan y son deslizables como lo dice su nombre vas pasando de 1 a otro con el dedo o puedes saltar a uno específico por código.
puedes carga un spinner en uno y mostrar el spinner en otro de forma que cuando lleges a este todo esté pronto.
 
Top