PDA

Ver la Versión Completa : no cerrar el tray


kaiser_robert
03-07-2005, 00:53:36
estoy manejando un componente cooltrayico bueno mi problema es el
siguiente cuando ejecuto mi programa mi aplicacio se va al tray porque
en el evento Oncreate del formulario puse el codigo
Application.ShowMainForm:= false;

todo perfecto el icono me muestra solo en el tray
pero cuando mi aplicacion es abierta deste el tray abre bien
el problema es al cerrar como hago para cuando den cerrar en el formulario
no borre el icono del tray
cuando cierren mi aplicacion se quede en el tray

___________________________________________


alguien me puede ayudar con algun codigo para hacer esto

Lepe
03-07-2005, 01:49:48
En mi opinión personal, el boton cerrar es para cerrar la aplicación, si quiere minimizarla, que pulse el otro botón. Pulsar para cerrar y que despues se esconda, para mí al menos, supone una incomodidad. No se puede acostumbrar mal a los usuarios.

Para hacer lo que quieres, en el evento OnClose, cambia el parámetro action a caHide, con esto se esconderá la ventana principal.

Un saludo.

dec
03-07-2005, 02:00:12
Hola,

Lepe, dependerá también del tipo de aplicación que sea, aunque sea una mala costumbre y poco intuitivo lo cierto es que aplicaciones como el Microsoft Messenger hace uso de algo así.

Por otro lado no me funciona lo que dices de "OnClose", aun poniendo "Action" a "caHide" el formulario se cierra. Digo yo de utilizar el evento "OnCloseQuery", dar el valor "false" a la variable "CanClose" y utilizar el método "HideMainForm" conque cuenta el propio componente CoolTrayIcon (http://www3.brinkster.com/troels/delphi.asp).

Algo así, vamos:


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := false;
CoolTrayIcon1.HideMainForm;
end;


Siempre queda la posibilidad de hacer algo así también:


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := DecisionUsuario; // el usuario decide
CoolTrayIcon1.HideMainForm;
end;

dec
03-07-2005, 02:27:52
Hola,

A ver si me aclaro, que tal vez halla hablado demás:


caNone The form is not allowed to close, so nothing happens.
caHide The form is not closed, but just hidden. Your application can still access a hidden form.
caFree The form is closed and all allocated memory for the form is freed.
caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms.

¿Cómo es posible que no me funciona "caHide"? ¿Será que no vale para el formulario principal del programa? Me va bien "caNone"... en el formulario principal, pero, por ejemplo "caMinimize" no hace lo que se espera de ella.

Lo que sigue de la ayuda de Delphi tampoco es que me aclare mucho:


If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone, meaning that nothing happens when the user attempts to close the form.

If a form is an SDI child form, Action defaults to caHide.

To close the form and free it in an OnClose event, set Action to caFree.

Sin embargo, parece ser el evento "OnClose" el que tal vez convenga usar en este caso, y vuelvo a la ayuda de Delphi:


Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler returns a Boolean CanClose value that determines whether a form is allowed to close. Its default value is true.

You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form.

The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines
if the form can close or not.

O sea, algo se me está escapando y no es que "no me funcione" la variable "caHide" del evento "OnClose", pues no faltaba más...

Lepe
03-07-2005, 11:56:47
Que Microsoft lo haga, no significa que hay que hacerlo así, ya he dicho que es una opinion personal; para mi un boton cerrar es un botón Cerrar :D

La ayuda de delphi a veces, es mas confusa que el código fuente:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);

// Estas 2 comprobaciones son las que hace terminar la aplicación
// y por eso solo funciona con caNone, con los demás se cierra.
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate

else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;

Pido disculpas, lo dije de memoria sin corroborarlo. Además no uso el Cooltray, así que ignoro si tiene métodos para hacerlo de otra forma.

Por tanto creo adecuado el primer código propuesto por dec.

Un saludo

dec
03-07-2005, 14:48:49
Hola,


La ayuda de delphi a veces, es mas confusa que el código fuente

Y que lo digas Lepe, en este caso, y no solamente en este caso, parece ser así como dices. Habrá que aplicarse el cuento. Gracias.

roman
03-07-2005, 18:20:46
para mi un boton cerrar es un botón Cerrar

Difiero aquí. A lo que tú estás acostumbrado es a que al cerrar la ventana principal se cierra también la aplicación. La ventana principal no es sinónimo de la aplicación. En el comportamiento que se quiere lograr aquí, así como el descrito del messenger, lo único que estás cambiando es que al cerrar la ventana principal no se cierra la aplicación, situación que me parece muy válida para este tipo de aplicaciones.

// Saludos

dec
03-07-2005, 18:38:59
Hola,


A lo que tú estás acostumbrado es a que al cerrar la ventana principal se cierra también la aplicación.
Bueno... si se trata de la ventana principal de la aplicación ese sería el comportamiento que todos esperarían... de hecho sorprende, cuesta hacerse a las aplicaciones del tipo Messenger: esperas que se cierre la aplicación y no lo hace... ¿qué pasa, pues?

Los programadores del Messenger así parecen haberlo advertido, al indicar al usuario esa rareza de la aplicación: te sale un mensaje de advertencia indicándote que la aplicación no se cerrará, en el que se incluye un dibujito de cómo la aplicación pasará a estar en el "System tray".

Por si fuera poco al cerrar la ventana del Messenger esta se desliza en un efecto hasta el "System tray". Convengo con roman en que este tipo de aplicaciones requieren de algo así: que el cierre del formulario principal no implique el cierre del programa.

Sin embargo, me divido entre roman y Lepe, puesto que, existe la solución que da el programa Emule, por ejemplo, el cual cuenta con un botón expresamente indicado para minimizar la aplicación en el System Tray: y el botón "cerrar" cierra la aplicación.

Con esta última opción corres el riesgo de que la barra de título de la ventana se llene de botones, que si el de la ayuda, el de "siempre arriba", el de "minimizar al tray"... etc.

A mí me parece que en las aplicaciones mencionadas, Messenger y Emule la cosa se soluciona bastante bien. En la primera, por las advertencias que dejan claro al usuario el comportamiento atípico de la aplicación; en la segunda, porque al cabo no hay más botones añadidos a la barra de título sino el mentado, con lo cual tampoco queda tan mal... aunque para gustos, etc.

Si tengo que decidirme por alguno de los "dos estilos" mencionados para afrontar la primera sorpresa del usuario del programa al cerrar este "como siempre" me quedaría con el del Messenger, por lo ya dicho.

roman
04-07-2005, 05:28:00
esperas que se cierre la aplicación y no lo hace... ¿qué pasa, pues?


Claro está que esto es una cuestión de apreciación personal. Para mi el punto está en que yo no espero que se cierre la aplicación.

En la oficina, por ejemplo, tengo instalado un servidor FTP- que nada tiene que ver con Microsoft. Este servidor presenta una ventana principal para configurarlo y cuando doy click en el botón "Cerrar" de la barra de título espero- y es lo que sucede -que se cierre la ventana principal. No me interesa que se minimice a la barra de tareas pues no es una ventana que use con frecuencia, así que no pienso en usar el botón de minimizar. Pero no espero que se cierre la aplicación pues debe estar siempre activa ¡Es un servidor! Lo que espero es cerrar la ventana porque ya no la voy a usar.

En el caso del messenger- que no uso -la filosofía -que no comparto -es la misma. Se considera que debe estar siempre activo. Y aunque yo no comparta dicha filosofía sé que muchos usuarios son felices teniendo activo el messenger todo el día.

En resumen, depende, en mi opinión, del tipo de aplicación de que se trate.

En mi experiencia como usuario, la principal razón para que una aplicación coloque un icono en la bandeja es porque por una u otra razón debe estar siempre activa aunque no visible y el icono da un punto de entrada para cuando la ventana principal está cerrada.

// Saludos