Spanish (B4A) Duda sobre mejor manera de trabajar con Matriz de Controles (views)

Seneca

Active Member
Licensed User
Hola.

He estado consultando en el foro sobre la manera de trabajar con matriz de controles y en el Tutorial de Erel https://www.b4x.com/android/forum/threads/tick-tack-toe-working-with-arrays-of-views.8506/ aparece el siguiente código:

B4X:
Sub Globals

    Dim Buttons(3, 3) As Button
    Dim lblPlayer As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Create 9 buttons
    Dim width, offsetX, offsetY As Int
    width = 80dip
    offsetX = (100%x - width * 3 - 10dip * 2) / 2
    offsetY = (100%y - width * 3 - 10dip * 2) / 2
    For x = 0 To 2
        For y = 0 To 2
            Dim b As Button
            b.Initialize("button") 'All buttons share the same event sub
            b.TextSize = 30
            Activity.AddView(b,offsetX + x * (width + 10dip), offsetY + y * (width + 10dip), width, width)
            Buttons(x, y) = b 'store a reference to this view
        Next
    Next
    ....
    ....

End Sub

En el buqle se trabaja con el botón "b" y va almacenando las disintas copias en la matriz "Buttons(x, y)" para usos futuros. Cuando Erel lo hace así es porque sebe ser la mejor manera de hacerlo, pero me surge la duda de ¿qué ventaja tiene hacerlo así a trabajar desde un primer momento con la matriz de botones? Algo así como lo siguiente:

B4X:
Sub Globals

    Dim b(3, 3) As Button
    Dim lblPlayer As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Create 9 buttons
    Dim width, offsetX, offsetY As Int
    width = 80dip
    offsetX = (100%x - width * 3 - 10dip * 2) / 2
    offsetY = (100%y - width * 3 - 10dip * 2) / 2
    For x = 0 To 2
        For y = 0 To 2
            b(x, y).Initialize("button") 'All buttons share the same event sub
            b(x, y).TextSize = 30
            Activity.AddView(b(x, y),offsetX + x * (width + 10dip), offsetY + y * (width + 10dip), width, width)
        Next
    Next
    ....
    ....

End Sub

Saludos.
 
Last edited:

Cableguy

Expert
Licensed User
Longtime User
Fica mas lógico llamar button(2,1) ao invés de button(3)...
En l'occurrence primeiro tu sabes que logo button es en Linea 2, columna 1, como dentro uma grilla
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca

En el ejemplo de Erel lo hace asi para ver mas facil la composición de ese juego de 3 x 3 botones.
Dependiendo de lo que quieras hacer igual no necesitas una matriz de controles y menos de dos dimensiones, por otro lado ten en cuenta que cualquier matriz te va a usar memoria y bastante dependiendo del objeto y sobre todo de la dimensión, también si dimensionas un valor fijo y alto (por ejemplo 50) por que no sabes hasta cuanto te llegará, y luego solo utilizas la mitad el resto de objetos que no utilices ya estan ocupando memoria al dimensionar.
En la mayoria de veces si tienes que crear muchos objetos en tiempo de ejecucion y depende de valores externos lo puedes hacer asi:

B4X:
For n = 0 to NumeroDeBotones-1
  dim boton as Button
  b.Initialize("boton") 
  b.tag = n    'si quieres recuperar un valor lo pones aqui, por ejemplo el indice
  Activity.AddView(boton,left,top,ancho,alto)
Next 

' Para recuperar valores
Sub Boton_Click
  b = Sender
  indice = b.Tag  ' aqui recuperas el indice o el valor que pusiste al Tag
End sub

Esto es un ejemplo básico de crear botones en tiempo de ejecucución sin necesidad de crearlos en matriz de objeto, no se si ese es tu caso, simplemente te ponia ese ejemplo por que con ese código tan simple cubres la mayoria de necesidades. Y si necesitas cambiar los valores externos del boton (color, texto, imagen, etc) siempre puedes acudir a una matriz de objetos en un List que es muy facil de implementar y de gestionar y no necesitas dimensionarla.

Saludos
 

Seneca

Active Member
Licensed User
Hola.

Por el desarrollo que estoy haciendo necesito guardar una serie de botones en una matriz unidimensional, de la cual conozco el tamaño con antelación. El hacerlo así, y no como en el ejemplo que me indicas, es porque necesito poder cambiar propiedades de algunos botones durante la ejecución, de manera independiente del evento Click.

Respecto a la ocupación de memoria intuyo que un número X de botones ocupará la misma cantidad, independientemente de que se creen en tiempo de ejecución de manera individual o agrupados en un array. Tendré en cuenta la opción de usar un List cuando no pueda determinar de antemano el tamaño de la matriz, ya que dimensionar en exceso sí que sería, como bien dices, una sobreocupación de memoria.

También he entendido que:

B4X:
Buttons(x, y) = b 'store a reference to this view

No dubplica los botones, ya que en la matriz lo que se almacena es una referencia a cada botón 'b'

Gracias por la ayuda Jesús.

Saludos.
 
Top