Executar aplicção somente uma vez
Fiz esse código no meu .DPR, e sempre que rodo dá, dá a mensagem de que já existe uma aplicação rodando, quando na verdade é a primeira vez. Alguém sabe o devo fazer para a aplicação rodar somente uma vez?
Var HprevHist : HWND;
begin
Application.Initialize;
HprevHist := FindWindow(Nil, PChar(´DM_Principal´));
if HprevHist = 0 then
begin
Application.CreateForm(TDM_Principal, DM_Principal);
Application.CreateForm(TDM_PDV, DM_PDV);
Application.CreateForm(TFRM_Menu, FRM_Menu);
Application.CreateForm(TFrmAvisoEcf, FrmAvisoEcf);
Application.Run;
end else
MessageDlg(´Você não pode executar outra cópia do aplicativo´, mtInformation, [mbOK], 0);
end.
Paulo
Curtidas 0
Respostas
Catunda
04/04/2008
Vc testou com o projeto aberto no delphi?
Isso acontece comigo se eu tentar rodar o sistema e o projeto estiver aberto tb. É preciso ao menos fechar o form que vc está testando.
Isso acontece comigo se eu tentar rodar o sistema e o projeto estiver aberto tb. É preciso ao menos fechar o form que vc está testando.
GOSTEI 0
Paulo
04/04/2008
Continua não funcionar. Minha aplicaca se chama SAC_PDV, e os form criados no Auto Create são:
DM_Principal,
DM_PDV,
FRM_Menu,
FrmAvisoEcf
O que devo fazer então? Já coloquei pelo nome da aplicação, pelo nome dos forms, dou um Close All no delphi, para fechar tudo, mas ainda diz ou que já está rodando, ou então permite abrir várias vezes.
DM_Principal,
DM_PDV,
FRM_Menu,
FrmAvisoEcf
O que devo fazer então? Já coloquei pelo nome da aplicação, pelo nome dos forms, dou um Close All no delphi, para fechar tudo, mas ainda diz ou que já está rodando, ou então permite abrir várias vezes.
GOSTEI 0
Comodelphi
04/04/2008
Faça uma pesquisa no fórum sobre MUTEX.
GOSTEI 0
Rodc
04/04/2008
MUTEX é a melhor opção, pois ele avisa até se o programa estiver aberto em outra sessão do Windows.
GOSTEI 0
Catunda
04/04/2008
Experimente assim: Obseve o uso da variavel Hwnd e a forma do FindWindow
Var Hwnd : Thandle;
begin
Hwnd := FindWindow(´TDM_Principal´,nil);
if Hwnd>0 then
begin
ShowMessage(´O sistema já se encontra em execução !!´);
SetForeGroundWindow(Hwnd);
Application.Terminate;
end
else
begin
Application.Initialize;
Application.CreateForm(TDM_Principal, DM_Principal);
Application.CreateForm(TDM_PDV, DM_PDV);
Application.CreateForm(TFRM_Menu, FRM_Menu);
Application.CreateForm(TFrmAvisoEcf, FrmAvisoEcf);
Application.Run;
end;
end.
Var Hwnd : Thandle;
begin
Hwnd := FindWindow(´TDM_Principal´,nil);
if Hwnd>0 then
begin
ShowMessage(´O sistema já se encontra em execução !!´);
SetForeGroundWindow(Hwnd);
Application.Terminate;
end
else
begin
Application.Initialize;
Application.CreateForm(TDM_Principal, DM_Principal);
Application.CreateForm(TDM_PDV, DM_PDV);
Application.CreateForm(TFRM_Menu, FRM_Menu);
Application.CreateForm(TFrmAvisoEcf, FrmAvisoEcf);
Application.Run;
end;
end.
GOSTEI 0
Paulo
04/04/2008
Segui as sugestões acima e utilizei o MUTEX e gostei. Eu não o conhecia. Ele é prático, pois não depende de nome de janelas.
GOSTEI 0