Como abir aplicação somente uma vez
Bom dia estou usando este código, mas ao rodar a aplicação de cara já aparece a mensagem: 'O Sistema já está aberto!aberto'. Mas não está.
Estou querendo que ele informe se a aplicação já estiver aberta e que carregue ela após dar OK.
Alguém poderia dar uma dica? Ou tem alguma maneira mais fácil de se fazer isso.
Uso Win7 e WinXp com Delphi 2010, Firebird 2.1
program Vendas;
uses
Forms,
Windows,
Dialogs,
uPrincipal in 'uPrincipal.pas' ,
uDMPrincipal in 'uDMPrincipal.pas' {DM: TDataModule},
uModeloCadastro in 'uModeloCadastro.pas' ;
{$R *.res}
var
HprevHist: HWND;
begin
Application.Initialize;
// Evita carga dupla da aplicação
begin
HprevHist:= FindWindow(Nil, PChar('Vendas'));
if HprevHist <> 0 then
begin
ShowMessage('O Sistema já está aberto!');
Application.Terminate;
ShowWindow(HprevHist,SW_NORMAL);
Exit;
end;
end;
Application.MainFormOnTaskbar := True;
Application.Title := 'Sistema de Vendas';
Application.CreateForm(TDM, DM);
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.CreateForm(TfrmModelo, frmModelo);
Application.Run;
end.
Adilson Rumao
Curtidas 0
Respostas
Eliel Martins
22/06/2011
Olá Rumão
No .dpr você pode fazer da seguinte forma :
Dessa forma você consegue controlar se o sistema já está sendo executado.
Espero ter ajudado.
Eliel G. Martins
No .dpr você pode fazer da seguinte forma :
var
HprevHist : HWND;
Begin
frmSplash := TfrmSplash.Create(Application);
frmSplash.Show;
frmSplash.Update;
sleep(5);
HprevHist := FindWindow(Nil, PChar('NOME_SISTEMA'));
if HprevHist = 0 then begin
Application.Title := 'NOME_SISTEMA';
frmSplash.Hide;
frmSplash.Close;
frmSplash.Free;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.Run;
end else
Application.MessageBox(Pchar('O Aplicativo já esta sendo Executado '), 'Erro.', MB_ICONERROR);
end.
Dessa forma você consegue controlar se o sistema já está sendo executado.
Espero ter ajudado.
Eliel G. Martins
GOSTEI 0
Adilson Rumao
22/06/2011
Então Eliel desde já muito obrigado pela ajuda. Fiz algumas alterações no meu projeto e deixei assim:
Mas quando executo ele, de cara vem a mensagem ('Sistema já está em execução!'), e não abre o projeto.
program Vendas;
uses
Forms,
Windows, Messages,
uPrincipal in 'uPrincipal.pas' ,
uDMPrincipal in 'uDMPrincipal.pas' {DM: TDataModule},
uModeloCadastro in 'uModeloCadastro.pas' ;
{$R *.res}
var
HprevHist : HWND;
begin
HprevHist := FindWindow(Nil, PChar('Vendas'));
if HprevHist = 0 then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'Sistema de Vendas';
Application.CreateForm(TDM, DM);
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.CreateForm(TfrmModelo, frmModelo);
Application.Run;
end else
Application.MessageBox(Pchar('Sistema já está em execução!'), 'Erro', MB_ICONERROR);
end.
GOSTEI 0
Leandro Carvalho
22/06/2011
Cara, use o componente TabfOneInstance do pacote de componentes do abf.
Inclusive na Revista Clube Delphi Ed. 43 tem um artigo sobre ele.
Inclusive na Revista Clube Delphi Ed. 43 tem um artigo sobre ele.
GOSTEI 0
Marco Salles
22/06/2011
Outra boa opção é Mutex ... Ta cheio de tópicos semelhantes sobre Mutex para impedir duas instancias do mesmo
aplicativo rodando na máquina .. Mutex
aplicativo rodando na máquina .. Mutex
GOSTEI 0
Adilson Rumao
22/06/2011
Valeu galera pelas dicas. Estou usando assim:
Está funcionando, a única coisa é que ele não abre a instância que já está aberta, ele dá a mensagem normalmente. Só não consegui resolver isso.
var
MutexHandle: THandle;
hwind:HWND;
begin
MutexHandle:= CreateMutex(nil,True,AppVendas);
if MutexHandle 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0,Sistema aberto em outra Janela!,,mb_IconHand);
CloseHandle(MutexHandle);
hwind:=0;
repeat
hwind:= Windows.FindWindowEx(0,hwind,TApplication,AppVendas);
until(hwindApplication.Handle);
if (hwind0) then
begin
Windows.ShowWindow(hwind,SW_SHOWNORMAL);
Windows.SetForegroundWindow(hwind);
end;
Halt;
end
end;
Está funcionando, a única coisa é que ele não abre a instância que já está aberta, ele dá a mensagem normalmente. Só não consegui resolver isso.
GOSTEI 0
José
22/06/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0