Spanish [SOLUCIONADO] BetterDialogs en Modulo de codigo

JMMF

Member
Licensed User
Hola.
Es posible crear un Input de BetterDialogs, en un modulo de codigo?
Cuando intento esto.
B4X:
Sub Process_Globals
    Private BetterDialogs1 As BetterDialogs             'Trabajos con Dialogos (Libreria BetterDialogs )
End Sub
'__________BetterDialogs
Sub Input
    IP.Initialize
    IP.Default = Edit1.Text                                'Texto
    IP.Format = ControlMapa.Get ("Formato")                    'Formato
    IP.Gravity = Gravity.CENTER_VERTICAL + Gravity.CENTER_HORIZONTAL    'Horientacion
    IP.Hint = ControlMapa.Get ("Hint")                        'Insinuación
    IP.HintColor = Colors.Red                            'Color de la Insinuación
    IP.InputTextSize = 24                                'Tamaño de letra del Input
    IP.InputType = ControlMapa.Get ("Teclado")                'Tipo de teclado
    IP.Multiline = False                                'Multiples lineas
    IP.Question = ControlMapa.Get ("Pregunta")                'Pregunta
    IP.QuestionTextSize = 18                            'Tamaño de letra de la Pregunta
    IP.SpaceBetween = 4dip                                'Espacio entre la Pregunta y el Input.
    IP.ValidationCallback = "Input_Validation"                'Validar datos
    IP.WithSuggestions =True                            'Teclado con Sugerencias

    If ControlMapa.Get ("Necesario") And IP.Default = "" Then
        DR = BetterDialogs1.InputBox("", IP, "Ok", "", "", "")
    Else
        DR = BetterDialogs1.InputBox("", IP, "Ok", "Cancelar", "", "")
    End If

    If DR = DialogResponse.POSITIVE Then
        IP.Default = IP.CompactAnswer
    End If
    EditSeries1(Edit1.Tag).RequestFocus
End Sub

'__________Valida el BetterDialogs
Sub Input_Validation(Answer As String, CompactAnswer As String) As String
    If CompactAnswer.Length>ControlMapa.Get ("Caracteres") Then
        Main.BE.Beep
        Return CompactAnswer.Length & " Carácteres." & CRLF & "Maximo " & ControlMapa.Get ("Caracteres") & " carácteres"
    Else If CompactAnswer = "" And ControlMapa.Get ("Necesario")= True Then
        Main.BE.Beep
        Return "No puede estar vacio"
    Else
        Return ""
    End If
End Sub
me dice
No se puede acceder al objeto de actividad desde una sub proccess_globals.

PUES, QUE BIEN:(
 

bgsoft

Well-Known Member
Licensed User
Hola:

Un módulo de código no admite objetos, pero puedes crearlo en un modulo de clase

Saludos
 

JMMF

Member
Licensed User
Gracias, bgsoft

Pero no se como se comportan los módulos de clase estándar.
Trabajan igual que los módulos de código?

Desde la actividad, se llama a la Sub del modulo pasando los parámetros.
Y este retorna el valor.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Gracias, bgsoft

Pero no se como se comportan los módulos de clase estándar.
Trabajan igual que los módulos de código?

Desde la actividad, se llama a la Sub del modulo pasando los parámetros.
Y este retorna el valor.

Saludos.
Hola:

Puedes mirarte los tutoriales de Erel y ahí tendrás mas claro como utilizar una clase, tambien en la guia de usuario te explica como funciona.
https://www.b4x.com/android/forum/threads/classes-tutorial.18626/#content

Lo que quieres hacer es muy facil de hacer en un modulo de clase, inicializalo, y crea los sub a nivel global que te interesen y simplemente los llamas. Incluso en la inicialización puedes pasarle como objeto un panel que esté en una actividad, o incluso la propia actividad y luego desde tu módulo de clase incrustar tus objetos, manipular la información y crear eventos. Puedes emplear ese módulo de clase como una caja negra que la inicializas y luego intercambias información con ella y la puedes utilizar en diferentes aplicaciones (copiando el .bas)

Mirate este ejemplo de camára extendida de Erel que es muy simple de entender, y ahí veras las posibilidades que te da un módulo de clase, por que hasta tienes eventos. Para mi es un ejemplo de utilización de las clases muy bueno para alguien que quiera aprender de forma muy facil y rápida como funcionan las clases, y encima te puedes bajar el código.
https://www.b4x.com/android/forum/t...e-camera-library-functionality.23801/#content

Saludos
 

JMMF

Member
Licensed User
Uff...
Gracias bgssoft.
Con lo corto que soy, ¿Quieres que entienda los tutoriales de Erel?

Bueno después de perderme 27 veces o mas, he probado lo siguiente, y parece funcionar bien.
Main.
B4X:
#Region  Project Attributes
    #ApplicationLabel: InputBetter
    #VersionCode: 1
    #VersionName: 1.0 (BetterDialogs)
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: true
#End Region

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

Sub Process_Globals
    Dim BE As Beeper                'Trabajos con sonidos (Libreria Audio)

End Sub

Sub Globals
'Dimensiona las variables
    Dim ControlLista As List
    Dim ControlMapa As Map
    Dim GD As GradientDrawable
    Dim Awake As PhoneWakeState        'Trabajos con pantalla (Libreria Phone)
    Dim inputClase1 As InputClase

'Dimensiona las posiciones
    Dim Arriba As Float
    Dim Izquierda As Float
    Dim Ancho As Float
    Dim Alto As Float

'Dimensiona los controles
    Private Pnl01 As Panel
    
    Private SV As ScrollView
    Private EditSeries (2) As EditText  'El indice = ControlLista.Size
    Private EditSeries1 (2) As EditText 'El indice = ControlLista.Size
    Private Edit1 As EditText
    Private BotonGuardar As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
'Iniciamos variables
    BE.Initialize(100,600)
    GD.Initialize("TL_BR",Array As Int(Colors.Black,Colors.ARGB(255,32,32,32)))

'Crea el ControlLista
'Teclado: 1=Numeros con decimales, 2=Numeros, 3=Numeros con signos, 4=Telefono, 5=Texto, 6=Texto con sugerencias
    ControlLista.Initialize
    
    ControlMapa.Initialize
    ControlMapa = CreateMap("Titulo":"Proveedor","Formato":"","Hint":"Embases S.L","Teclado":6,"Pregunta":"Introduzca el nombre del proveedor","Caracteres":20,"Necesario":True,"NombreCampoBD":"BDProveedor")
    ControlLista.Add(ControlMapa)

    ControlMapa.Initialize
    ControlMapa = CreateMap("Titulo":"Direccion","Formato":"","Hint":"C/Pepito","Teclado":6,"Pregunta":"Introduzca la direccion","Caracteres":20,"Necesario":False,"NombreCampoBD":"BDDireccion")
    ControlLista.Add(ControlMapa)
    
    inputClase1.Initialize(ControlLista)'Inicio el Modulo de Clase y le paso los datos.
    
    Rellenar_Datos
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed Then Awake.ReleaseKeepAlive 'deja que la pantalla se pueda parar
End Sub
'++++++++++++++++++++ Procesos  ++++++++++++++++++++++++++++++++++++++++ Procesos  ++++++++++++++++++++
'__________Rellena los datos
Sub Rellenar_Datos
'la pantalla nunca se para
    Awake.KeepAlive(True)
    
'Crea el Pnl01
    Pnl01.Initialize("")
    Pnl01.Background=GD
    Activity.AddView(Pnl01,0,0,100%x,100%y)
    Pnl01.Visible=True
    
'Define posiciones
    Izquierda = 0
    Arriba = 0
    Ancho = Pnl01.Width
    Alto = Pnl01.Height /14
    
'Crea el ScrollWiev
    Pnl01.RemoveAllViews
    SV.Initialize2((Alto + 1)*(ControlLista.Size*2),"SV")
    SV.FullScroll (True)
    Pnl01.AddView(SV,0%x,0%y,Pnl01.Width,Pnl01.Height)
    Activity.Title = "BetterDialogs v1.0"
    For i=0 To ControlLista.Size - 1
        ControlMapa = ControlLista.get (i)
        Dim EditText2 As EditText
        EditText2.Initialize("EditText2")
        EditText2.Color=Colors.Transparent
        EditText2.TextColor=Colors.LightGray
        EditText2.TextSize=14
        EditText2.Text = ControlMapa.Get ("Titulo")
        EditText2.InputType = EditText2.INPUT_TYPE_NONE
        EditText2.Gravity=Gravity.LEFT
        EditSeries1(i) = EditText2
        SV.Panel.AddView(EditText2,Izquierda,Arriba + 1,Ancho,Alto)
        Arriba = Arriba + Alto + 1

        Dim EditTex1 As EditText
        EditTex1.Initialize("EditTex1")
        EditTex1.Color=Colors.Transparent
        EditTex1.HintColor =Colors.DarkGray
        EditTex1.Hint = ControlMapa.Get ("Hint")
        EditTex1.TextColor=Colors.White
        EditTex1.Text = ""
        EditTex1.TextSize=18
        EditTex1.Gravity=Gravity.CENTER
        EditTex1.Tag = i
        EditTex1.InputType = EditTex1.INPUT_TYPE_NONE

        EditSeries(i) = EditTex1
        SV.Panel.AddView(EditTex1,Izquierda,Arriba + 1,Ancho,Alto)
        Arriba = Arriba + Alto + 1
    Next
'   
'Crea un BotonGuardar
    Dim Bmp As BitmapDrawable
    Dim sld As StateListDrawable
    BotonGuardar.Initialize("BotonGuardar")
    Bmp.Initialize(LoadBitmap(File.DirAssets,"BotonGuardarVerde.png"))
    sld.Initialize
    sld.AddState(sld.State_Disabled,Bmp)
    sld.AddState(sld.State_Enabled,Bmp)
    BotonGuardar.Background=sld
    Pnl01.AddView(BotonGuardar,75%x,85%y,45dip,45dip)
    BotonGuardar.Visible=False
    
    EditSeries(0).RequestFocus 'Llama al primer control
End Sub

'__________Controla si es visible el BotonGuardar
Sub Cambios
    If EditSeries(0).Text.Trim.Length <> 0 Then
        BotonGuardar.Visible = True
        Return
    Else
        BotonGuardar.Visible = False
    End If
End Sub

'++++++++++++++++++++ Eventos ++++++++++++++++++++++++++++++++++++++++ Eventos ++++++++++++++++++++++++++
'__________Controla los cambios de foco de EditTex1
Sub EditTex1_FocusChanged (HasFocus As Boolean)
    'Cuando entra
    If HasFocus = True Then
        Edit1 = Sender
        ControlMapa = ControlLista.get (Edit1.Tag)
        inputClase1.Input(Edit1.Tag,Edit1.Text)'Llamo a BetterDialogs
        EditSeries1(Edit1.Tag).RequestFocus
    End If
    'Cuando sale
    If HasFocus = False Then
        If Edit1.Text <> inputClase1.IP1 Then
            Edit1.Text =  inputClase1.IP1
            Cambios
        End If
        'LLama a el siguiente control, Si no es el ultimo, esta vacio y no se a cancelado.
        If Edit1.Tag < (ControlLista.Size - 1)  And  EditSeries(Edit1.Tag+1).Text = "" And inputClase1.DR  <> -3 Then
            EditSeries(Edit1.Tag+1).RequestFocus
        End If
    End If
End Sub

'__________Controla la tecla ATRÁS
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    If KeyCode= KeyCodes.KEYCODE_BACK Then
        If BotonGuardar.Visible Then
            Dim Resultado As Int = Msgbox2("¿Quiere salir, sin guardar los cambios?","Atras", "Si","No","",Null)
            If Resultado = DialogResponse.POSITIVE Then
                Activity.Finish
            Else
                Return True
            End If
        End If
    End If
    Return False
End Sub
Modulo de clase
B4X:
Sub Class_Globals
    Private BetterDialogs1 As BetterDialogs             'Trabajos con Dialogos (Libreria BetterDialogs )
    Private IP As BD_InputBoxParams                'Trabajos con Dialogos (Libreria BetterDialogs )
    Dim DR As Int
    Dim controlMapa As Map
    Dim ControlLista1 As List
    Dim IP1 As String
End Sub

'Inicializa el objecto. Puede agregar parámetros al metodo si lo necesita.
Public Sub Initialize(ControlLista As List)
    ControlLista1 = ControlLista
End Sub

'__________BetterDialogs
Public Sub Input(Posicion As Int,Texto As String)
    controlMapa = ControlLista1.get (Posicion)
    IP.Initialize
    IP.Default = Texto                                'Texto
    IP.HintColor = Colors.Red                            'Color de la Insinuación
    IP.InputTextSize = 24                                'Tamaño de letra del Input
    IP.Gravity = Gravity.CENTER_VERTICAL + Gravity.CENTER_HORIZONTAL    'Horientacion
    IP.Multiline = False                                'Multiples lineas
    IP.QuestionTextSize = 18                            'Tamaño de letra de la Pregunta
    IP.SpaceBetween = 4dip                                'Espacio entre la Pregunta y el Input.
    IP.ValidationCallback = "Input_Validation"                'Validar datos
    IP.WithSuggestions =True                            'Teclado con Sugerencias
    IP.Format = controlMapa.Get ("Formato")                    'Formato
    IP.Hint = controlMapa.Get ("Hint")                        'Insinuación
    IP.Question = controlMapa.Get ("Pregunta")                'Pregunta
    Select controlMapa.Get ("Teclado")                        'Tipo de teclado:  5=INPUT_TYPE_TEXT, 6=INPUT_TYPE_TEXT_WITH_CAPS
        Case 1 'Numeros con decimales
            IP.InputType = IP.INPUT_TYPE_DECIMAL_NUMBERS
        Case 2 'Numeros
            IP.InputType = IP.INPUT_TYPE_NUMBERS
        Case 3 'Numeros con signos
            IP.InputType = IP.INPUT_TYPE_NUMBERS_WITH_SIGN
        Case 4 'Telefono
            IP.InputType = IP.INPUT_TYPE_PHONE
        Case 5 'Texto
            IP.InputType = IP.INPUT_TYPE_TEXT
        Case 6 'Texto con Sugerencias
            IP.InputType = IP.INPUT_TYPE_TEXT_WITH_CAPS
    End Select

    If controlMapa.Get ("Necesario") And IP.Default = "" Then
        DR = BetterDialogs1.InputBox("", IP, "Ok", "", "", "")
    Else
        DR = BetterDialogs1.InputBox("", IP, "Ok", "Cancelar", "", "")
    End If

    If DR = DialogResponse.POSITIVE Then
        IP1=IP.CompactAnswer
    Else
        IP1=Texto
    End If
End Sub

'__________Valida el BetterDialogs
Sub Input_Validation(Answer As String, CompactAnswer As String) As String
    If CompactAnswer.Length>controlMapa.Get ("Caracteres") Then
        Main.BE.Beep
        Return CompactAnswer.Length & " Carácteres." & CRLF & "Maximo " & controlMapa.Get ("Caracteres") & " carácteres"
    Else If CompactAnswer = "" And controlMapa.Get ("Necesario")= True Then
        Main.BE.Beep
        Return "No puede estar vacio"
    Else
        Return ""
    End If
End Sub
No se si estoy metiendo la pata.

Y otra cosita, ¿Se puede controlar los caracteres?
Mas menos como.
B4X:
Sub EventName_TextChanged (Old As String, New As String)
    
End Sub
Perdón por mi ignorancia y Feliz San Valentín.
 

bgsoft

Well-Known Member
Licensed User
Y otra cosita, ¿Se puede controlar los caracteres?
Mas menos como.
Code:
Sub EventName_TextChanged (Old As String, New As String)

End Sub
Hola, como ya te comenté, los módulos de código permiten eventos, por lo tanto si tienes un EditText, si al inicializarlo le pones un nombre de evento, podras crear ese evento TextChanged

Perdón por mi ignorancia y Feliz San Valentín
San Valentin? :rolleyes: ya llegó febrero? que mal ando de la cabeza, debe ser la edad :D . Es broma, y no hay que perdonar nada, aqui todos aprendemos algo, y ninguno nacimos enseñado.

Saludos
 
Last edited:

JMMF

Member
Licensed User
Hola, como ya te comenté, los módulos de código permiten eventos, por lo tanto si tienes un EditText, si al inicializarlo le pones un nombre de evento, podras crear ese evento TextChanged
Si, Te entiendo.
Pero es posible generar un evento TextChanged (Old As String, New As String) a BetterDialogs?.
Mi problema es que cuando guardo en la DB. un texto con ' este carácter, me da un error.
Es por hacer algo como esto.
B4X:
If New.SubString(Old.Length)="'" Then
      Edit1.Text = Old & "´"
      Edit1.SelectionStart=(Edit1.Text.Length)
End If
San Valentin? :rolleyes: ya llegó febrero? que mal ando de la cabeza, debe ser la edad :D . Es broma, y no hay que perdonar nada, aqui todos aprendemos algo, y ninguno nacimos enseñado.
Es que estoy muy enamorado.:) Y papa Noel, esta pobre este año.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Hola:

Cada objeto tiene sus eventos, y un InputBox no tiene un evento TextChanged, pero si tu problema es ese caracter puedes eliminarlo o cambiarlo por código en lo que te devuelve el InputBox

B4X:
' Tu tienes esto
 If DR = DialogResponse.POSITIVE Then
      IP1 = IP.CompactAnswer
B4X:
' Podrias hacer algo asi
 If DR = DialogResponse.POSITIVE Then
     'aqui lo reemplazas por el mismo que estás haciendo en tu código
      IP1 = IP.CompactAnswer.Replace("'","´")
   
     ' Si pones "" (cadena vacia) lo eliminas, tu eliges por que reemplazarlo
     IP1 = IP.CompactAnswer.Replace("'","")
Feliz año nuevo (y San Valentin cuando llegue :D)

Saludos
 
Last edited:

JMMF

Member
Licensed User
Sr. Creo que bgsoft, es papa Noel de incógnito.
Siempre nos regala soluciones muy buenas y geniales.

Perfecto.
Gracias bgsoft.

Feliz año nuevo y también San Valentín. :D
 
Top