FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Problema con (Before/After)FieldChange
De acuerdo con os posts de Al Gonzalez em su blog RescatandoDelphi,
Implemente los eventos BeforeFieldChange y AfterFieldChange en Delphi 2010 utilizando la query de UNIDAC como herencia y obtuve éxito. Sin embargo, no funcionó con Delphi Berlin. He intentado debugar y me di cuenta de que la función NativeValue no devuelve los valores correctos. ¿Alguien sabría decirme cuál sería la solución? Sigue el código del componente que he creado heredando de UNIDAC Query: ( perdón pero parece que no tengo permiso para insertar enlaces ni syntaxhilight en el foro )
Última edición por ecfisa fecha: 31-08-2017 a las 21:19:24. Razón: Agregar etiquetas [Delphi] [/Delphi] |
#2
|
||||
|
||||
¡Órale! Alguien se interesa en el código de mi antiguo blog.
Afortunadamente hoy también yo uso Delphi Berlin. Veré si puedo encontrar un espacio para revisar lo que comentas. Dos preguntas: ¿Te refieres a FireDAC? (Creo que antes se llamaba UNIDAC). ¿Podrías explicar con el mayor detalle posible lo que estás obteniendo? Muchas gracias. |
#3
|
|||
|
|||
Hola Al Gonzalez,
Firedac (antiguo AnyDac) es diferente de Devart Unidac. El código probado es muy simple lo que tengo es esto:
Este código sirve para hacer auto-incremento en un campo del tipo Integer. GetAutoInc ('CLIENTE') devuelve el valor correcto pero el valor establecido en el campo siempre es 0. Debugando el código (sin profundizar mucho por falta de conocimiento), percibí que en la función NativeValue del componente en la línea "Result: = Field.Value;" siempre devuelve 0. |
#4
|
|||
|
|||
BeforeFieldChange / AfterFieldChange - Pointer vs TValueBuffer
Cita:
Hola Al González Implemente el componente TSysClientDataSet con los eventos BeforeFieldChange / AfterFieldChange en Delphi 7/2006 según sus ejemplos de 2010 y realmente han sido de gran utilidad hasta hoy, sin embargo, estoy migrando todos los componentes a Delphi Berlin / Tokyo, el problema está en los Pointer que pasaron a TValueBuffer en el Berlin / Tokyo. ¿Tiene alguna idea de lo que puede estar equivocado?
Muchas gracias Última edición por andrecrp77 fecha: 06-11-2017 a las 02:20:57. Razón: Code Delphi |
#5
|
||||
|
||||
Cita:
Saludos. |
#6
|
||||
|
||||
Pruebas exitosas
¡Hola!
Contento porque he terminado de hacer los cambios necesarios para adaptar esta implementación de los eventos BeforeFieldChange y AfterFieldChange a las más recientes versiones de Delphi. Les dejo aquí el código de la clase que usé para las pruebas. Recuerden que, en teoría, puede aplicar también a cualquier otra clase de data set. Les agradezco por las pruebas que ustedes hagan con sus componentes, para saber si la solución es 100% efectiva. Veo que hay un par de cosas que puedo mejorar, pero considero que de momento así puede servir bastante bien. Un saludo. Al González. NOTA: Modifiqué el código para corregir cierto problema con el evento OnValidate. Probé OnChange, OnValidate, BeforeFieldChange y AfterFieldChange, funcionando todo correctamente. Pero agradezco la confirmación que ustedes puedan hacer probando con otros componentes de base de datos. El código puede ser mejorado en varios aspectos, y probablemente intente optimizarlo luego. Última edición por Al González fecha: 11-02-2018 a las 11:30:04. Razón: Mejora, y corrección de bug reportado en febrero de 2018. |
#7
|
||||
|
||||
Bueno, me llegó una notificación a mi correo sobre una retroalimentación de leus a este hilo.
Entiendo que puede tener poca relación. Aunque por los últimos mensajes que él ha publicado, podría al menos responderle que sí: que Embarcadero ha hecho sutiles cambios a la unidad Data.DB.pas, lo cual ha impactado en el funcionamiento de clases antiguas de datasets. Los cambios, para mi punto de vista son acertados, pero evidentemente que nos toca reacomodar algunas cosas en los componentes más viejos cuando vemos que algo ya no funciona igual. Fue el caso de sirmenon y andrecrp77, que felizmente pudieron (al menos el último) seguir usando la implementación de eventos BeforeFieldChange y AfterFieldChange, hecha originalmente para la manera en que trabajaba el TDataSet de Delphi 7, ahora disponible también para Berlin y similares. En seguida voy al otro hilo a retroalimentar un poco también. :-) |
#8
|
|||
|
|||
¿Alguien más llegó a identificar este problema?
Hasta hoy esta fue la forma más inteligente y rápida que encontré para trabajar con la validación de campos y campos calculados (sin tener que hacer uso muy extenso de OOP). |
#9
|
||||
|
||||
Muchas gracias. Es motivante leer lo último. Intentaré encontrar la forma de dedicar tiempo y recursos a esa solución para Delphi Berlin/Tokyo. Ya veo que son varios los colegas que se encontrarán con la misma situación debido a los cambios que han tenido las clases nativas...
|
#10
|
|||
|
|||
Solución ?
Hola.
Sigue la solución que encontré para continuar utilizando los eventos Before / Afterfieldchange en Delphi Tokyo. Estamos en el camino correcto, algún ajuste?
Última edición por andrecrp77 fecha: 13-11-2017 a las 11:57:27. Razón: code delphi |
#11
|
||||
|
||||
¡Gracias! Echaré un vistazo y haré pruebas de tus modificaciones. Más tarde comentaré lo que encuentre. :-)
|
#12
|
||||
|
||||
Me congratulo de haber conseguido patrocinio para realizar la adaptación que aquí se pide. Para los que no estén muy enterados del tema, les dejo este material.
Lo colgaré como una solución open source cuando estén hechas las pruebas. |
|
|
|