For Each en una clase

02/07/2003 - 18:27 por HARE | Informe spam
hola forer@s, tengo un problemilla con una clase, os cuento: Tengo una ficha
con 56 campos y he para saber si el usuario modifica alguno de ellos he
creado una clase con esos 56 campos, de la clase creo una coleccion, de
manera que cuando el usuario abre la ficha cargo los campos en la
coleccion(1), y cuando se sale los cargo en la coleccion(2) y las comparo
para ver si hizo algun cambio y avisarle antes de que cierre el formulario,
esto mismo lo hago cuando da al boton guardar, bueno el caso es que no se
muy bien como comprobar si son iguales las colecciones, por ahora lo estoy
haciendo asi:
HuboCambios = Not ( _
McolPelicula.Item(1).CalidadSonido McolPelicula.Item(2).CalidadSonido And _
McolPelicula.Item(1).CalidadVideo McolPelicula.Item(2).CalidadVideo...)
el caso es que cuando la clase es muy grande y tiene muchas propiedades pues
se tarda bastante es escribir todo el codigo, he probado a igualas las
coleccines directamente de esta forma:
McolPelicula.Item(1) = McolPelicula.Item(2)
pero no vale, asi ke me preguntaba si podrian recorrerse todos los campos de
la coleccion de alguna forma como usando For Each o algo parecido, no sep,
espero que sepais algo mejor que lo que yo estoy haciendo y sobre todo mas
rapido de picar :-) un saludo y espero no habeos aburrido con tanto rollo,
saludosssssss

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP]
02/07/2003 - 20:00 | Informe spam
Si el asunto es solo saber si se modifica algun campo o no, creo que lo mas
simple es utilizar una variable global tipo boolean a nivel del formulario y
que la pongas en True cuando se realiza algun cambio en los controles.

Eduardo A. Morcillo [MS MVP - VB]
http://www.domaindlx.com/e_morcillo
Respuesta Responder a este mensaje
#2 Leonardo Azpurua
02/07/2003 - 22:35 | Informe spam
Hare:

En general, a menos que tengas un tráfico espantoso y una conexión
problemática, no hay demasiado desmedro en ejecutar un UPDATE que no
actualice nada.

Lo que te sugiero es que crees una clase con dos atributos (supongamos que
la llamamos CEstadoControl):

Public pControl As Control
Public orgVal ' As Variant

Una vez que hayas cargado los valores iniciales en la forma, puedes llamar a
RegistrarEstadoInicial, que hace más o menos esto:

Dim colEstadoInicial as Collection

Set colEstadoInicial = New Collection
For Each pControl In Me.Controls
If TypeName(pControl) = "TextBox" Then
' Estoy asumiendo que todos los controles son Text;
' de lo contrario, el procedimiento puee se un poco más complejo
Set pOriginal = New CEstadoControl
With pOriginal
Set .pControl = pControl
orgVal = pControl.Text
End With
colEstadoInicial.Add pOriginal, pControl.Name
Next



Y para comparar:

bHayCambios = False
For Each pControl in Me.Controls
If TypeName(pControl) = "TextBox" Then
If pControl.Text <> colEstadoInicial(pControl.Name).Value Then
bHayCambios = True
Exit For ' Basta con detectar UN SOLO cambio
End If
Next

y si bHayCambios = True, actualizas.

Con un poco de esfuerzo adicional (diferentes tipos de control, etc), puedes
hacer una clase genérica, que instancias desde cualquier forma, y tienes esa
funcionalidad donde la necesites.

Salud!

Leonardo

Microsoft MVP
Maicrosoft LVP - MOP Certified
Respuesta Responder a este mensaje
#3 Ramon
03/07/2003 - 03:12 | Informe spam
Hola.

Pues veras. lo que yo te recomendaría que hicieras es algo similar a lo
que propone Leonardo.

Una vez que obtienes los datos para cada control del Form le pones el
dato original en su propiedad Tag.

Y después solo los comparas.

bHayCambios = Falsee
For Each oControl In Me.Controls
bHayCambios = bHayCambios OR oControl.Text <> oControl.Tag
Next

Saludos.
Ramón.





"HARE" <hare(Arroba)nalsite.com> escribió en el mensaje
news:
hola , tengo un problemilla con una clase, os cuento: Tengo una


ficha
con 56 campos y he para saber si el usuario modifica alguno de ellos he
creado una clase con esos 56 campos, de la clase creo una coleccion, de
manera que cuando el usuario abre la ficha cargo los campos en la
coleccion(1), y cuando se sale los cargo en la coleccion(2) y las comparo
para ver si hizo algun cambio y avisarle antes de que cierre el


formulario,
esto mismo lo hago cuando da al boton guardar, bueno el caso es que no se
muy bien como comprobar si son iguales las colecciones, por ahora lo estoy
haciendo asi:
HuboCambios = Not ( _
McolPelicula.Item(1).CalidadSonido > McolPelicula.Item(2).CalidadSonido And _
McolPelicula.Item(1).CalidadVideo > McolPelicula.Item(2).CalidadVideo...)
el caso es que cuando la clase es muy grande y tiene muchas propiedades


pues
se tarda bastante es escribir todo el codigo, he probado a igualas las
coleccines directamente de esta forma:
McolPelicula.Item(1) = McolPelicula.Item(2)
pero no vale, asi ke me preguntaba si podrian recorrerse todos los campos


de
la coleccion de alguna forma como usando For Each o algo parecido, no sep,
espero que sepais algo mejor que lo que yo estoy haciendo y sobre todo mas
rapido de picar :-) un saludo y espero no habeos aburrido con tanto rollo,
saludosssssss


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida