DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 
DevWare  
Novidade: DevMedia lança o DevWare - Saiba mais!

Usando TNotifyIconData para colocar ícone na área de notificações – Firemonkey & Delphi XE2

Veja neste artigo como utilizar a clase TNotifyIconData no Delphi XE2 para colocar o ícone da aplicação na área de notificação do Windows (traybar). O Firemonkey veio com tudo e acredito profundamente que veio para ficar, mas como todo início é complicado, para esta ferramenta não poderia ser diferente. Ao utilizar esta ferramenta podemos sentir falta de alguns componentes não visuais que fazem grande falta.

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você gostaria de comentar o que não lhe agradou?

O Firemonkey veio com tudo e acredito profundamente que veio para ficar, mas como todo início é complicado, para esta ferramenta não poderia ser diferente. Ao utilizar esta ferramenta podemos sentir falta de alguns componentes não visuais que fazem grande falta. Um desses componentes é o TTrayIcon da VCL. Para quem não sabe, ele é o responsável por deixar o ícone da aplicação da área de notificação lá no canto inferior esquerdo perto da hora.

Para que possamos utilizar a classe TNotifyIconData em nossa aplicação, primeiramente devemos declarar em uses a cláusula “WinApi.ShellApi”.

Na seção private de seu formulário principal declare as seguintes variáveis e procedures:

Listagem 1: Declaração de variáveis e procedures

private
    { Private declarations }
   FIconShown: Boolean;
   FTrayIconData: TNotifyIconData;
   procedure ShowTrayIcon;
   procedure HideTrayIcon;
  • FIconShown é a variável responsável por informar se o ícone está no system tray ou não;
  • FTrayIcondata é o responsável pela criação do ícone na área de notificações;
  • ShowTrayIcon é o procedimento responsável por exibir o ícone na área de notificações;
  • HideTrayIcon é o procedimento responsável por ocultar o ícone na área de notificações;

Vamos, então, fazer a implementação do código de ShowTrayIcon:

Listagem 2: Implementação do método ShowTrayIcon

procedure TFrmPrincipal.ShowTrayIcon;
begin
  if not FIconShown then
  begin
    with FTrayIconData do
    begin
      uID := 1;
      Wnd :=  FmxHandleToHWND(self.Handle);
      cbSize := SizeOf;
      hIcon :=  GetClassLong(FmxHandleToHWND(self.Handle),GCL_HICONSM);
      uCallbackMessage := 0;
      uFlags := NIF_Icon OR NIF_Tip OR NIF_Message;
      StrPCopy(szTip, FrmPrincipal.Caption);
    end;
    Shell_NotifyIcon(NIM_ADD, @FTrayIconData);
    FIconShown := True;
  end;
end;

Vamos, então, falar um pouco sobre cada uma das propriedades do TNotifyIconData:

  • uID - é a propriedade de identificação do ícone;
  • Wnd - é a propriedade que se refere à janela do aplicativo;
  • cbSize - representa o tamanho do ícone;
  • hIcon - é o ícone propriamente dito. Através da função GetClassLong pegamos o ícone do próprio aplicativo.
  • uCallbackMessage - é a propriedade utilizada para saber qual evento que o mouse está disparando sobre o ícone;
  • uFlags - essa propriedade que valida a propriedade uCallbackMessage com NIF_Message, valida o ícone com NIF_Icon e valida o texto do ícone com NIF_Tip;
  • szTip - é o título do ícone;
  • Shell_NotifyIcon - é a função responsável pela criação (NIM_ADD) do ícone, exclusão (NIM_DELETE) e modificação do ícone (NIM_MODIFY);

No evento OnCreate do formulário principal, chame o procedimento acima:

Listagem 3: Evento OnCreate do form principal

ShowTrayIcon;

Vamos, agora, fazer a implementação de HideTrayIcon:

Listagem 4: Implementação do método HideTrayIcon

procedure TFrmPrincipal.HideTrayIcon;
begin
  if FIconShown then
  begin
    Shell_NotifyIcon(NIM_DELETE, @FTrayIconData);
    FIconShown := False;
  end;
end;

No evento OnDestroy do formulário principal, chame o procedimento acima:

Listagem 5: Evento OnDestroy do form principal

HideTrayIcon;

Rode sua aplicação e terá o seguinte resultado:

 TNotifyIconData

Figura 1: TNotifyIconData

Um grande abraço e até o próximo artigo.


Rafael Ribeiro
Sou Engenheiro de Produção formado na Universidade Federal Fluminense e trabalho como Coordenador de TI em um dos módulos de uma das maiores montadoras de Caminhões e Ônibus do Brasil. Trabalho com desenvolvimento Desktop em Delphi 2010 / XE2 .
O que você achou deste post?

    2 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Cleber Nandi
Muito legal o post, mas está dando o seguinte erro no meu:

Checking project dependencies...
Compiling Project1.dproj (Debug, Win32)
dcc command line for "Project1.dpr"
c:\program files\embarcadero\rad studio\9.0\bin\dcc32.exe -$O- -$W+ --no-config -M -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;
Generics.Defaults=System.Generics.Defaults;WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG -E.\Win32\Debug
-I"c:\program files\embarcadero\rad studio\9.0\lib\Win32\release";"C:\Users\Nandi\Documents\RAD Studio\9.0\Imports";"c:\program files\embarcadero\rad
studio\9.0\Imports";"C:\Users\Public\Documents\RAD Studio\9.0\Dcp";"c:\program files\embarcadero\rad studio\9.0\include";"C:\Program
Files\FastReports\LibD16";"c:\program files\embarcadero\rad studio\9.0\RaveReports\Lib";"C:\Program Files\Raize\CS5\Lib\RS-XE2\Win32"
-LE"C:\Users\Public\Documents\RAD Studio\9.0\Bpl" -LN"C:\Users\Public\Documents\RAD Studio\9.0\Dcp" -N0.\Win32\Debug -NSWinapi;System.Win;Data.Win;
Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap; -O"c:\program files\embarcadero\rad studio\9.0\lib\Win32\release";
"C:\Users\Nandi\Documents\RAD Studio\9.0\Imports";"c:\program files\embarcadero\rad studio\9.0\Imports";"C:\Users\Public\Documents\RAD
Studio\9.0\Dcp";"c:\program files\embarcadero\rad studio\9.0\include";"C:\Program Files\FastReports\LibD16";"c:\program files\embarcadero\rad
studio\9.0\RaveReports\Lib";"C:\Program Files\Raize\CS5\Lib\RS-XE2\Win32" -R"c:\program files\embarcadero\rad studio\9.0\lib\Win32\release";
"C:\Users\Nandi\Documents\RAD Studio\9.0\Imports";"c:\program files\embarcadero\rad studio\9.0\Imports";"C:\Users\Public\Documents\RAD
Studio\9.0\Dcp";"c:\program files\embarcadero\rad studio\9.0\include";"C:\Program Files\FastReports\LibD16";"c:\program files\embarcadero\rad
studio\9.0\RaveReports\Lib";"C:\Program Files\Raize\CS5\Lib\RS-XE2\Win32" -U"c:\program files\embarcadero\rad studio\9.0\lib\Win32\release";
"C:\Users\Nandi\Documents\RAD Studio\9.0\Imports";"c:\program files\embarcadero\rad studio\9.0\Imports";"C:\Users\Public\Documents\RAD
Studio\9.0\Dcp";"c:\program files\embarcadero\rad studio\9.0\include";"C:\Program Files\FastReports\LibD16";"c:\program files\embarcadero\rad
studio\9.0\RaveReports\Lib";"C:\Program Files\Raize\CS5\Lib\RS-XE2\Win32" -V -VN -NB"C:\Users\Public\Documents\RAD Studio\9.0\Dcp"
-NH"C:\Users\Public\Documents\RAD Studio\9.0\hpp" -NO.\Win32\Debug Project1.dpr
[DCC Error] Unit1.pas(59): E2003 Undeclared identifier: 'FmxHandleToHWND'
[DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'GetClassLong'
[DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'GCL_HICONSM'
[DCC Error] Unit1.pas(64): E2003 Undeclared identifier: 'FrmPrincipal'
[DCC Error] Unit1.pas(64): E2250 There is no overloaded version of 'StrPCopy' that can be called with these arguments
[DCC Error] Unit1.pas(69): E2029 '.' expected but ';' found
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Failed
Elapsed time: 00:00:00.4

Bem nessa linda:

Wnd := FmxHandleToHWND(self.Handle);
cbSize := SizeOf;
hIcon := GetClassLong(FmxHandleToHWND(self.Handle),GCL_HICONSM);
uCallbackMessage := 0;
uFlags := NIF_Icon OR NIF_Tip OR NIF_Message;
StrPCopy(szTip, FrmPrincipal.Caption);

O que será?

Obrigado!

E se fosse no delphixe2 application, nao firemonkey?
[há +1 mês] - Responder

 

[autor] Rafael Ribeiro
Olá... fico muito feliz pela sua tentativa. Vamos lá, tratar cada erro que deu no seu aplicativo e certamente dará em quem tentar. Eu deixei de colocar no artigo algumas units que devem ser declaradas em Uses.
Então, vamos lá...

1) declare em uses: FMX.Platform.Win, Winapi.Windows, System.SysUtils.

> FMX.Plataform - será responsável pelo tratamento do erro de FmxHandleToHWND;

> Winapi.Windows - será responsável pelo tratamento do erro de GetClassLon, GCL_HICONSM;

> System.SysUtils - será responsável pelo tratamento do erro de StrPCopy;

2)Para criar um aplicativo em firemonkey você deve ir em File | New | Firemonkey HD Form - Delphi. Você criou apenas uma unit que foi salva em unit.pas. Somente a unit não funcionará. Crie o Formulário HD de Firemonkey salve na pasta como uFrmPrincipal.pas e depois mude a propriedade Name do formulário para FrmPrincipal.

3)Para a VCL Application acredito que o código acima possa até funcionar, mas recomendo que utilize o componente TTrayIcon e TApplicationEvents que necessitam de muito menos código para realizar a mesma tarefa do artigo acima.

Espero ter ajudado! Um grande abraço!

Rafael M. Ribeiro
[há +1 mês] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
[Fechar] Você precisa estar logado para dar seu feedback.

Clique aqui para efetuar o login

Caso não tenha um cadastro DevMedia, clique aqui para se cadastrar (gratuito)
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03