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.
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:
Figura 1: TNotifyIconData
Um grande abraço e até o próximo artigo.
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 .
2 COMENTÁRIOS
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?
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



