Spanish (SOLUCIONADO) Fallo de .tag en evento de Label

J M Movilla Cuadrado

Member
Licensed User
Estoy presentando una lista de texto en un Label incluido en un ScrollView. Esto funciona perfectamente.

El problema es que el evento "EditoDato" no detecta b.tag: me da un valor vacío. Por eso, al ponerle "IndiceLabelPulsado = b.tag" me da el siguiente error:
B4X:
An error has occurred in sub:main$ResumableSub_Edit oDat_Clickresume (java line: 835)
java.lang.NumberFormatException:empty String

Me podéis orientar, por favor, ¿cuál es el motivo de este fallo?. Mi previo agradecimiento.


B4X:
    '   nIndMax es el número de items en ListDat

    Dim i As Int
    For i = 0 To nIndMax-1
        Dim iv As Label
        iv.Initialize("EditoDato")
        If i Mod 2= 0 Then
            iv.Color=0xFFE290D0
        Else
            iv.Color=0xFF7EF4E1
        End If
        iv.Text=ListDat.Get(i) 
        iv.TextSize=16
        iv.TextColor=0xFF120202
        iv.tag = i
        ScrollView1.Panel.AddView(iv, 15dip, 20dip * i, ScrollView1.Width - 35dip, 20dip )
    Next


Sub EditoDato_Click
    Dim IndiceLabelPulsado As Int
      Dim b As Label
    Dim cDato As String
      b = Sender
    IndiceLabelPulsado  = b.tag
    Log(b.text)

    cDato=ListDat.Get(IndiceLabelPulsado)

    Dim sf As Object = Msgbox2Async("¿Qué desea hacer?", "Con " & cDato, "Modificar", "Añadir", "Borrar", Null, True)
    Wait For (sf) Msgbox_Result (Result As Int)

    If Result=-1 Then
'        A modificar la línea
    Else If Result=-2 Then
'        A borrar la línea
    Else If Result=-3 Then
'        A incrustar nueva línea
    End If
End Sub
 
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola:

No tengo mucha experiencia aún con B4A, pero he probado a meter tu código en un ejemplo a ver dónde fallaba, y cosas que se me ocurren:
- ¿Estás compilando en Debug o en Release? Creo que a veces, si compilas en Debug te da la línea real de tu código y en Release según dónde sea el error te da la línea de java

- ¿Has probado a ir comentando líneas a ver dónde da exactamente el error? ¿Es en iv.tag = i? ¿Es en Log(b.text)?

- Prueba a quitar la línea
B4X:
Dim i As Int
creo que no es necesario declarar la variable de un bucle, y puede que eso de algún error.

Te adjunto el ejemplo que he hecho pegando tu código, que funciona.

saludos,
 

Attachments

  • ejemplo.zip
    9.1 KB · Views: 306

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

El problema es que no asignas bien los datos a cDatos, y te da error por que estas empleando una lista (List) sin declarar ni inicializar.
Si te fijas bien puse un Log para que vieras los datos introducidos, y en la pantalla lateral de log te saldrá el texto de la etiqueta pulsada.
Por otro lado IndiceLabelPulsado no lo empleas, te lo puse para que lo declares en un Sub Process_Globals y si creas una matriz o un List donde tienes esos datos que has leido de un fichero te sirvan para acceder a ellos y luego una vez modificado salvar.

B4X:
Sub Process_Globals
Dim IndiceLabelPulsado As Int
'...............
'................
'................

Sub Globals
Dim cDato as List
'...............
'................
'................

Sub Activity_Create(FirstTime As Boolean)

If FirstTime then
  cDato.Initialize ' Puedes inicializar aqui o mejor en el sub donde llamas a leer el fichero
  LeerFicheroDeDatos
End If
'...............
'................
'................


Sub EditoDato_Click
    Dim b As Label
    Dim TextoLabel As String
     b = Sender

    IndiceLabelPulsado  = b.tag ' para saber que linea del List tienes que modificar
    TextoLabel= b.text ' asignar el texto de la etiqueta
    Log(TextoLabel.text)

    Dim sf As Int
sf = Msgbox2Async("¿Qué desea hacer?", "Con " & TextoLabel, "Modificar", "Añadir", "Borrar", Null, True)

    If sf=-1 Then
'        A modificar la línea
    Else If Result=-2 Then
'        A borrar la línea
    Else If Result=-3 Then
'        A incrustar nueva línea
    End If
End Sub

' Te recuerdo que quizás para mas claridad del código (quizas no en este caso), existe esto:
  if sf = DialogResponse.POSITIVE
  if sf = DialogResponse.CANCEL
  if sf = DialogResponse.NEGATIVE
 ' Así no te tienes que aprender los valores

Saludos
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User

Hola José J. :
Las variables que se emplean TODAS hay que declararlas, Android te permite ciertas licencias como no declararlas en un bucle For Next, pero si a la larga no quieres tener problemas mejor hacerlo, por que no es la primera vez que en B4A cambia algo de la "filosofia" y luego no funciona. Te podria decir que hace tiempo se podia declarar un String sin asignar cadena nula, y cuando comparabas no pasaba nada, luego esto cambió y si la cadena era nula pero no la habias asignado te daba error y se detenia el programa.

En este caso ya he comentado donde está el fallo, y curiosamente es por que faltan declaraciones.

Personalmente aconsejo que se trabaje en Release y cuando se tiene un error que no sabes donde, como muy bien dices pasar a Debug que te dirá y te llevará a la linea del error. En Release te da el error de la linea de java. El "problema" del Debug es que si haces muchos cambios sin parar y volver a ejecutar a veces te empieza a hacer "cosas raras", no te actualiza pantallas al ultimo cambio, te cambia los colores, etc, al menos esa es mi experiencia cuando lo empleo para "afinar" tamaños y colores de objetos de forma rápida (trabajo en modo ejecución no con el diseñador)


Saludos:
 
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola Jesús:

Gracias por las aclaraciones, de todo se aprende algo.

saludos,
 

J M Movilla Cuadrado

Member
Licensed User
Muchas gracias a ambos, Jesús y José J.

Jesús: Respecto a
B4X:
El problema es que no asignas bien los datos a cDatos, y te da error por que estas empleando una lista (List) sin declarar ni inicializar.
se debe a que he presentado solamente un trozo del proyecto; la lista ListDat la genero previamente en otra parte, donde cumplo todos los requisitos; eso no me da problema. Lo único que indicaba este detalle es el poner "nIndMax es el número de items en ListDat". Por eso te he desorientado y has interpretado que cDatos es List, cuando es String; la lista es ListDat

Y sobre la declaración de IndiceLabelPulsado, también había probado dimensionándola en Process_Globals, sin que ello solucionara el error.

Muchas gracias por tu interés, y perdona el haberte despistado involuntariamente.

José J.: Es increíble, pero cierto: He compilado tu código y FUNCIONA... Pero lo he copiado en mi proyecto y ¡ZAS!!!. El mismo error que me daba mi código...

Sé que eso ya tengo que ir debugeándolo línea a línea hasta dar donde me doy el sopapo; así que miles de gracias por tu valiosa aportación, y te tendré informado sobre mis progresos. A buen seguro que daré con el quid.
 

josejad

Expert
Licensed User
Longtime User
Prueba a compilar en modo debug a ver si te da la linea que falla directamente
 

J M Movilla Cuadrado

Member
Licensed User
He hecho un proyecto nuevo con los cinco sentidos... No sé el motivo por el que daba error, pero sin duda se trataba de una novatada achacable a mi inexperiencia.

Muchas gracias a todos los que habéis demostrado tanto interés por ayudarme. A ver si llega pronto el día en que yo soy capaz de ayudar a otras personas (???)
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…