Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
Pues eso que el control DirBox no da evento change cuando su contenido de texto se ve alterado.
Razón por la que uso el evento Click, pero cuando se borra el contenido con el botón erase en este caso tampoco hay evento click.
No tengo idea de por que este control se comporta de esta manera, pero me parece que seria mas útil si conserva los eventos del TextBox no?

Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
El evento change en los textbox en un lío tremendo, según para lo que quieras hacer porque:
Se dispara cuando cargas los datos de la BD (si es el caso)
Se dispara cuando pulsas una tecla lo que hace que, si el código ejecutado en él es lento (consultas en bbdd, búsquedas en listas largas, etc.) o si es código que altere "cosas" al planificarlo haya que ser muy cuidadoso.

Yo prácticamente no lo utilizo (creo que sólo una vez o dos en todos mis programas).

Un dirbox que responda a change dispararía el evento en cada pulsación... si eso implica una búsqueda en el disco ¿no sería muy lioso, según tamaño y velocidad del disco?

Lo del erase... pues lo mismo.

Aún así, si lo que quieres es un dirbox en el que puedas controlar los eventos del textbox (MaskBox, en realidad) Prueba ésto:
Coloca un DirBox en un formulario y luego:
Private o As Object
Private obs As Observer

Public Sub Form_Open()

    o = DirBox1.Children[0]
    o = o.children[0]
    o = o.children[0]
    o.ReadOnly = False
    obs = New Observer(o) As "dirboton"

End

Public Sub dirboton_change()

    Print "Evento Change Holamundo"

End

 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
shordi escribió:  
El evento Change en los TextBox en un lío tremendo ... porque Se dispara cuando cargas los datos de la BD (si es el caso) ... cuando pulsas una tecla lo que hace que, si el código ejecutado en él es lento (consultas en bbdd, búsquedas en listas largas, etc.) o si es código que altere "cosas" al planificarlo haya que ser muy cuidadoso.

Si Shordi, esto que dices es así, el evento Change puede ser muy molesto si no se acota. Yo, por ejemplo, utilizo una variable para evitar el evento cuando se están creando los controles del formulario.
Este evento lo utilizo bastante en los formularios (también el Click) de edición de datos (no necesariamente de base de datos) y utilizo una colección intermedia entre el formulario y el soporte de datos de turno.
Aquí hay un esquema:
 logica_de_datos
Funciona bien y es rápido puesto que todo sucede en memoria. Luego, cada modificación del formulario se pasa inmediatamente a la colección y cuando el usuario guarda estas modificaciones (si es que la hay) se pasan al medio pertinente, como un archivo o una base de datos.
  • Crear controles con los datos. Sin evento Change usando una bandera booleana Loaded = False por ejemplo
  • Editar los datos en los controles y la colección de datos
  • Guardar los cambios, es decir pasar lo que esta en la colección a la BBDD o XML, TXT etc.

Este sistema tienen la ventaja de acceder a la base de datos dos veces, una para cargar y otra para guardar. Lo mismo aplica a escribir un archivo en el disco.

Luego el ejemplo que pasaste es justo lo que necesitaba, muchas gracias.

Saludos
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
Deduzco que trasladas el contenido de los controles a la colección intermedia usando el evento change. Comprendo el tema pero no comparto el enfoque de usar una colección intermedia. Ya dispones de una colección con esa información: la propiedad Controls de la clase Form.

Pero bueno, como deduzco que tu sistema funciona y ya lo tienes implementado, pues perfecto.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
shordi escribió:  
Deduzco que trasladas el contenido de los controles a la colección intermedia usando el evento change. Comprendo el tema pero no comparto el enfoque de usar una colección intermedia. Ya dispones de una colección con esa información: la propiedad Controls de la clase Form.
Pero bueno, como deduzco que tu sistema funciona y ya lo tienes implementado, pues perfecto.
Saludos.

Si la colección intermedia se usara solamente para editar los datos del formulario y una vez que estos se guardan en el medio pertinente (BBDD, XML, TXT etc. ) no se usan mas, es verdad que podría usarse la colección de controles para esto, peeeero  la colección intermedia en este caso del programa que estoy haciendo ahora es la configuración de donde se toman todos los parámetros para que el programa haga sus cosas, por ejemplo directorios extensiones de archivo, hacer esto o aquello, en fin, la configuración.
He de decir que jamas use Me.Controls supongo que porque cuando comencé mi aprendizaje en gambas leí [1] que no existía un array de controles, pero acabo de comprobarlo ahora mismo y si lo tiene.
¿Siempre estuvo la matriz de controles en gambas 3?
[1] https://es.wikipedia.org/wiki/Gambas
Citar:
Diferencias con Visual Basic (6.0)
La principal diferencia con respecto a Visual Basic 6.0 es el soporte para orientación a objetos. En gambas, no existen los arreglos de controles -muy populares en Visual Basic- pero dispone de un elemento similar llamado group, que utilizado conjuntamente con arrays de objetos ofrecen resultados análogos.

Pero lo mas probable es que entendí mal el tema.  
¿Seria así este método verdad?
  Dim XControl As Object

  For Each XControl In Me.Controls
            If XControl.Name = "xnombre" Then
              Select Object.Type(XControl)
                Case "TextBox", "ComboBox", "ButtonBox", "MaskBox"
                  Print "Nombre de variable o campo de la base de datos " & XControl.Tag
                  Print "Valor de la variable " & XControl.Text
'El nombre de la tabla o el archivo xml se sabe de antemano, antes de abrir siquiera el formulario.
' Asi que he aqui el método de edicion por matriz de controles, muy interesante.
              End Select
            Endif

   Next


De momento
Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
Más o menos. Te pongo una versión simplificada del módulo (la original aprovecha esas funciones para firmar los registros, restringir los permisos, grabar los logs y avisar a los administradores de errores y demás. Si encuentras variables inútiles, etc. se debe a esa simplificación de urgencia que acabo de hacer) que usamos en el curro para actualizar las BBDD. Ya te digo que se basa en el nombre del control y en BBDD, pero no costaría nada adaptarlo a rellenar un documento XML. El tema que nos ocupa de la colección .controls lo tienes en las funciones control2fields, que rellena el registro con los valores del formulariio y fields2control que rellena el formulario con los valores del registro.

' gambas module file

Public Function grabaRegistro(tabla As String, campoClave As String, clave As Variant, oContenedor As Object, Optional laConexion As Connection = Connections[Application.Name]) As Boolean

    Dim rs As Result
    Dim lret As Boolean
    Dim f As ResultField

    lret = True
    If Not mComun.abreConexion(laConexion.Name) Then Return False
    rs = laConexion.edit(tabla, campoClave & "= &1", clave)
    rs = control2field(oContenedor, rs)
    Try rs.Update
    If Error Then
        Message.Error("No se pudo actualizar " & tabla & ". Error: \n" & Error.Text)
        lret = False
    endif
    Return lret

Catch

    Message("Error: " & Error.Text & " - " & Error.where)

End

Public Function creaRegistro(tabla As String, oContenedor As Object, Optional conec As Connection = Application.Name, Optional verClave As Boolean, Optional clave As String) As Variant

    Dim rs As Result
    Dim f As ResultField
    Dim cad As String

    lret = True
    If Not mComun.abreConexion(conec.name) Then Return False
    rs = conec.create(tabla)
    rs = control2field(oContenedor, rs)
    try rs.Update
    if Error then return false
    Return True

Catch

    Message("Error: " & Error.Text & " - " & Error.where)
    return False

End

Public Function borraRegistro(tabla As String, campoClave As String, clave As Variant, Optional hcon As Connection) As Boolean

    Dim lret As Variant
    Dim r As Result
    Dim f As ResultField
    Dim cad As String

    If Not hcon Then hcon = Connections[Application.Name]
    lret = True
    If Not mComun.abreConexion(hcon.name) Then Return False
    Try hcon.delete(tabla, campoclave & "=&1", clave)
    If Error Then 'por algún misterio, un error de clave foránea no es capturado por el catch
        Message("Error: " & Error.Text & "\nEn: " & Error.where)
        return false
    Endif
    Return True

Finally

    Return lret

Catch

    Message("Error: " & Error.Text & "\nEn: " & Error.where)
    lret = False

End

Public Sub limpiaCampos(oContenedor As Object)

      Dim o As Object
    Dim n As Integer

    For Each o In oContenedor.Children
        If o Is TabStrip Or o Is IconPanel Or o Is TabPanel Or o Is ToolPanel Then
            For n = 0 To o.Count - 1
                o.index = n
                limpiaCampos(o) 'Recursividad
            Next
            o.index = 0
        Endif
        If o Is Container Then
            limpiaCampos(o) 'Recursividad
        Endif
        'un valuebox es un textbox mejorado hay que preguntar primero por valuebox, si no daría cierto a textbox
        If o Is ValueBox Or o Is CheckBox Or o Is RadioButton Or o Is ColorButton Or o Is DirBox Or o Is SwitchButton Or o Is SpinBox Then
            Try o.value = 0
        Else If o Is TextArea Or o Is TextBox Or o Is ListBox Or o Is ComboBox Then
            Try o.Text = ""
        Endif
    Next

End

Public Function control2field(oContenedor As Form, rs As Result) As Result  

    Dim o As Object
    Dim f As ResultField

    For Each f In rs.Fields
        Try o = oContenedor.controls[f.name]
        If Not Error And Not IsNull(o) Then
            Try rs[o.Name] = o.Value
            If Error Then rs[o.name] = o.Text
        Endif
    Next

Finally

    Return rs

Catch

    Message("Error: " & Error.Text & "\nEn: " & Error.where)

End

Public Sub field2control(rs As Result, oContenedor As Form)

    Dim o As Object
    Dim f As ResultField

    For Each f In rs.Fields
        Try o = oContenedor.controls[f.name]
        If Not Error And Not IsNull(o) Then
            Try o.Value = rs[o.Name]
            If Error Then o.Text = rs[o.Name]
        Endif
    Next

Catch

    Message("Error: " & Error.Text & " - " & Error.where)

End
 


Se hace referencia a una función abreconexion() que está en otro módulo y es así:
Public Function abreConexion(Optional conec As String = Application.Name) As Boolean

    If Not Connections[conec].opened Then
        Try Connections[conec].Open
        If Not Connections[conec].opened Then
            Wait 1
            Try Connections[conec].Open
            If Error Then
                Message.Error("No se pudo abrir la Base de Datos " & Connections[conec].Name & ". Se aborta la operación en curso")
            Endif
        Endif
    Endif
    Return Connections[conec].opened

End

Como verás se intenta abrir, si no está abierta, dos veces. Se debe a que nuestro servidor de BBDD devuelve a veces un error de "Datos Incompletos" en el primer intento, pero funciona bien en el segundo.
Saludos.
 




===================
No podemos regresar
 
última edición por shordi el Viernes, 05 Julio 2019, 13:33; editado 4 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
shordi escribió: [Ver mensaje]
Más o menos. Te pongo una versión simplificada del módulo...

Gracias.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
Ayer me pasé en eso de simplificar con la función limpiacampos del módulo de más arriba. El efecto era que borraba el texto de los controles que no son de edición también.
Ya lo he corregido.

Saludos
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
shordi escribió: [Ver mensaje]
Ayer me pasé en eso de simplificar con la función limpiacampos del módulo de más arriba. El efecto era que borraba el texto de los controles que no son de edición también.
Ya lo he corregido.
Saludos

Si suele pasar al simplificar.
Gracias a que expusiste este concepto de la matriz de controles y ademas compartiste los ejemplos de código, entre ayer y hoy reduje muchas líneas de código.
No te digo que es la explosión del cámbrico respecto a mi forma de programar pero casi.
Recuerdo que también me explicaste eso de crear controles por código al abrir el formulario. Muy util me fue.
De verdad muchas gracias por tomarte el trabajo de criticar siempre de forma constructiva.
Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: DirBox No Da Evento Click Con Boton De Borrado Ni Tampoco Change 
 
tincho escribió: [Ver mensaje]
shordi escribió: [Ver mensaje]
Ayer me pasé en eso de simplificar con la función limpiacampos del módulo de más arriba. El efecto era que borraba el texto de los controles que no son de edición también.
Ya lo he corregido.
Saludos

Si suele pasar al simplificar.
Gracias a que expusiste este concepto de la matriz de controles y ademas compartiste los ejemplos de código, entre ayer y hoy reduje muchas líneas de código.
No te digo que es la explosión del cámbrico respecto a mi forma de programar pero casi.
Recuerdo que también me explicaste eso de crear controles por código al abrir el formulario. Muy util me fue.
De verdad muchas gracias por tomarte el trabajo de criticar siempre de forma constructiva.
Saludos.

Vaya, ¡Gracias! Haces que valga la pena.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario