Fórum Como executar um programa apenas uma vez. #215483

19/02/2004

0

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.


Tenil

Tenil

Responder

Posts

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;



Responder

Gostei + 0

19/02/2004

Tenil

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.


Responder

Gostei + 0

19/02/2004

Lucas Silva

No Source (project -> view source) do seu programa vc coloca
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?


Responder

Gostei + 0

20/02/2004

Tenil

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?

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.


Responder

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..


Responder

Gostei + 0

20/02/2004

Tenil

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


Responder

Gostei + 0

20/02/2004

Cebikyn

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.



Responder

Gostei + 0

20/02/2004

Tenil

Yes, funcionou, vc poderia me explicar estas linhas?

CreateMutex(nil, True, ´XyZzWw´); 
if GetLastError = ERROR_ALREADY_EXISTS then 
  Exit; 


Se não for abusade d+, claro!

Obrigado a todos.


Responder

Gostei + 0

20/02/2004

Cebikyn

[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;).


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar