[RESUELTO] Error al salir del programa
#21
Escrito 11 enero 2011 - 08:48
#22
Escrito 11 enero 2011 - 08:57
También te recomendaría que hicieras esta prueba:
delphi
if Assigned(ElObjetoX) then showMessage('El objeto X está vivo') else showMessage('El objeto X está muerto. Cuidado... utilizarlo provoca un AV');
Siendo ElObjetoX el nombre de tus componentes/objetos que utilices. Empieza con tus objetos TZIBEventAlerter y luego con otros objetos.
Si el error viene cuando se cierra la aplicación es conveniente que esa prueba se haga en OnClose o en OnCloseQuery.
Esta prueba sencilla podría ayudar a rastrear al desgraciado. Si es que realmente el AccessViolation es causado por un intento de utilizar un objeto ya liberado. Al menos el mensaje de error indica que el AV se presenta cuando se intenta leer una zona de memoria 0, eso indica que un componente o control está liberado.
Saludos,
He hecho lo que me indicas aqui arriba y el objeto estaba vivo, pero lo que realmente debia hacer era liberarlo, para que cuando se cerrara el datamodule no me diera error.
procedure TFRMactivasred.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var f: TForm; begin f := Dialogs.CreateMessageDialog('REALMENTE DESEA SALIR', dialogs.mtInformation, dialogs.mbOKCancel); f.Color := clBlue; f.Font.Color := clLime; if f.ShowModal = mrOk then BEGIN Timermonitoreo.Enabled:=false; DMmonitorenred.ZIBEventAlerter1.Free; DMmonitorenred.ZConmonred.Disconnect; Application.Terminate; END else canclose := false; end;
Lo he puesto asi y el error ha desaparecido. Dime si asi esta correcto o si hay algun otro error.
#23
Escrito 11 enero 2011 - 09:10
Como dije antes, Zeos no utilizo por lo que no te sabría decir si hay otro error en esas líneas. Como medida de seguridad deberías fijarte en la documentación de Zeos si hay alguna explicación sobre el manejo de sus componentes. En especial pondría atención a si es necesario liberar explícitamente ese componente (*)
En mi opinión personal, el Application.Terminate está demás... Si ese form es el principal el sólo hecho de cerrarse hace que la aplicación finalice, en todo caso reemplazaría esa línea por:
CanClose := true;
Para indicar explícitamente que se le permite cerrar al form y por tanto, liberar todos los recursos utilizados.
(*) Recuerda que por defecto un componente colocado en diseño se libera, automáticamente, ni bien se libera el objeto dueño que lo contiene. Solamente tenemos la obligación de tomar el control de liberación cuando lo hacemos de forma dinámica, en tiempo de ejecución.
Saludos,
#24
Escrito 11 enero 2011 - 09:41
#25
Escrito 11 enero 2011 - 10:19
No se si utilizas otra versión, creería que el manejo no debería haber variado mucho. Lo que si me llama la atención son algunos de los tips que indica... Tal parece que tiene sus mañas. Con justa razón es que se puedan esperar AV.
Saludos,
#26
Escrito 11 enero 2011 - 10:58
Zeos 6.6.3-rc(Rev368) ZIBEventAlerter Yesterday I had a chat with "mdaems" one of the ZeosLib developer,
and now I know how this new component work . Here are the steps
that you must follow:
1.-Drop the ZIBEventAlerter to your form and attach connection property to ZConnection
2.-Add events name in the Events property of ZIBEventAlerter (one line for one event)
3.-Set AutoRegister property of ZIBEventAlerter to false (because it still not work correctly even if you set it to true)
4.- Set Registered property of ZIBEventAlerter to false (if you set it to true it will create AV when your application start because it will register the event before the connection establish)
5.-Call RegisterEvents method of ZIBEventAlerter in OnAfterConnect event of ZConnection
procedure TForm1.con1AfterConnect(Sender: TObject)
begin
ZIBEventAlerter1.RegisterEvents
end;
6.-It also a good practise to call UnregisterEvents in OnBeforeDisconnect of ZConnection
procedure TForm1.con1BeforeDisconnect(Sender: TObject)
begin
ZIBEventAlerter1.UnRegisterEvents
end;This component also still need refactoring to became more generic, because the heart of Zeos is can be used with more than 1 database. So this component is still in development, but you can use for Firebird/Interbase right now
- Write your own action in OnEventAlert method of ZIBEventAlerter
- Run your appication and see the magic
Muy buen articulo, Me voy a tenerque poner tan minucioso como tu y tratar de entender las cosas con mayor profundidad. Gracias de nuevo y voy a poner en practica lo descrito en esta nota y luego aviso.