Ir ao conteúdo

fechar automaticamente popupmenu


Diron Donadel

Posts recomendados

Postado

olá pessoal boa tarde, minha aplicação roda no tray do windows pa ali do lado do relógio e tem um PopupMenu menu que quando eu clico no icone com o botão direito do mouse nele, ele abre só que não fecha quando eu clico fora ele fica ali sabem como fazer pra ele fechar sozinho ?

Postado

Cara eu tenho uma aplicação que usa o ícone no SysTray (barra ao lado do relógio) e aqui se eu clicar fora do pop-up ele fecha o pop-up automaticamente.

Vou postar o meu código aqui e compare com o seu pra ver se há alguma diferença.

Obs.:

- O pop-up deve ser adicionado ao Form na propriedade "PopupMenu" do form em questão através do Object Inspector.

Código:


unit U_Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ShellApi;

const
WM_TRAYICON = WM_USER+1;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
p_Restaurar: TMenuItem;
p_Sair: TMenuItem;
procedure p_RestaurarClick(Sender: TObject);
procedure p_SairClick(Sender: TObject);
private
{ Private declarations }
NotifyIconData: TNotifyIconData;
procedure WMSysCommand(var Msg: TWMSysCommand); Message WM_SysCommand;
procedure WMTrayIcon(var Msg: TMessage); Message WM_TRAYICON;
procedure CriaIcone();
procedure DestroyIcone();
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}
//----------------------------------------------------------------------------//
// CONTROLE DA APLICAÇÃO POR ÍCONE NA BARRA DO RELÓGIO //
//----------------------------------------------------------------------------//
procedure TForm1.CriaIcone();
var
NotifyIconData: TNotifyIconData;
begin
with NotifyIconData do
begin
cbSize:= SizeOf(TNotifyIconData);
Wnd:= Form1.Handle;
uID:= 0;
uCallbackMessage:= WM_TRAYICON;
uFlags:= NIF_ICON or NIF_TIP or NIF_MESSAGE;
hIcon:= Application.Icon.Handle;
szTip:= 'Aplicação rodando no SysTray';
end;
Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
Application.ShowMainForm:= False;
end;

procedure TForm1.DestroyIcone();
begin
NotifyIconData.cbSize:= SizeOf(TNotifyIconData);
NotifyIconData.Wnd:= Self.Handle;
NotifyIconData.uID:= 0;
NotifyIconData.uFlags:= 0;
Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
case (Msg.CmdType) of
SC_MINIMIZE: begin
Form1.Visible:= False;
CriaIcone();
end;
SC_CLOSE: begin
Self.Visible:= False;
CriaIcone();
end;
SC_RESTORE: Form1.Visible:= True;
SC_MAXIMIZE: Form1.Visible:= True;
else
Inherited
end;
end;

procedure TForm1.WMTrayIcon(var Msg: TMessage);
var
Pt: TPoint;
begin
if(Msg.LParam = WM_RBUTTONDOWN)then //click com botao direito do mouse
begin
{abre o pop-up}
GetCursorPos(Pt);
SetForegroundWindow(Handle);
PopupMenu.Popup(Pt.X, Pt.Y);
PopupMenu.AutoPopup:= False;
PostMessage(Handle, WM_NULL, 0, 0);
end
else
begin
if(Msg.LParam = WM_LBUTTONDBLCLK)then //click duplo com botao esquerdo do mouse
begin
Form1.Visible:= True;
DestroyIcone();
end;
end;
end;

procedure TForm1.p_RestaurarClick(Sender: TObject); //botao "restaurar" do popup
begin
Form1.Visible:= True;
DestroyIcone();
end;

procedure TForm1.p_SairClick(Sender: TObject); //botao "sair" do popup
begin
DestroyIcone();
Application.ProcessMessages;
Application.Terminate;
end;
// FIM DO CONTROLE DA APLICAÇÃO POR ÍCONE //
//----------------------------------------------------------------------------//

end.

Postado
Cara eu tenho uma aplicação que usa o ícone no SysTray (barra ao lado do relógio) e aqui se eu clicar fora do pop-up ele fecha o pop-up automaticamente.

Vou postar o meu código aqui e compare com o seu pra ver se há alguma diferença.

Obs.:

- O pop-up deve ser adicionado ao Form na propriedade "PopupMenu" do form em questão através do Object Inspector.

Código:


unit U_Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ShellApi;

const
WM_TRAYICON = WM_USER+1;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
p_Restaurar: TMenuItem;
p_Sair: TMenuItem;
procedure p_RestaurarClick(Sender: TObject);
procedure p_SairClick(Sender: TObject);
private
{ Private declarations }
NotifyIconData: TNotifyIconData;
procedure WMSysCommand(var Msg: TWMSysCommand); Message WM_SysCommand;
procedure WMTrayIcon(var Msg: TMessage); Message WM_TRAYICON;
procedure CriaIcone();
procedure DestroyIcone();
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}
//----------------------------------------------------------------------------//
// CONTROLE DA APLICAÇÃO POR ÍCONE NA BARRA DO RELÓGIO //
//----------------------------------------------------------------------------//
procedure TForm1.CriaIcone();
var
NotifyIconData: TNotifyIconData;
begin
with NotifyIconData do
begin
cbSize:= SizeOf(TNotifyIconData);
Wnd:= Form1.Handle;
uID:= 0;
uCallbackMessage:= WM_TRAYICON;
uFlags:= NIF_ICON or NIF_TIP or NIF_MESSAGE;
hIcon:= Application.Icon.Handle;
szTip:= 'Aplicação rodando no SysTray';
end;
Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
Application.ShowMainForm:= False;
end;

procedure TForm1.DestroyIcone();
begin
NotifyIconData.cbSize:= SizeOf(TNotifyIconData);
NotifyIconData.Wnd:= Self.Handle;
NotifyIconData.uID:= 0;
NotifyIconData.uFlags:= 0;
Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
case (Msg.CmdType) of
SC_MINIMIZE: begin
Form1.Visible:= False;
CriaIcone();
end;
SC_CLOSE: begin
Self.Visible:= False;
CriaIcone();
end;
SC_RESTORE: Form1.Visible:= True;
SC_MAXIMIZE: Form1.Visible:= True;
else
Inherited
end;
end;

procedure TForm1.WMTrayIcon(var Msg: TMessage);
var
Pt: TPoint;
begin
if(Msg.LParam = WM_RBUTTONDOWN)then //click com botao direito do mouse
begin
{abre o pop-up}
GetCursorPos(Pt);
SetForegroundWindow(Handle);
PopupMenu.Popup(Pt.X, Pt.Y);
PopupMenu.AutoPopup:= False;
PostMessage(Handle, WM_NULL, 0, 0);
end
else
begin
if(Msg.LParam = WM_LBUTTONDBLCLK)then //click duplo com botao esquerdo do mouse
begin
Form1.Visible:= True;
DestroyIcone();
end;
end;
end;

procedure TForm1.p_RestaurarClick(Sender: TObject); //botao "restaurar" do popup
begin
Form1.Visible:= True;
DestroyIcone();
end;

procedure TForm1.p_SairClick(Sender: TObject); //botao "sair" do popup
begin
DestroyIcone();
Application.ProcessMessages;
Application.Terminate;
end;
// FIM DO CONTROLE DA APLICAÇÃO POR ÍCONE //
//----------------------------------------------------------------------------//

end.

cara valeu mesmo teu código ajudou pra caramba eram só duas linhas que estavam faltando no meu mesmo haha valeu mesmo flws abraço

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!