Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Ever Cerna en Julio 08, 2012, 01:52:07 am
-
Buenas amigos.
Hace un tiempo hice una consulta en este tema: http://leandroascierto.com/foro/index.php?topic=223.0 (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/ (http://www.canalvisualbasic.net/foro/visual-basic-net/detectar-cambios-en-el-contenido-de-un-textbox-12221/) Alli el amigo HAL9000 pone este codigo
'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.
-
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
-
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
(http://img341.imageshack.us/img341/6360/captura1qo.png) (http://imageshack.us/photo/my-images/341/captura1qo.png/)
Y aca es donde me marca el error.
(http://img341.imageshack.us/img341/2465/captura2b.png) (http://imageshack.us/photo/my-images/341/captura2b.png/)
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..
-
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.
-
Si no fuera mucha molestias Seba pondrias el ejmplo.
Salu2.
-
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.
-
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.
-
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.
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