Spanish [SOLUCIONADO] Crear una clase.

vecino

Well-Known Member
Licensed User
Hola, simplemente eso :D
No entiendo las clases con B4A, me pierdo.
He intentado seguir algunos ejemplos, también algunos tutoriales y no me aclaro porque, principalmente, están en inglés.
Bien, en teoría es algo básico, una simple ventana de diálogo.
Tengo esto que lo uso habitualmente, pero tengo que copiarlo a cada "activity" donde necesito usarlo, es algo imperdonable.
He intentado crear una clase para usarla pero, simplemente, no entiendo cómo crearla.
A ver si podéis echarme una mano, o al menos me podéis indicar algún tutorial en español.
Gracias.
B4X:
Sub InputBoxString( cTitulo As String, cPregunta As String, cHintDefecto As String, cValorDefecto As String, bIsPassword As Boolean ) As ResumableSub
    Dim id As InputDialog
    Dim cRes="" As String
    '
    id.InputType=id.INPUT_TYPE_TEXT
    id.PasswordMode=bIsPassword
    id.Hint=cHintDefecto
    id.Input=cValorDefecto
    '
    Dim sf As Object = id.ShowAsync(cPregunta,cTitulo,"Ok","Cancelar","",Null,False)
    Wait For (sf) Dialog_Result(Result As Int)
    If Result = DialogResponse.POSITIVE Then
        cRes = id.Input
    Else
        cRes = DialogResponse.CANCEL
    End If
    '
    Return( cRes )
End Sub
También me vale otra con XUI, por ejemplo.
 

josete

Member
Licensed User
Puedes usar tambien un modulo de codigo: Proyecto->Añadir Nuevo Modulo->Modulo de codigo
Entonces dentro de ese modulo puedes poner funciones y variables que seran globales a las actividades:

B4X:
Sub Process_Globals
    // Variables globales o constantes
End Sub

Sub InputBoxString( cTitulo As String, cPregunta As String, cHintDefecto As String, cValorDefecto As String, bIsPassword As Boolean ) As ResumableSub
    Dim id As InputDialog
    Dim cRes="" As String
    '
    id.InputType=id.INPUT_TYPE_TEXT
    id.PasswordMode=bIsPassword
    id.Hint=cHintDefecto
    id.Input=cValorDefecto
    '
    Dim sf As Object = id.ShowAsync(cPregunta,cTitulo,"Ok","Cancelar","",Null,False)
    Wait For (sf) Dialog_Result(Result As Int)
    If Result = DialogResponse.POSITIVE Then
        cRes = id.Input
    Else
        cRes = DialogResponse.CANCEL
    End If
    '
    Return( cRes )
End Sub
Por ejemplo ,si nombras al modulo como utils ,podras acceder a tu funcion con:
B4X:
utils.InputBoxString(.....)
desde cualquier actividad
 

vecino

Well-Known Member
Licensed User
Hola, gracias por tu respuesta.
Esa opción no sirve, te dejo una captura de pantalla:
Saludos.

nosirve.png
 

JordiCP

Well-Known Member
Licensed User
Crea una nueva clase (llámala por ejemplo clInput) y añáde el Sub inputBoxString a la clase.

Si necesitas usarla en diferentes actividades, puedes hacer 2 cosas.

1) Declara una instancia de esta clase al inicio de cada actividad, y cuando la necesites, la llamas
B4X:
' en cada actividad que la necesites
Sub Globals
   Private myInputDialog as clInput
End Sub
Sub Activity_Create
   myInputDialog.initialize
End Sub
Sub enUnaSubCualquiera
   ' ...
   Wait for (myInputDialog.InputBoxString(...)) Complete( res as String)
   ' aquí procesas el resultado
End Sub

2) La otra opción es declarar una instancia de la clase una única vez. Se puede hacer en el módulo Starter, ya que será visible desde todas las actividades.

B4X:
' En el módulo Starter
Sub Process_Globals
   Dim myInputDialog as clInput
End Sub
Sub Service_Create
  myInputDialog.initialize
End Sub
y la llamas así, desde la actividad que sea
B4X:
' En cada actividad que la necesites

Wait for (Starter.myInputDialog.inputBoxString(...)) Complete(res as String)
'...

(código no probado, puede haber algún error de sintaxis)
 

vecino

Well-Known Member
Licensed User
Hola, gracias por tu ayuda.
Sale un mensaje que no sé identificar.
Aquí está:

nose.png
 

drgottjr

Well-Known Member
Licensed User
tienes que añadir: dim dummy as view en todo lo alto de tu clase. (lo he encontrado en un post del mago erel). si lo pones, el error desaparace.
pero quedan otros problemas.

yo he pasado horas anoche probando con módulo de código (primero) y, luego, clase para ayudar al miembo.... algo no cuaja
 

JordiCP

Well-Known Member
Licensed User
tienes que añadir: dim dummy as view en todo lo alto de tu clase. (lo he encontrado en un post del mago erel). si lo pones, el error desaparace.
pero quedan otros problemas.
Tienes razón, falta poner un objeto dummy de Actividad en Class_Globals. Con esto, funciona correctamente la opción 1) si se llama desde una activity.

En cuanto a hacerlo con el Starter, la cosa se complica un poco para clases con contexto de actividad, mejor lo olvidamos 🤷‍♂️
 

vecino

Well-Known Member
Licensed User
Pues sí que está complicado, entre eso y que no entiendo el inglés, con razón me resultaba imposible :confused:
A ver si consigo echarlo a andar.
Gracias amigos.
 

drgottjr

Well-Known Member
Licensed User
si tu proposito fue para no tener que copiar/pegar el trozo de codigo en cada app, no olvides que aunque se tratase de un modulo de codigo o de una clase, tendrias que incluirlo en cada app. o sea, 5 segundos de copiar or de incluir. es lo mismo.

yo tengo trocitos de codigo que, por un motivo u otro, todavia no los he incluido en una libreria o modulo o clase. simplemente estan alli, y los uso cuando sea necesario. estan archivados, y los copio/pego. si fueran clases, tendria que hacer casi la misma cosa. igual numero de pasos. piensalo.

si tienes que buscar los trocitos en otras apps para luego inclurilos en todavia otra app, eso si, es aburrido. pero si los guardas aparte (como un modulo o una clase), estan listos para incluir. digo yo.
 

vecino

Well-Known Member
Licensed User
si tu proposito fue para no tener que copiar/pegar el trozo de codigo en cada app, no olvides que aunque se tratase de un modulo de codigo o de una clase, tendrias que incluirlo en cada app. o sea, 5 segundos de copiar or de incluir. es lo mismo.

yo tengo trocitos de codigo que, por un motivo u otro, todavia no los he incluido en una libreria o modulo o clase. simplemente estan alli, y los uso cuando sea necesario. estan archivados, y los copio/pego. si fueran clases, tendria que hacer casi la misma cosa. igual numero de pasos. piensalo.

si tienes que buscar los trocitos en otras apps para luego inclurilos en todavia otra app, eso si, es aburrido. pero si los guardas aparte (como un modulo o una clase), estan listos para incluir. digo yo.
Bueno, es que una aplicación normal tiene más o menos 40 'activitys' y no es cuestión de repetir lo mismo en cada una de ellas, y cuando se haga algún cambio habría que repetir la edición en todas.
 

vecino

Well-Known Member
Licensed User
Hola a todos, solamente comentar que finalmente he creado la clase y lo estoy usando desde otras 'activity' tal y como habéis comentado.
En las activity que necesito alguna petición de datos del usuario:

La declaro:
B4X:
Sub Globals
    Dim dlgQuestion As classDialog
La inicializo:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    dlgQuestion.Initialize
Y luego la uso donde haga falta:
B4X:
Wait For (dlgQuestion.InputBox2("Vendedor","Código:","","",False,True,False)) Complete (cRet As String)
If cRet<>DialogResponse.CANCEL Then
  ...
Funciona todo bien, así que de nuevo gracias a todos por vuestra ayuda.
Saludos.
 
Top