Spanish [Solucionado: inicializar mapa antes de asignar valores nuevos] Es la propiedad ".tag" de los controles, un puntero, si el tag es un mapa?

Dadaista

Active Member
Licensed User
Hola

Normalmente suelo escribir en el foro general en ingles aunque mi ingles es malisimo, pero como tenga que explicar este problema en ingles me puede explotar la cabeza como si fuera la ultima escena de la pelicula el sentido de la vida 🤣 🤣

Estoy teniendo problemas "de entendimiento" cuando igualo la propiedad "tag" de un boton o de un campo a un mapa

Tengo este codigo
B4X:
    Dim z As Int = 0
    BtnCopiaSeguridad.Tag = z
    Log("BtnCopiaSeguridad: " & BtnCopiaSeguridad.Tag)
    z = 1
    BtnPorAnos.Tag = z
    Log("BtnPorAnos: " & BtnPorAnos.Tag)
    Log("*************************")
    Log("BtnCopiaSeguridad: " & BtnCopiaSeguridad.Tag)

Esto en la ventana log arroja este resultado
B4X:
BtnCopiaSeguridad: 0
BtnPorAnos: 1
*************************
BtnCopiaSeguridad: 0

De esta forma, todo correcto, cambio z y la propiedad tag del primer boton no cambia.

El problema aparece con el siguiente código
B4X:
    Dim m As Map
    m.Initialize
    m.Put("id", 1)
    m.Put("tag", "24")
    BtnCopiaSeguridad.Tag = m
    Log("BtnCopiaSeguridad: " & BtnCopiaSeguridad.Tag)

    m.Put("id", 2)
    m.Put("tag", "25")
    BtnPorAnos.Tag = m
    Log("BtnPorAnos: " & BtnPorAnos.Tag)
    Log("*************************")
    Log("BtnCopiaSeguridad: " & BtnCopiaSeguridad.Tag)

Y en la ventana del log aparece esto de aqui abajo
B4X:
BtnCopiaSeguridad: {id=1, tag=24}
BtnPorAnos: {id=2, tag=25}
*************************
BtnCopiaSeguridad: {id=2, tag=25}

Significa que en este caso, la propiedad tag del control es un puntero que apunta al mapa y si cambio el mapa estoy cambiando lo que contiene el tag de los controles... 🥴

Es esto asi?.. Porque es lo que parece :oops:

Edito:
Los botones son SwiftButton
 
Last edited:

Rubsanpe

Active Member
Licensed User
Hola. El tag es un elemento de tipo Object, es decir puede contener cualquier tipo de dato y lo hace guardando la dirección del mismo. Si cambias el contenido del dato cambias el valor del tag... Prueba a hacer m.Initialize de nuevo antes de asignar otros valores.


Rubén
 

Dadaista

Active Member
Licensed User
Hola. El tag es un elemento de tipo Object, es decir puede contener cualquier tipo de dato y lo hace guardando la dirección del mismo. Si cambias el contenido del dato cambias el valor del tag... Prueba a hacer m.Initialize de nuevo antes de asignar otros valores.

Pero no lo hace en el primer caso... si es una variable tipo int :eek:
 

roerGarcia

Active Member
Licensed User
Definitivamente asi lo parece.
No lo habia probado ni notado.

Ahora, una pregunta semi obligada aqui, ¿por que mantener esa informacion en el tag de un boton?
Porque si es como Ruben dice parece ser que no obtendras lo que quieres con un map en el tag, a menos que uses dos mapas distintos, uno para cada boton.
 

Dadaista

Active Member
Licensed User
Prueba a hacer m.Initialize
Eso lo Soluciona. Gracias @Rubsanpe

Definitivamente asi lo parece.
No lo habia probado ni notado.

Ahora, una pregunta semi obligada aqui, ¿por que mantener esa informacion en el tag de un boton?
Porque si es como Ruben dice parece ser que no obtendras lo que quieres con un map en el tag.

Estoy haciendo unas pruebas para poder hacer una actualizacion con los controles nuevos. En el caso que he puesto no tiene sentido, como acabo de escribir, es una prueba... Pero en el caso de campos, necesito mantener un tamaño de letra y una longitud maxima del campo ;)
 
Last edited:

roerGarcia

Active Member
Licensed User
Me parece que yo lo haria al reves, un mapa con el campo como llave y los datos requeridos como elementos del mapa para la validacion/configuracion, ventaja adicional, guardar el mapa resultante de la operacion en un archivo tipo config.algo.
 

Dadaista

Active Member
Licensed User
Me parece que yo lo haria al reves, un mapa con el campo como llave y los datos requeridos como elementos del mapa para la validacion/configuracion, ventaja adicional, guardar el mapa resultante de la operacion en un archivo tipo config.algo.
Bueno... cada uno tiene sus metodos. El programa está demasiado avanzado como para hacer una modificacion de ese tipo en toda la aplicacion. Realmente no hay ningun campo clave.. se trata de campos que se imprimen en una impresora de tickets y en este caso es la forma mas viable y rapida... como ya te he dicho, por la forma en que está programado de inicio
 

José J. Aguilar

Expert
Licensed User
Pero no lo hace en el primer caso... si es una variable tipo int
Hola:

Viendo los manuales, en el capítulo de "Variables y Objetos" se indica:
B4X:
Primitive types are always passed by value to other subs or when assigned to other variables.
Los tipos primitivos ( Byte, Short, Int, Long, Float, Double, Boolean y Char) siempre se pasan por valor a otras subs o cuando se asignan a otras variables.

El resto de tipos, incluyendo arrays de tipos primitivos y strings, se categorizan como no-primitivos
Cuando pasas un tipo no-primitivo a una sub o cuando lo asignas a una variable diferente, se pasa una copia de la referencia.
Esto significa que el dato no se duplica.
Es ligeramente diferente que pasar por referencia, ya que no puedes cambiar la referencia de la variable original.

 
Top