Como abir aplicação somente uma vez

Delphi

22/06/2011

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

Adilson Rumao

Curtidas 0

Respostas

Eliel Martins

Eliel Martins

22/06/2011

  Olá Rumão
 
  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

Adilson Rumao

22/06/2011

Então Eliel desde já muito obrigado pela ajuda. Fiz algumas alterações no meu projeto e deixei assim:  
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.
  Mas quando executo ele, de cara vem a mensagem ('Sistema já está em execução!'),  e não abre o projeto.
GOSTEI 0
Leandro Carvalho

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.
GOSTEI 0
Marco Salles

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
GOSTEI 0
Adilson Rumao

Adilson Rumao

22/06/2011

Valeu galera pelas dicas. Estou usando assim:
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é

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
POSTAR