Ir al contenido


Foto

[RESUELTO] Error al salir del programa


  • Por favor identifícate para responder
25 respuestas en este tema

#21 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 enero 2011 - 08:48

Gracias Delphius por tu gran ayuda, voy a realizar las pruebas y te digo como va todo.
  • 0

#22 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 enero 2011 - 08:57

También te recomendaría que hicieras esta prueba:



delphi
  1. if Assigned(ElObjetoX)
  2.   then showMessage('El objeto X está vivo')
  3.   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.  (y)


delphi
  1. procedure TFRMactivasred.FormCloseQuery(Sender: TObject;
  2.   var CanClose: Boolean);
  3.   var
  4.   f: TForm;
  5.   begin
  6.   f := Dialogs.CreateMessageDialog('REALMENTE DESEA SALIR', dialogs.mtInformation, dialogs.mbOKCancel);
  7.   f.Color := clBlue;
  8.   f.Font.Color := clLime;
  9.   if f.ShowModal = mrOk then
  10.     BEGIN
  11.       Timermonitoreo.Enabled:=false;
  12.       DMmonitorenred.ZIBEventAlerter1.Free;
  13.       DMmonitorenred.ZConmonred.Disconnect;
  14.       Application.Terminate;
  15.     END
  16.     else
  17.       canclose := false;
  18.   end;



Lo he puesto asi y el error ha desaparecido. Dime si asi esta correcto o si hay algun otro error.
  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 enero 2011 - 09:10

Si dices que probaste y el error desapareció es, posiblemente, que de "puro cuete" (que tuve mucha suerte) le acerté... algún palazo de ciego tenía que rebotar en algo  :D

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:



delphi
  1. 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,
  • 0

#24 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 enero 2011 - 09:41

Gracias por todas tus explicaciones las cuales son siempre muy completas. Gracias por tu ayuda  (y) (b)
  • 0

#25 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 enero 2011 - 10:19

He intentado encontrar alguna documentación que indique si el componente tiene sus fallas, o como se lo utiliza.  Un artículo en un blog recomienda unas buenas prácticas de uso de ese componente.

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,
  • 0

#26 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

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 :D . 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;

  • Write your own action in OnEventAlert method of  ZIBEventAlerter
  • Run your appication and see the magic :)
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 :D



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. (y)
  • 0




IP.Board spam blocked by CleanTalk.