Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2008
loquillo3 loquillo3 is offline
Miembro
 
Registrado: oct 2007
Posts: 51
Poder: 17
loquillo3 Va por buen camino
Minimizar en la bandeja del sistema

Hola,

Mi problema es el siguiente:

Estaba viendo una pagina donde ponian un codigo para minimizar la aplicacion en la bandeja del sistema, pero no pude hacerlo funcionar.aqui les dejo el codigo. si alguien lo hace funcionar lo dice.




El texto dice lo siguiente:

Voy a mostraros como modificar el formulario principal de vuestra aplicación para que se minimize en la bandeja del sistema y una vez minimizado cuando se pulse sobre el icono se restaure. También vamos a añadir la posibilidad de pulsar dicho icono con el botón derecho del ratón y que muestre un menú contextual (popup) con la opción Mostrar.

Lo primero de todo es añadir un menú contextual a nuestro formulario principal (PopupMenu) con el nombre MenuBandeja. Añadimos una sola opción llamada Mostrar. A continuación añadimos en la sección uses del formulario principal la unidad ShellAPI:


Código Delphi [-]
uses
  Windows, Messages, ...., ShellAPI;

Después en la sección private insertamos la variable:

Código Delphi [-]
 IconData: TNotifyIconData;

En la misma sección private añadimos los procedimientos:


Código Delphi [-]
  procedure WMSysCommand( var Msg: TWMSysCommand ); message WM_SYSCOMMAND;
  procedure Restaurar( var Msg: TMessage ); message WM_USER+1;

Cuya implementación sería la siguiente:


Código Delphi [-]
procedure TFPrincipal.WMSysCommand( var Msg: TWMSysCommand );
begin
  if Msg.CmdType = SC_MINIMIZE then
    Minimizar
  else
    DefaultHandler( Msg );
end;

procedure TFPrincipal.Restaurar( var Msg: TMessage );
var p: TPoint;
begin
  // ¿Ha pulsado el botón izquierdo del ratón?
  if Msg.lParam = WM_LBUTTONDOWN then
    MostrarClick( Self );

  // ¿Ha pulsado en la bandeja del sistema con el botón derecho del ratón?
  if Msg.lParam = WM_RBUTTONDOWN then
  begin
    SetForegroundWindow( Handle );
    GetCursorPos( p );
    MenuBandeja.Popup( p.x, p.y );
    PostMessage( Handle, WM_NULL, 0, 0 );
  end;
end;

El procedimiento WMSysCommand es el encargado de interceptar los mensajes del sistema que manda Windows a nuestra aplicación. En el caso de que el mensaje enviado sea SC_MINIMIZE minimizamos la ventana en la bandeja del sistema. Si es otro mensaje dejamos que Windows lo maneje (DefaultHandler).

El procedimiento Restaurar comprueba si ha pulsado el botón izquierdo del ratón sobre el icono de la bandeja del sistema para volver a mostrar nuestra ventana. Si pulsa el botón derecho llamará a nuestro menu contextual MenuBandeja.

Ahora creamos el procedimiento encargado de minimizar la ventana:

Código Delphi [-]
procedure TFPrincipal.Minimizar;
begin
  with IconData do
  begin
    cbSize := sizeof( IconData );
    Wnd := Handle;
    uID := 100;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage := WM_USER + 1;

    // Usamos de icono el mismo de la aplicación
    hIcon := Application.Icon.Handle;

    // Como Hint del icono, el nombre de la aplicación
    StrPCopy( szTip, Application.Title );
  end;

  // Ponemos el icono al lado del reloj
  Shell_NotifyIcon( NIM_ADD, @IconData );

  // Ocultamos el formulario
  Hide;
end;

Y por último el evento al pulsar la opción Mostrar en el menú contextual:
Código Delphi [-]
procedure TFPrincipal.MostrarClick( Sender: TObject );
begin
  // Volvemos a mostrar de nuevo el formulario
  FPrincipal.Show;
  ShowWindow( Application.Handle, SW_SHOW );

  // Eliminamos el icono de la bandeja del sistema
  Shell_NotifyIcon( NIM_DELETE, @IconData );
  IconData.Wnd := 0;
end;
Si alguien lo hace funcionar por favor diganmelo.
Saludos
Responder Con Cita
  #2  
Antiguo 08-03-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hay mas de un componente que ya encapsula esta funcionalidad. Por ejemplo, el TTrayIcon que viene de paquete con Delphi (a partir del 2005, si no estoy mal).

Si tu intención es hacerlo por vos mismo, mirá el código del componente y seguro le encontras el "How To".

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 12-03-2008
Avatar de Diavlo
Diavlo Diavlo is offline
Miembro
 
Registrado: dic 2005
Posts: 53
Poder: 19
Diavlo Va por buen camino
Pos lo mismo, por q no usar componentes como el TTrayIcon, q es muy facil de utilizar y hace todo eso q quieres q haga.
__________________
Todo el Mal Que Me Hagas A Ti Te Lo Haras
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Expulsar la bandeja de CD paldave Varios 5 01-09-2007 14:59:05
Problemas Minimizar icono barra sistema serhasae Varios 0 30-04-2006 14:04:49
Refrescar Bandeja del sistema...! quitar icono. Gelmin Windows 9 04-05-2004 16:51:50
Cerrar bandeja CDs JMGR Varios 6 27-07-2003 14:52:12
Icono aplicacion bandeja del sistema Azor69 Varios 3 22-07-2003 09:13:24


La franja horaria es GMT +2. Ahora son las 14:15:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi