Fórum Como executar um programa apenas uma vez. #215483
19/02/2004
0
Meu programa, ao ser iniciado, conecta-se ao banco de dados e abre algumas tabelas. Essa tarefa é um pouco demorada, uns 2 ou 3 segundos.
O usuário, impaciente, fica clicando no atalho várias vezes, ai abrem-se várias cópias do programa, gerando mais demora...
Como faço pra que, ao ser executado, antes de conectar-se ao BD, seja feita uma verificação para ver se o programa já está sendo executado, evitando, assim, que novas cópias sejam abertas?
Obrigado a todos.
Tenil
Curtir tópico
+ 0Posts
19/02/2004
Lucas Silva
var handle : integer;
{$R *.RES}
begin
Application.Initialize;
Handle := FindWindow(´TfrmPrincipal´, nil);
if Handle > 0 then
begin
{ Já está aberto }
end;Gostei + 0
19/02/2004
Tenil
Ou então me explicar este código?
O que está acontecendo agora e que o programa não abre de jeito nenhum.
Gostei + 0
19/02/2004
Lucas Silva
var handle : integer;
{$R *.RES}
begin
Application.Initialize;
//abre o projeto uma fez somente
Handle := FindWindow(´TfrmPrincipal´, nil); // esse frmPrincipal é o form MDI pai..... o principal do projeto....
if Handle > 0 then begin { Já está aberto }
end;
if IsWindowVisible(Handle) then begin
ShowWindow(Handle, SW_MAXIMIZE);
SetForegroundWindow(Handle);
Exit;
end;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.Run;
end. Deu pra entender melhor?
Gostei + 0
20/02/2004
Tenil
Vc poderia me tirar mais uma dúvida? É o seguinte: Meus formulários são criados na seguinte seqüência.
DataModule
FormPrincipal -> Este chama o FormLogin. O FormLogin, após sua execução é liberado Formlogin.free.
Vou posta o código original, para que vc possa me ajudar, ok?
program SecBrunelli;
uses
Forms,
Windows,
Dialogs,
Principal in ´Principal.pas´ ,
DataModule in ´DataModule.pas´ {DMPrincipal: TDataModule},
{ Mais alguns formulários... }
Login in ´..\comum\Login.pas´ ;
{$R *.RES}
begin
Application.Initialize;
Application.Title := ´Secretaria Dep. Brunelli´;
Application.CreateForm(TDMPrincipal, DMPrincipal);
Application.CreateForm(TFormPrincipal, FormPrincipal);
Application.Run;
end.No evento OnCreate do FormPrincipal:
FormLogin := TFormLogin.Create(Application); FormLogin.ShowModal; FormLogin.Free;
Mano, desculpe o incômodo, é que quero realmente APRENDER. Acho que a melhor forma de fazer isto é debatendo com colegas (e estudar também, claro!). :wink:
Mais uma vez, obrigado.
Gostei + 0
20/02/2004
Lucas Silva
program SecBrunelli;
uses
Forms,
Windows,
Dialogs,
Principal in ´Principal.pas´ ,
DataModule in ´DataModule.pas´ {DMPrincipal: TDataModule},
{ Mais alguns formulários... }
Login in ´..\comum\Login.pas´ ;
{$R *.RES}
begin
Application.Initialize;
Handle := FindWindow(´TFormPrincipal´, nil); if Handle > 0 then
begin { Já está aberto }
end;
if IsWindowVisible(Handle) then begin
ShowWindow(Handle, SW_MAXIMIZE);
SetForegroundWindow(Handle);
Exit;
end;
Application.Title := ´Secretaria Dep. Brunelli´;
Application.CreateForm(TDMPrincipal, DMPrincipal);
Application.CreateForm(TFormPrincipal, FormPrincipal);
Application.Run;
end.Tenta esse código ai, se não der certo me dá o toque que tem outro jeito..
Gostei + 0
20/02/2004
Tenil
Porém ainda tem um pequeno probleminha. :?
Depois que a pessoa loga, funciona normalmente, a janela é maximizada e pronto. Mas, quando ainda está na janela de login FormLogin ainda está abrindo outras cópias...
Valew
Gostei + 0
20/02/2004
Cebikyn
program SecBrunelli;
uses
Forms,
Windows,
Dialogs,
Principal in ´Principal.pas´ ,
DataModule in ´DataModule.pas´ {DMPrincipal: TDataModule},
{ Mais alguns formulários... }
Login in ´..\comum\Login.pas´ ;
{$R *.RES}
begin
CreateMutex(nil, True, ´XyZzWw´);
if GetLastError = ERROR_ALREADY_EXISTS then
Exit;
Application.Initialize;
Application.Title := ´Secretaria Dep. Brunelli´;
Application.CreateForm(TDMPrincipal, DMPrincipal);
Application.CreateForm(TFormPrincipal, FormPrincipal);
Application.Run;
end.Gostei + 0
20/02/2004
Tenil
CreateMutex(nil, True, ´XyZzWw´); if GetLastError = ERROR_ALREADY_EXISTS then Exit;
Se não for abusade d+, claro!
Obrigado a todos.
Gostei + 0
20/02/2004
Cebikyn
Saiba mais em:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createmutex.asp
[b:0da2073ed5]GetLastError:[/b:0da2073ed5] Vai verificar se ocorreu algum erro na criação do Mutex, no caso verifica se já existia (ERROR_ALREADY_EXISTIS), se já existia, então é porque seu programa está rodando, então paramos a execução do código de inicialização (Exit;).
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)