![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
![]() Estimados colegas,
Tengo un problema con el apagado del sistema y la aplicación que desarrollo. Lo que me gustaría conseguir es que cuando apaguen el sistema (esto es, CERRAR SESION, APAGAR EL SISTEMA o REINICIAR) mi aplicación se cerrara automáticamente. He aplicado dos soluciones descritas en este foro. Una la de Roman (http://www.clubdelphi.com/foros/show...60&postcount=2) redefiniendo los mensajes de este modo:
y también he probado con la solución descrita aquí: http://www.delphifaq.com/faq/delphi/vcl/f285.shtml Con las dos alternativas consigo lo mismo... Efectivamente mi aplicación se cierra correctamente. El problema es que por algún motivo, detiene el apagado de Windows que se ha solicitado, y por tanto el ordenador continua encendido (aunque con mi aplicación cerrada). ¿Alguien podría darme alguna orientación al respecto? Muchas gracias por adelantado. Última edición por dec fecha: 08-11-2006 a las 23:51:42. |
#2
|
||||
|
||||
Saludos
Tienes algun codigo en el evento OnCloseQuery del formulario Principal?
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#3
|
||||
|
||||
Hola vtdeleon,
Pues no, no tengo onCloseQuery en el formulario principal... Tampoco OnClose... ![]() |
#4
|
||||
|
||||
Tal como lo pintas, sobre todo no teniendo nada en el evento OnCloseQuery, no veo razón alguna para que se detenga el apagado de Windows. Quizá alguna componente que tengas en tu aplicación. Creo recordar que alguna componente de tipo TrayIcon ocasionaba esto.
// Saludos |
#5
|
||||
|
||||
Hola Roman...
Mi aplicación utiliza como componente para el TrayIcon el famoso RX (desconozco si se detectó algún problema al respecto). Aparte de ese no utilizo ninguno otro, aunque sí utilizo comunicaciones serie mediante una librería (no componente visual). Esta noche se me ocurrió una posible alternativa, pero no sé si es viable... Consistiría en detectar el tipo de "apagado" que han solicitado (cerrar sesión, apagar, reiniciar) y resolicitarlo yo en mi aplicación justo antes de cerrarla (mediante un "shutdown" por ejemplo). ¿Qué os parece? Sinceramente no es lo más elegante, pero no se me ocurre nada más... :/ Muchas gracias a todos... |
#6
|
||||
|
||||
por si acaso te sirve de algo puedes echar un vistazo al truco 464 de trucomanía.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#7
|
||||
|
||||
Mmmmm... Me pongo a probar ahora mismo. Me parece una buena alternativa. Voy a ver cómo se comporta y os digo algo en cuanto pueda.
Muchas gracias Casimiro ![]() |
#8
|
||||
|
||||
Acabo de hacer la prueba con la solución de trucomanía, pero no consigo nada nuevo. Incluso destruyendo todas las tareas, anteriores y posteriores a la ejecución del programa. :/
|
#9
|
||||
|
||||
vas a tener que probar si se apaga dándole al botón y quitándole el cable de la electricidad... vaya a ser que ni así se apague
![]() bromas aparte, es un poco raro que no consigas apagarlo de ninguna forma.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#10
|
||||
|
||||
Pues chico... Estoy por hacer la prueba, porque no lo entiendo... Ahora voy a investigar si puedo relanzar un nuevo shutdown desde mi aplicación antes de que se cierre, pero vamos... Que no tiene mucho sentido todo esto a no ser que sea lo que comentaba Roman, alguna incompatibilidad del RX... Aunque he hecho un pequeño programa de prueba y ese se cierra perfectamente y el sistema se acaba apagando...
Un misterio digno de Expediente-X... |
#11
|
||||
|
||||
por cierto, creo que no lo he leido, ¿qué windows usas?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#12
|
||||
|
||||
Por si te sirve de algo, este es el código que uso habitualmente para que se cierre sin problemas cuando uso un trxtrayicon
Código:
procedure TFmain.WMQueryEndSession(var Message: TMessage); //message WM_QUERYENDSESSION; begin Message.Result := 1; // 1=s�apagar 0=no,no apagar canClose := True; // Halt( Message.Result ); Close; // no creo que llegue a este close. // end;
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#13
|
||||
|
||||
Hola Casimiro,
Gracias por la ayuda. Pues he realizado la prueba en Windows 98, 2000 y XP, aunque realmente desarrollo en XP... Esa opción que me has dado es la que estaba intentando efectuar. El problema que me encuentro ahora es que no es capaz de reconocerme ese mensaje y por tanto no pasa por el tratamiento del WM_QUERYENDSESSION, en cambio sí pasa por el WM_ENDSESSION. Tengo la declaración en el private del formulario así: procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message WM_QueryEndSession; y la implementación procedure TFormMainImpre.WMQueryEndSession (var Msg : TWMQueryEndSession); begin Msg.Result := 1; showmessage('ENTRO QUERY'); Close; Halt; end; Pero nada. No aparece el mensaje. Seguiré intentando. Muchas gracias de nuevo. |
#14
|
||||
|
||||
![]() Estimados colegas,
Finalmente he conseguido mi propósito y os pongo la solución que he utilizado por si alguien más se encuentra en este problema. Utilicé la opción de Roman descrita aquí (http://www.clubdelphi.com/foros/sho...860&postcount=2) redefiniendo los mensajes de este modo: Aún no sé cual es el motivo que causa este funcionamiento, pero por las pruebas que he podido realizar si el cerrado se realizaba en el tratamiento del mensaje de Windows WMQueryEndSession, todo funcionaba perfectamente, en cambio si se realizaba en WMEndSession (como en mi opinión debería ser) mi programa se cerraba correctamente pero el apagado se detenía. El problema que me encontraba ahora es que no me llegaba el mensaje WMQueryEndSession antes que el WMEndSession, sino directamente éste último. Para ello he utilizado la instrucción que veis (ExitWindowsEx(EWX_FORCE, 0) ![]() Muchas gracias a todos los que habéis intentado ayudarme. Habéis sido de mucha ayuda (y consuelo en la desesperación) ![]() Saludos ![]() Última edición por vtdeleon fecha: 25-11-2005 a las 14:12:42. Razón: Etiqueta Delphi |
#15
|
||||
|
||||
Saludos
MDSato, trata de usar las Etiquetas vB :=Delphi-SQL Cambie tu post anterior para que veas el cambio y lo legible que es ahora ![]()
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#16
|
||||
|
||||
Glups... Pues sí... Perdón por la novatada...
![]() |
#17
|
||||
|
||||
Hola,
Me da la impresión de que aquí hay una confusión sobre el objetivo a realizar. La primera pregunta sería: ¿para qué quieres manejar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION? Al parecer, la respuesta la das desde el primer mensaje: Cita:
Normalmente estos mensajes sólo los requieres para asegurarte que tu aplicación haga las rutinas de limpieza necesarias antes de terminar. Pero la más de las veces bastará con usar los eventos OnCloseQuery y OnClose del formulario principal. De las pocas situaciones en que es necesario usar directamente los mensajes de Windows, es cuando necesitamos distinguir si el evento OnCloseQuery se genera bien porque simplemente alguien cierre la aplicación o bien porque se cierre la sesión de Windows. Y es así porque la VCL no considera esta situación. Pero si como dijiste: Cita:
Además, estos mensajes son para avisarte que tu aplicación se va a cerrar, mas no para avisarte que cierres tu aplicación. ¿Ves la diferencia? Así que usar Close, Halt o ExitWindowsEx no tendría porque ser necesario. Dado que no haces rutinas de limpieza en el evento OnClose ni requieres el uso de OnCloseQuery, me da la impresión de que todo este hilo se originó porque por alguna razón tu aplicación estaba impidiendo que se cerrara la sesión de Windows. La razón habría que buscarla, en lugar de andar "cuchareando" a ver con qué comando se arregla. Si la razón está en el RxTrayIcon entonces quizá baste con desactivarlo en el evento OnClose. // Saludos |
#18
|
||||
|
||||
mismo problema
Hola MDSato, tengo el mismo problema y uso tambien el componente TrayIcon. Intente usar los procedimientos que mencionas pero no se exactamente como implementarlos, por el momento los tengo declarados en el TForm pero de ahi como sigue? Gracias.
|
![]() |
|
|
![]() |
|