Autor Tema: Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...  (Leído 6748 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Ever Cerna

  • Megabyte
  • ***
  • Mensajes: 113
  • Reputación: +1/-1
  • anarkia99-Soft.
    • Ver Perfil
Buenas amigos.

Hace un tiempo hice una consulta en este tema: http://leandroascierto.com/foro/index.php?topic=223.0 pero a las finales nunca l llegue hacer. Pues bien en estos dias se me vio la necesidad de volver a retomar esto y estuve buscando por Google y me encontre con este post. http://www.canalvisualbasic.net/foro/visual-basic-net/detectar-cambios-en-el-contenido-de-un-textbox-12221/ Alli el amigo HAL9000 pone este codigo

Citar
Código: [Seleccionar]
'mcDataChanges.cls
Option Explicit
Private mCol As Collection
Public Sub Inic(frmFormData As Form)
 Dim Contr As Control
 For Each Contr In frmFormData.Controls
 If TypeOf Contr Is TextBox Or TypeOf Contr Is ComboBox Or TypeOf Contr Is ListBox Then
 Add Contr, Contr.Text
 End If
 If TypeOf Contr Is DTPicker Then
 Add Contr, Contr.Value
 End If
 Next
 
End Sub
Public Property Get HayCambios() As Boolean
 Dim bChange As Boolean
 Dim ContrVal As mcControlValor
 For Each ContrVal In mCol
 If TypeOf ContrVal.Control Is TextBox Or TypeOf ContrVal Is ComboBox Or TypeOf ContrVal Is ListBox Then
 If ContrVal.Control.Text <> ContrVal.Valor Then
 bChange = True
 Exit For
 End If
 End If
 If TypeOf ContrVal.Control Is DTPicker Then
 If ContrVal.Control.Value <> ContrVal.Valor Then
 bChange = True
 Exit For
 End If
 End If
 Next
 HayCambios = bChange
 
End Property

Esta bastante interesante no ustedes que opinan es factible usar esa clase no se que opinan ustedes. Espero sus comentarios muchachos.

Salu2.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #1 en: Julio 08, 2012, 03:05:22 pm »
Aca arme una clase para detectar cambios en las propiedades de los controles, se le pueden pasar las propiedades que se quiera ej: text, listindex, value etc y automagicamente va a verificar las propiedades de todos los controles dentro de un contenedor.

El proyecto utiliza una referencia a TypeLib Information. En la descarga hay un ejemplo de como se utiliza con varios controles standard de VB.

http://www.2shared.com/file/ndI_FTGx/ControlDataChange.html

Saludos

Ever Cerna

  • Megabyte
  • ***
  • Mensajes: 113
  • Reputación: +1/-1
  • anarkia99-Soft.
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #2 en: Julio 09, 2012, 01:04:05 am »
Muy bueno Cobein. Estuve probando tu Clase y va de lujo.

Pero déjame contarte que cuando pase tu clase a mi proyecto me empezó a lanzar este error



Y aca es donde me marca el error.



A que se debe eso Cobein? Sera porque tengo UserControl, Clases cargados en el proyecto y uno de ellos sea el causante de ese problema???

Gracias nuevamente por la Clase

Salu2..

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #3 en: Julio 09, 2012, 04:32:25 am »
esto se puede hacer simplemente con una coleccion dentro de una clase, por ejemplo si trabajas con bases de datos, y tenes un ABM de clientes (y tenes creada la clase clientes con sus metodos y propiedades por ejemplo idcliente, nombre, telefono..etc.) cuando cargas el recordset principal de la clase con los datos del cliente, llenas esta coleccion con todas las propiedades y sus valores, luego cuado guardas en el AMB, llamas a este metodo, y este metodo solo verifica que cada valor original de la coleccion sea "igual" al valor de las propiedades de la clase y con eso te salta el dato que se cambio, asi de simple.

si queres te pongo un ejemplo.

saludos.

Ever Cerna

  • Megabyte
  • ***
  • Mensajes: 113
  • Reputación: +1/-1
  • anarkia99-Soft.
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #4 en: Julio 09, 2012, 10:25:07 am »
Si no fuera mucha molestias Seba pondrias el ejmplo.

Salu2.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #5 en: Julio 09, 2012, 01:58:25 pm »
Pregunta, que parametros le pasas a la funcion al llamarla?

Si es posible podrias pasarme el form donde lo queres aplicar asi lo veo y arreglo el problema?

Por otro lado, lo que dice seba es verdad se puede hacer asi pero si tenes 20 controles vas a tener que agregar y comparar los 20 paramtros uno a uno y en algunos casos imagino que se puede volver tedioso.

Ever Cerna

  • Megabyte
  • ***
  • Mensajes: 113
  • Reputación: +1/-1
  • anarkia99-Soft.
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #6 en: Julio 09, 2012, 03:42:01 pm »
Es cierto @Cobein, si en realidad tengo como 40 controles ahorita no me encuentro en la mi PC mas tarde te subo el link para que lo revisas

Gracias

Salu2.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Clase para Detectar cambios en el contenido de un TextBox, ComboBox, etc...
« Respuesta #7 en: Julio 12, 2012, 10:08:36 pm »
Bien el problema esta es que algunos de los controles que utilizaste no tienen propiedad container y eso causa el error, lo mas simple es poner un On Error Resume Next como en el ejemplo, no es lo mas elegante pero enumerar las propiedades es mas tedioso.

Código: [Seleccionar]
Private Function PackControls(ByVal objForm As Form, ByVal objContainer As Control) As String
    Dim sHash       As String
    Dim ctlObject   As Object

    On Error Resume Next
    For Each ctlObject In objForm.Controls
        If ctlObject.Container Is objContainer Then
            sHash = sHash & PackProperties(ctlObject)
        End If
    Next
   
    PackControls = HashString(sHash)
End Function

Algunos comentarios del codigo que me mandaste, no te olvides de agregar una referencia a TypeLib Information (Proyecto->Referencias) y lo otro es llama a Call cSignature.GetSignature(Me, Picture2) despues de haber cargado los datos en los controles, ejemplo si los datos los sacas de un DB cargas los mismo en los controles y lueago llamas a Call cSignature.GetSignature(Me, Picture2) y despues de eso en cualquier momento podes llamar cSignature.HasChanged(Me, Picture2) para ver si hay cambios.

Saludos