Como executar um programa apenas uma vez.
Ae, já vi isso em algum lugar aki do fórum, mas não encontrei o tópico... :cry:
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.
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
Curtidas 0
Respostas
Lucas Silva
19/02/2004
var handle : integer;
{$R *.RES}
begin
Application.Initialize;
Handle := FindWindow(´TfrmPrincipal´, nil);
if Handle > 0 then
begin
{ Já está aberto }
end;GOSTEI 0
Tenil
19/02/2004
Lucas, valew, mas ainda estou com dificuldades, alguém poderia ser mais detalhado???
Ou então me explicar este código?
O que está acontecendo agora e que o programa não abre de jeito nenhum.
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
Lucas Silva
19/02/2004
No Source (project -> view source) do seu programa vc coloca
Deu pra entender melhor?
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
Tenil
19/02/2004
Lucas, entendi melhor, porém, ainda estou com problemas.
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?
No evento OnCreate do FormPrincipal:
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.
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
Lucas Silva
19/02/2004
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
Tenil
19/02/2004
FUNCIONOU!
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
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
Cebikyn
19/02/2004
Coloque exatamente assim no seu DPR, deve resolver seu problema:
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
Tenil
19/02/2004
Yes, funcionou, vc poderia me explicar estas linhas?
Se não for abusade d+, claro!
Obrigado a todos.
CreateMutex(nil, True, ´XyZzWw´); if GetLastError = ERROR_ALREADY_EXISTS then Exit;
Se não for abusade d+, claro!
Obrigado a todos.
GOSTEI 0
Cebikyn
19/02/2004
[b:0da2073ed5]CreateMutex:[/b:0da2073ed5] Cria um Mutex (´XyZzWw´, mas vc pode por qq texto, desde que seja único), que o Windows vai guardar até que seu programa seja finalizado.
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;).
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