FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Compara Valores de Objetos de la misma clase
Hola Foro:
Necesito comparar los valores que tengo en dos objetos de la misma clase. Cuando traigo los datos de un cliente los guardo en dos objetos, Cliente y ClienteViejo, entonces me queda. Cliente.Nombre:='pepe' Cliente.Direccion:='cucha cucha 444' ClienteViejo.Nombre:='pepe' ClienteViejo.Direccion:='cucha cucha 444' lo que necesito hacer al cerrar el formulario es algo como esto if Cliente.ValoresdeTodosLosCampos<>ClienteViejo.ValoresdeTodosLosCampos then grabar; De esta manera mando a grabar solamente si hubo una modificación en. Eso es todo, desde ya gracias por su atención. |
#2
|
||||
|
||||
Como opción rápida, se me ocurre que todos los campos de la clase lo tengas almacenados en un record, crear un método que sea "Compare", e internamete utilizar la función CompareMem para comparar los valores de los records.
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
||||
|
||||
Lo que yo he hecho en algun caso similar a este es crear un método en la clase (en este caso cliente) que devuelve el objeto como string.
Utilizando un separador. En mi caso me sirve para temas de Debug, de exportación y para cuestiones como estas. En ese caso vadría con hacer algo similar a esto.
No es nada muy sofisticado, pero a mi me funciona. NOTA: En mi caso lo tengo a nivel de una clase Base que recorre todos los campos y hace la operación de concatenación, de forma que no se implementa en cada una de las clases, pero la idea es la misma. Un saludo.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
||||
|
||||
Desde la version Delphi 2006 se ha incluido la sobrecarga de operadores. Lo que te permite definir la operación de igualación entre dos registros y verificar si son iguales.
Supongamos que tienes el registro TCliente
entonces sobrecargas el operados Equal para poder hacer comparaciones entre dos registros
y lo implementas asi:
* El codigo no lo he verificado en delphi asi que puede tener errores, pero es la idea.
__________________
[Crandel] |
#5
|
||||
|
||||
Listo
Quedó así, una función dentro del objeto que devuelve verdadero o false comparando todos los campos.
-- Boton grabar --
Gracias a todos los que participaron. |
#6
|
||||
|
||||
En este caso si seria interesante usar las RTTI de delphi, aunque no soy un experto en el tema
__________________
nuestro carácter está reflejado en cada línea de código que escribimos. |
#7
|
||||
|
||||
Cita:
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#8
|
||||
|
||||
Si estamos trabajado con objetos, ¿por qué no hacer algo así?
Claro que hay que poner un método de acceso para cada propiedad (cosa que es bastante común) pero al final, la comprobación es tan sencilla como
sin tener que comparar campo por campo. -------------------------------------------------------------------------------------- Cita:
// Saludos |
#9
|
||||
|
||||
El problema que le veo a esto Román, es que sólo podemos comparar u objeto consigo mismo (por decirlo así), pero no nos serviría para comparar dos objetos distintos físicamente.
En el caso de Cliente y ClienteViejo, son dos objetos de la clase cliente distintos.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#10
|
||||
|
||||
Tienes razón Neftalí; es que me parece que en el fondo no me cuadra lo de usar dos objetos para lo mismo y subconcientemente lo omití Pero claro que bajo esas condiciones no aplica lo que digo.
// Saludos |
#11
|
||||
|
||||
Cita:
Te dejo algo para marearse un ratito, cositas que hace el compilador:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#12
|
||||
|
||||
Cita:
de esta misma forma puedes definir el operador <> y todos los restantes.
__________________
[Crandel] |
#13
|
||||
|
||||
y en el caso de registros mas complejos con varios atributos se puede aprovechar la excelente funcion CompareMem (gracias fede ya no me la acordaba)
entonces la definicion del operados Equal te queria asi:
y para el caso del operador <>
nunca entendi porque este no es el efecto por defecto y ahora si tienes exactamente la sentecia que querias arriba:
__________________
[Crandel] Última edición por Crandel fecha: 07-04-2009 a las 23:09:00. |
#14
|
||||
|
||||
Solo si el record tiene valores de longitud fija, si tiene pascal strings, null terminated string NO, pero si en su lugar lo cambias por un array de chars estático, si!
Fíjate que pasa en el ejemplo que pasé si los valores no son cargados desde constantes, haciendo algo como esto:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#15
|
||||
|
||||
POr eso digo no usar el CompareMem en este caso Eso me pasa por no seguir el hilo de la discución
__________________
[Crandel] |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como instanciar objetos de los cuales solo se conoce su clase ancestro | AzidRain | OOP | 7 | 11-07-2008 02:58:17 |
ayuda handle de multiples ventanas de la misma clase | octalh | Varios | 7 | 23-04-2008 07:44:16 |
Recorrer todos los objetos creados de una clase propia | mierda | OOP | 1 | 25-10-2007 19:52:10 |
Crear una clase y asignar objetos como propiedades | leanfreue | OOP | 4 | 13-04-2007 00:08:33 |
Obtener la clase de objetos | Feñiz | OOP | 7 | 08-05-2003 20:21:55 |
|