![]() |
Problemas con ClientDataSet
Buenos dias.
Necesito ayuda con lo siguiente. La version que usamos en la empresa para desarrollo es la de Delphi 6. El problema es el siguiente: Tengo un formulario que me registra la informacion financiera de un cliente. En este formulario se registran los ingresos y egresos anuales de los clientes a traves de un DBEdit, y el aplicativo por codigo llena otros DBEdit con la informacion mensual, la cual corresponde a los datos anuales registrados divididos entre 12. Los datos mensuales no se pueden editar puesto que los componentes estan como solo lectura. Hasta aqui todo iba bien. Hace como 6 meses el Ing que estaba de turno, realizó un cambio a este proceso y dejo editable los componentes de los ingresos y egresos mensuales, con el fin de que si se escribia un valor en la casilla mensual, automaticamente llenaba el campo correspondiente anual, y viceversa. Para este proceso utilizo los componentes ClientDataset, DataProvider, TQuery y un DataSource, los cuales se encargan de hacer estas operaciones. Como desde esa epoca hasta ahora no se habia vuelto a compilar ese proyecto no habia habido problemas. Pero ahora que se compilo nuevamente, alguno de estos componentes esta generando error al salir del formulario donde se utiliza, provocando un Access Violation. A esta conclusion llegue despues de haber realizado pruebas con la antigua version donde solo habia un Tquery y no existian los cambios realizados por el Ing. en esta version pude ver que el proceso corre sin inconvenientes. En el evento OnClose del Formulario se cierra el Client de esta forma: ClientDataset.Close; Seguido de esta linea: Action := caFree; Si alguien ha tenido el mismo problema agradeceria su orientacion y colaboracion. Cualquier informacion adicional que sea requerida con gusto solo es que me digan y sera anexada. Quedo atenta a sus comentarios y colaboracion. Gracias. |
se que has querido explicarte de la mejor manera... pero...
podrias colocar algo del codigo que tienes? |
Asi es como se llama al Formulario.
Asi es como se cierra el formulario.
Gracias por la colaboracion y si necesitan algo mas me avisan por favor. |
y como lo activas?
|
Ten cuidado, estás liberando el frmClientes 2 veces, una en el finally y otra vez cuando se cierra (en el OnClose), Yo, personalmente pondría en el finally un frmClientes.Close (sabiendo que al cerrarse, ya se libera él solito).
Si tienes una cuenta de embarcadero, puedes bajar la actualización de los IBX a la versión 7.11, eso quitará, con suerte, los problemas raros y conocidos en el ClientDataset. |
Pues estás destruyendo :rolleyes: al formulario dos veces y me parece que por eso te sale el error; primero lo haces aquí:
Tambien en tu el evento OnClose estás haciendo: Te recomiendo decidirte por una de ellas y anular la otra y ver que sucede;) EDITO: Ya Lepe lo comentó...;):D |
ahi radica la importancia de colocar algo codigo para tener una mejor idea...
como dice rgstuamigo estas liberando 2 veces el formulario y eso es lo que te causa el problema |
Cita:
|
me referia a como lo abres....
se que es con un OPEN pero antes hay que usar Fielddef.. etc... si ya esta solucionado chevere !!! |
Hola
Hice las siguientes pruebas y anexo los resultados. Deje esta parte igual.
Cambie esta parte. Comentarie el Action := caFree.
Resultado : Access Violation. Prueba 2 Comentarié el Try
Esta parte la deje en su version original.
Resultado : Access Violation Prueba 3
Quite el caFree.
Resultado : Al cerrar FrmClientes no me sale Access Violation, pero si vuelvo y lo abro e intento registrar otro cliente me sale el error QryConsulta: Cannot perform this operation on a closed dataset. Cuando cierro el formulario principal FrmMenuCliente, me dice que provoco un error y debe cerrarse y despues me despliega el Access Violation. Osea que se cambia el error de un formulario a otro. y el problema es que no me deja crear o editar un nuevo cliente. Prueba 4 Agregue Close despues del Free
Quite el caFree
Resultado : Access Violation. Bueno parece que es mas complicado de lo que parece. Ahi les dejo las 4 pruebas que realice sin exito. Quedo atenta a sus comentarios. Gracias. |
Cita:
Este es la programacion que tiene el boton aplicar que guarda los cambios realizados a la informacion financiera.
Anexo las partes donde se hace referencia al Client
Estas la mayoria de las partes donde se referencia a este ClientDataSet. Espero que sirva de algo. Muchas Gracias. |
Haber cambia ésta parte>
por ésta otra> Prueba y nos comentas...;) Saludos...:) |
2 Archivos Adjunto(s)
Cita:
Gracias por la colaboracion y quedo a la espera de sus comentarios. |
Hola Diana Carolina.
El código de creación y liberación de ventanas de tu post #3, no debería generar el error de Access violation. Cuando en el evento OnClose de FrmClientes asignas Action:= caFree, Delphi no llama a Free sino a Release quien hace un PostMessage con el mensaje CM_RELEASE. PostMessage pone el mensaje en la cola de mensajes asociado al hilo que creo la ventana y retorna sin esperar a que se procese el mensaje. Cuando haces FrmClientes.Free, si el mensaje aún no fue procesado se descarta. Es decir que no importa que en FrmClientes utilizes Action:= caFree y luego lo liberes con Free. Prueba de eso es que al eliminar la línea en tu post #10 continuaste obteniendo la excepción. Podés verificarlo mediante una simple prueba con dos forms. Form1: Form2: Y ya te podés pasar el día cliqueando el botón y cerrando Form2 que no vas a obtener un error. Me inclino a pensar que la cosa viene por otro lado... ¿ Podrías poner el código de FrmClientes.OnCreate ? Un saludo. |
Hola gracias por responder. Adjunto el codigo del evento OnCreate de FrmClientes.
|
Hola Diana.
No, nada parece ser en OnCreate y tampoco veo que liberes nada en OnClose, reamente es raro. Lo que sí es seguro, por el tipo de excepción, que en algún punto tratas de utilizar un recurso no creado o de liberar un recurso inexistente... Para tratar de involucrar menos elementos y aislar el error, podrías probar lo siguiente: FrmMenuCliente
FrmClientes
Eso seguramente no te quite el error, pero lo circunscribe a FrmClientes, excepto que se esté provocando en las líneas: De las que tendrías que prescindir para la prueba. Un saludo. |
Cita:
Puedes por ejemplo colocar un "punto de ruptura"(breakPoint) en la parte donde se crea tu formulario "FrmClientes".;) Teniendo ubicada la linea que genera la Excepcion, ya es más fácil poder darse cuenta de lo que está sucediendo...;) Saludos...:) |
Cita:
Adjunto estoy anexando la imagen de exactamente en donde se genera el error. Tambien adjunto el codigo de este proceso.
Este codigo está en la la unidad RxMenDS.pas la cual está en la siguiente ruta: C:\Archivos de programa\Borland\Delphi6\Rx Library\units\RxMenDS.pas Voy a realizar las pruebas sugeridas por ecfisa y estaré subiendo el resultado de las mismas. |
La franja horaria es GMT +2. Ahora son las 22:59:28. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi