Spanish Evitar cargar en cada Button el mismo codigo

Hola, tengo 5 botones que he creado en el Diseñador con el TAG= "linea_a"

Es posible programar segun el tag el evento click, por ejemplo si he pulsado en unos de los botones con el TAG="Linea_a" que haga un evento click.

Es para evitar redundancia de codigo por cada boton, ya que solo estare usando el text del boton.
 
Last edited:

JMMF

Member
Licensed User
No entiendo muy bien lo que quieres
Mira esto, por si es lo que pretendes.

http://kio4.com/b4a/40controlesporcodigo.htm

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    ' Crearemos 4 botones. Debemos declarar 5
    Dim Buttons(5) As Button
   
    ' Crearemos 2 etiquetas (Label)
    Dim etiqueta, etiqueta2 As Label
   
    Dim suma As Int
    suma = 0
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
  
    Dim Izq, Arriba, ancho, alto As Int
    Izq = 20dip
    Arriba = 20dip
    ancho = 80dip
    alto = 60dip

        For y = 1 To 4
            Dim b As Button
            b.Initialize("Button")
            b.TextSize = 10
            b.Text = y
            b.Tag = y
            Activity.AddView(b, Izq, Arriba, ancho, alto)
        Arriba = Arriba + (alto + 10dip)
            Buttons(y) = b
        Next
   
    ' Los View cuando se crean en el código hay que
    ' Iniciarlos y luego Añadirlos al Activiy
    etiqueta.Initialize("etiqueta")
    etiqueta.TextSize = 10
    etiqueta.TextColor = Colors.White
    Activity.AddView(etiqueta, Izq, Arriba, ancho*4, alto*2)
   
    Arriba = Arriba + (alto*2 + 10dip)
   
    etiqueta2.Initialize("etiqueta2")
    etiqueta2.Color=Colors.Blue
    etiqueta2.Gravity = Gravity.CENTER
    etiqueta2.Text="SUMATORIO"
    Activity.AddView(etiqueta2,Izq, Arriba, ancho, alto)
   

End Sub
Sub Activity_Resume
   
End Sub
Sub Activity_Pause (UserClosed As Boolean)
   
End Sub

Sub Button_Click
    Dim b As Button
    b = Sender
   
    etiqueta.Text = "Boton pulsado: " & b
   
    suma = suma + b.Tag
    etiqueta2.Text = suma
   
    ' Cada vez que se pulsa un Botón se activa esta Subrutina.
    ' b nos dice que botón ha sido pulsado.
    ' b nos indica las Propiedades del Botón.
    ' Utilizamos la Propiedad b.Tag
    ' Dependiendo del Tag, se sumarán incrementos de uno, dos, tres o cuatro.
   
    ' En etiqueta obtenemos el valor de las Propiedades del Botón pulsado.
    ' b = Sender, b obtiene las Propiedades del Botón pulsado.
    ' En etiqueta2 obtenemos la suma.
   
End Sub
 

bgsoft

Well-Known Member
Licensed User
Hola

El ejemplo que te ha puesto JMMF es casi correcto :D, no hay que crear una matriz de botones si ya los creas en el bucle.
Si pones un valor númerico al TAG, luego en el evento click puedes saber que boton es, y dependiendo de que boton sea haces lo que creas conveniente

B4X:
For y = 0 To 4
   Dim b As Button
   b.Initialize("Boton")
   b.Tag = y
   ' resto del codigo que quieras poner
Next

' En el evento del boton
Sub Boton_Click
  dim IndiceDelTag as int
  Dim b As Button
  b = Sender
  IndiceDelTag = b.tag ' ya tienes en una variable el botón que te han pulsado, ahora haz el código que creas

Saludos
 
Hola, lo que yo quiero hacer es crear ya en TIEMPO DE DISEÑO los botones acomodar en su lugar y en la propiedad TAG agregar el tag correspondiente.

tag_click.png


Como se ve ahi en la imagen cree 8 botones.

a los 4 botones le puse el TAG= "a"

a los otros 4 Botones le puse el TAG = "b"

Todo en tiempo de diseño.

despues de esto lo que quiero es al pulsar sobre unos de los botones con TAG="a" que solo me triga en una variable el texto del boton y el tag

ejemplo: click en Boton1 con el TAG="a"

variable= Boton1.Text & "-" & Boton1.Tag

Esto es para no estar escribiendo en cada boton el mismo codigo
 

JMMF

Member
Licensed User
Hola arielariel1
No sé si se puede hacer lo que quieres con el diseñador.
A mí no me gusta crear controles desde el diseñador, los creo en programación y me funciona bastante bien.
Porque no pruebas a crearlos desde programación.
Te paso el código de lo que creo que pretendes hacer, y le echas un vistazo.
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    Dim ControlLista As List
    Dim ControlMapa As Map
   
        Private Label1 As Label
  
End Sub

Sub Activity_Create(FirstTime As Boolean)
'Crea el ControlLista
    ControlLista.Initialize
'Aqui puedes poner las caracteristicas (color, tamaño, texto...) de cada control.
   
    ControlMapa.Initialize 'Caracteristicas del Label1
    ControlMapa = CreateMap("Color":Colors.Blue,"ColorTexto":Colors.Yellow,"TamañoTexto":20,"Gravity":Gravity.CENTER,"Izq":5%x,"Arriba":5%y,"Ancho":90%x,"Alto":40%y)
    ControlLista.Add(ControlMapa)
   
    ControlMapa.Initialize 'Caracteristicas del boton 1
    ControlMapa = CreateMap("Color":Colors.Blue,"ColorTexto":Colors.White,"TamañoTexto":10,"Tag":"a","Gravity":Gravity.BOTTOM,"Texto":"A","Izq":5%x,"Arriba":70%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)

    ControlMapa.Initialize 'Caracteristicas del boton 2
    ControlMapa = CreateMap("Color":Colors.Black,"ColorTexto":Colors.Blue,"TamañoTexto":18,"Tag":"a","Gravity":Gravity.CENTER,"Texto":"A1","Izq":28%x,"Arriba":70%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)
   
    ControlMapa.Initialize 'Caracteristicas del boton 3
    ControlMapa = CreateMap("Color":Colors.Cyan,"ColorTexto":Colors.Black,"TamañoTexto":8,"Tag":"a","Gravity":Gravity.CENTER_HORIZONTAL,"Texto":"Aa","Izq":51%x,"Arriba":70%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)

    ControlMapa.Initialize 'Caracteristicas del boton 4
    ControlMapa = CreateMap("Color":Colors.DarkGray,"ColorTexto":Colors.Yellow,"TamañoTexto":15,"Tag":"a","Gravity":Gravity.CENTER_VERTICAL,"Texto":"A3","Izq":74%x,"Arriba":70%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)
   
    ControlMapa.Initialize 'Caracteristicas del boton 5
    ControlMapa = CreateMap("Color":Colors.Transparent,"ColorTexto":Colors.Cyan,"TamañoTexto":10,"Tag":"b","Gravity":Gravity.FILL,"Texto":"B","Izq":5%x,"Arriba":81%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)

    ControlMapa.Initialize 'Caracteristicas del boton 6
    ControlMapa = CreateMap("Color":Colors.Blue,"ColorTexto":Colors.Red,"TamañoTexto":11,"Tag":"b","Gravity":Gravity.LEFT,"Texto":"BBB","Izq":28%x,"Arriba":81%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)
   
    ControlMapa.Initialize 'Caracteristicas del boton 7
    ControlMapa = CreateMap("Color":Colors.Red,"ColorTexto":Colors.Black,"TamañoTexto":12,"Tag":"b","Gravity":Gravity.NO_GRAVITY,"Texto":"bB","Izq":51%x,"Arriba":81%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)

    ControlMapa.Initialize 'Caracteristicas del boton 8
    ControlMapa = CreateMap("Color":Colors.Magenta,"ColorTexto":Colors.White,"TamañoTexto":13,"Tag":"b","Gravity":Gravity.LEFT,"Texto":"B1","Izq":74%x,"Arriba":81%y,"Ancho":22%x,"Alto":10%y)
    ControlLista.Add(ControlMapa)
   
'Crea el Label1 
    ControlMapa = ControlLista.get (0)
    Label1.Initialize("Label1")
    Label1.Color = ControlMapa.Get("Color")
    Label1.TextColor = ControlMapa.Get("ColorTexto")
      Label1.TextSize = ControlMapa.Get("TamañoTexto")
    Label1.Gravity = ControlMapa.Get("Gravity")
    Activity.AddView(Label1,ControlMapa.Get("Izq"),ControlMapa.Get("Arriba"),ControlMapa.Get("Ancho"),ControlMapa.Get("Alto"))

'Crea los Button
    For y = 1 To 8
         ControlMapa = ControlLista.get (y)
             Dim Boton As Button
               Boton.Initialize("Button")
        Boton.Color = ControlMapa.Get("Color")
        Boton.TextColor = ControlMapa.Get("ColorTexto")
               Boton.TextSize = ControlMapa.Get("TamañoTexto")
        Boton.Tag = ControlMapa.Get("Tag")
        Boton.Gravity = ControlMapa.Get("Gravity")
               Boton.Text = ControlMapa.Get("Texto")
               Activity.AddView(Boton,ControlMapa.Get("Izq"),ControlMapa.Get("Arriba"),ControlMapa.Get("Ancho"),ControlMapa.Get("Alto"))
    Next
End Sub

Sub Button_Click
'despues de esto lo que quiero es al pulsar sobre unos de los botones con TAG="a" que solo Me triga en una variable el texto del boton y el tag
'ejemplo: click en Boton1 con el TAG="a"
'variable= Boton1.Text & "-" & Boton1.Tag

      Dim variable As String
    Dim Boton1 As Button
      Boton1 = Sender
      Select Boton1.Tag
          Case "a"
            variable = Boton1.Text & "-" & Boton1.Tag
        Case "b"
            variable = Boton1.Text & "+" & Boton1.Tag
    End Select
      Label1.Text = variable

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
 

bgsoft

Well-Known Member
Licensed User
Hola

Si lo creas en diseño o en ejecución, tienes que darle un nombre al evento para asi saber cuando te hacen click, asi que tienes dos opciones, o le das el mismo nombre de evento y luego haces el código que te escribí (b = Sender...) , o le pones a cada botón un nombre de evento diferente, creas tantos eventos como botones y asi no te hará falta ni e tag, ya que sabras que boton te pulsaron.
Aún asi yo le haria caso a JMMF y lo haria en tiempo de ejecución, tienes el ejemplo mio o el de el.

Saludos
 
Buen dia, @JMMF , estoy realizando un proyecto el cual tiene un caso similar al que te muestra arielariel1, pero la diferencia es que el diseño llamado Card1, se repite tanto registros hayan en la base de datos, por lo tanto los controles que posee se repiten n veces ... en la propiedad tag de cada control le asigne un valor unico (indice).

Al darle click por ejemplo al uno de los botones de cualquier item del diseño Card1, me muestra el valor del tag correcto, hasta ahi todo bien, pero como hago para acceder a los demas controles ?, es decir, por ejemplo hay un control EditText que debo inclementarle el valor que tiene asignado al darle click al boton ....

Este es el codigo que estoy tratando de hacer .... le anexo el proyecto ( no esta terminado). Muchas gracias por tu orientacion.

Sub BtnSumar_Click

'Aqui identifico el valor del tag del Boton ...
Dim CualTagBtn As Int
Dim TagBtnSumar As Button = Sender

CualTagBtn = TagBtnSumar.Tag

'Debo de hacer esta operacion en el control EditText .... pero como identifico el tag del EditText
TextCantidad.Text = TextCantidad.Text + 1

End Sub
 

Attachments

José J. Aguilar

Well-Known Member
Licensed User
Hola Raúl:

Por favor, no deberías publicar en un hilo antiguo, sino crear un nuevo hilo.
Al escribir código, usa las etiquetas [code]pega tu código aquí[/code]

Deberías usar algo como
B4X:
Sub BtnSumar_Click
  Dim index As Int = CLV1.GetItemFromView(Sender) 'Esto te da el índice del ítem pulsado
  Log(index)
  Dim p As Panel = CLV1.GetPanel(index)  'Aquí obtienes el panel con tu layout Card cargado
  Dim e as EditText = p.Getview(7)  'He puesto 7 al azar, pero debería ser el número de tu EditText según el orden que tenga en el árbol de vistas del diseñador
  e.Text = e.Text + 1
End Sub
Consejos:
- No dirijas tus preguntas a un sólo usuario, esto es un foro y ese usuario podría ya no estar activo.
- No dupliques tus preguntas en distintos hilos
- Usa un B4Xplusminus (por ej. pmCantidad) y te quitas tener que usar dos botones y un edittext:
B4X:
pmCant.SetNumericRange(1,20,1) 'suponiendo por ejemplo 20 como el máximo de ítems que podrían pedir
- No uses jobdone, es mejor usar wait for
- El + y el - los tienes fuera del panel en el diseñador
- Los colores, tipo de letra, etc... de los elementos que estás definiendo en CreateItem podrías hacerlo mejor en el diseñador.

Cualquier duda, por favor, en un hilo nuevo.
 
Last edited:
Qhubo Jose, hice los cambios pero me saca este error .... el edittext (TextCantidad) lo ubique en la posicion 7. Jose gracias por tus consejos. Me cuentas. Gracias

Screenshot_20200426-160537.png
 

José J. Aguilar

Well-Known Member
Licensed User
Disculpa Raúl:

No probé el código y había un pequeño error, la línea 4 debería ser:
B4X:
Dim p As Panel = CLV1.GetPanel(index).GetView(0)  'El panel GetPanel(index) es el propio del CLV, y la vista 0 es el panel p que cargaste
Como he hecho la prueba sobre tu app, te la adjunto, he añadido también un B4XPlusMinus para que veas que sería más fácil.

Por cierto, para mostrar los errores, es mejor copiarlos del log que poner un pantallazo, por ejemplo:
B4X:
Error occurred on line: 174 (EscogerPlatosyBebidas)
java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at anywheresoftware.b4a.debug.RDebugUtils.numberCast(RDebugUtils.java:58)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:348)
  ........
    at android.os.Handler.handleCallback(Handler.java:873)
Para cualquier duda o nuevo error, por favor, abre un hilo nuevo.
 

Attachments

Buenas tardes Jose, quedo perfecto. Del uso de un B4XPlusMinus efectivamente es mas sencillo y definitivamente B4X me esta pereciendo una herramienta de desarrollo bastante potente y en algunos casos con poco codigo. Muchas gracias.

Un abrazo cordial.

PD. Excusame por mi ignorancia ..... como se crea un "nuevo hilo" ? y de esa manera les llegaran a todos los del Foro ?
 
Top