Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   colocar en la barra de tareas la aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=49728)

yack99281588 28-10-2007 14:42:05

colocar en la barra de tareas la aplicacion
 
hola amigos, deseo hacer que cuando se ejecute mi aplicación se coloque en la barra de tareas y al hacer doble click en el icono de esta se espanda y al cerrarla se vuelva a colocar en la barra de tareas. Gracias por su valiosa ayuda.

xEsk 28-10-2007 15:05:49

Hola, si usas una versión de Delphi moderna (mas nueva que un D7), tienes el componente TTrayIcon que realiza lo que pides. Pero si tienes una versión sin el componente TTrayIcon puedes buscar en Google por TrayIcon.

Un ejemplo.

Saludos.

Lonidas 28-10-2007 16:05:07

Hola puede que esto te sirva si no conseguis un componente

Sacado de Trucomania.

Objetivo:
Lograr hacer que nuestra aplicación, en lugar de minimizarse, se oculte, colocando un icono en la bandeja del sistema (si, ahí abajo, junto al reloj de Windows), y claro, que una vez hecho
esto, el icono reaccione a la pulsación del boton derecho del ratón mostrando un menú para poder, por ejemplo, restaurar nuestra aplicación.

-Necesitaremos un PopUpMenu en nuestra form, que será el que sea invocado cuando pulsemos sobre el icono de la bandeja del sistema, así que vete haciendote uno y lo llamas
PopUpMenu1.
-Dentro de ese menú, pondremos una opcion llamada Abrir que será la que restaure la aplicación.
-Necesitarás añadir 'ShellApi' en el uses de tu form para que entienda bien la estructura que maneja el icono.
-Para colocar el icono, necesitamos usar una estructura de tipo TNotifyIconData, así que declarate una en el private de tu form. En el ejemplo la he llamado IconData:
Código Delphi [-]
   private
    IconData : TNotifyIconData;

-Bien, ahora necesitamos hacer algún invento que nos permita detectar cuando es minimizada la form.
Usaremos la técnica del truco:

[102] - Ejecutar algo ANTES de que tu aplicacion sea minimizada

ya que nos viene de cine.
Se trata de capturar un mensaje, así que, ponemos la declaración correspondiente en el private de la form:

Código Delphi [-]
  private
    IconData : TNotifyIconData;
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;

y su correspondiente procedure en la parte implementation:


Código Delphi [-]
 
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin 
  if (Msg.CmdType = SC_MINIMIZE) then 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 aplicacion}
      {We use the same icon as the application}
      hIcon := Application.Icon.Handle;
      {Como Hint del icono, el nombre de la aplicacion}
      {The name of te app for the hint of the icon}
      StrPCopy(szTip, Application.Title);
    end; 
    {Ponemos el icono al lado del reloj}
    {Place the icon next to the clock}
    Shell_NotifyIcon(NIM_ADD, @IconData);
    {Ocultamos la Form...}
    {Hide the form...}
    Hide;
  end else DefaultHandler(Msg);
end;

Como ves, lo que hago dentro de la procedure del mensaje es rellenar la estructura del icono, para lo cual, uso el icono y el nombre de la aplicacion, y luego lo coloco en la bandeja del
sistema con la llamada al Api :

Código Delphi [-]
 Shell_NotifyIcon(NIM_ADD, @IconData);


-Hasta aqui hemos logrado que en lugar de minimizarse, nuestra aplicación se oculte y coloque su icono en la bandeja del sistema. Ahora bien, necesitamos otro invento que nos permita
atender dicho icono. Lo haremos capturando otro mensaje: el WM_USER+1 que es el que le hemos dicho al icono que nos mande cuando el usuario lo pinche.
Así que vamos allá, declaración en la private de la form:

Código Delphi [-]
procedure Espabila(var Msg : TMessage); message WM_USER+1;

y procedure correspondiente en la implementation:

Código Delphi [-]
 
procedure TForm1.Espabila(var Msg : TMessage);
{Aqui se recibe la pulsacion sobre el icono}
{Here we recieve the click on the icon}
var 
  p : TPoint;
begin 
  if Msg.lParam = WM_RBUTTONDOWN then begin 
    SetForegroundWindow(Handle);
    GetCursorPos(p);
    PopupMenu1.Popup(p.x, p.y);
    PostMessage(Handle, WM_NULL, 0, 0);
  end; 
end;
Como ves, en este mensaje lo que hacemos es dibujar el PopUpMenu1.

-Ahora vamos con la opcion Abrir del PopUpMenu1:

Código Delphi [-]
 
procedure TForm1.Abrir1Click(Sender: TObject);
begin 
  {Mostramos de nuevo la form}
  {We show the form again}
  Form1.Show;
  ShowWindow(Application.Handle, SW_HIDE);
  {Y nos cargamos el icono de la system tray}
  {Destroy the systray icon}
  Shell_NotifyIcon(NIM_DELETE, @IconData);
  IconData.Wnd:=0;
end;

En ella, lo que hacemos es, aparte de mostrar la form de nuevo, cargarnos el icono.
-Como siempre, al final deshacemos lo hecho antes de salir... así que en el evento OnDestroy de la form pondremos la siguiente linea:

Código Delphi [-]
 
procedure TForm1.FormDestroy(Sender: TObject);
begin 
  {Quitamos el icono (en el caso de haberlo puesto antes...)}
  {Take off the icon (in case of had placed it before.....)}
  if IconData.Wnd <> 0 then Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

El if distinto de cero tiene como misión el detectar si el icono fué o no puesto en la bandeja del sistema, para lograr así quitarlo sólo en el caso de haberlo colocado antes.


La franja horaria es GMT +2. Ahora son las 21:24:44.

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