Como nao abrir um sistema mais de uma vez ?
Alguem pode me passar uma rotina para que o usuario nao abra o sistema duas ou mais vezes, e que realmente funcione. Tenho usado algumas que se encontram nos DeplhiBoy, DeplhiMax, etc. mas nao funciona... O meu Delphi e´ o 5 Trial, e meu Windows é 95 (nos clientes tambem).
Diante mao ja´ agradeco as ajudas...
Diante mao ja´ agradeco as ajudas...
Adonis
Curtidas 0
Melhor post
Fabio.hc
09/11/2003
Tente assim:
program Project1;
uses
Forms,
..
..
..
{$R *.RES}
var
Handle: THandle;
begin
Handle := FindWindow(´TFrmPrincipal´, nil);
if Handle <> 0 then { Já está aberto }
begin
Application.MessageBox(´Este programa já está aberto.´, ´Programa já aberto´, MB_OK);
Exit;
end;
Application.Initialize;
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmConfirma, FrmConfirma);
Application.Run;
end.
GOSTEI 1
Mais Respostas
Adonis
09/11/2003
Fabio,
Esta e´ um dos exemplos que eu uso que nao da´ certo.
O meu esta´ assim:
{$R *.RES}
var
Hwnd: Thandle;
begin
Application.Title := ´Controle de Estoque´;
Application.HelpFile := ´´;
Hwnd := FindWindow(´FTelaPrin´,´TelaPrin´);
if Hwnd = 0 then begin
Application.Initialize;
FSplash := TFSplash.Create(application);
FSplash.Show;
FSplash.Update;
Application.CreateForm(TFTelaInic, FTelaInic);
Application.CreateForm(TFTelaPrin, FTelaPrin);
Application.CreateForm(TFSenha, FSenha);
Application.CreateForm(TDTabelas, DTabelas);
Application.Run;
end else begin
messagedlg(´O sistema já foi Inicializado!´,mtinformation,[mbok],0);
SetForegroundWindow(Hwnd);
end;
Ja´ tentei de tudo e nada. Mudo o TelaPrin para: FSenha, DTabelas, TelaInic, e nada. Use com ´nil´ como o seu exemplo e nada.
O meu sistema comeca com a TelaInic, que chama o Senha e depois para no TelaPrin. Observe que o Splash e´ carregado antes mesmo do TelaInic.
Agradeco alguma ajuda...
Esta e´ um dos exemplos que eu uso que nao da´ certo.
O meu esta´ assim:
{$R *.RES}
var
Hwnd: Thandle;
begin
Application.Title := ´Controle de Estoque´;
Application.HelpFile := ´´;
Hwnd := FindWindow(´FTelaPrin´,´TelaPrin´);
if Hwnd = 0 then begin
Application.Initialize;
FSplash := TFSplash.Create(application);
FSplash.Show;
FSplash.Update;
Application.CreateForm(TFTelaInic, FTelaInic);
Application.CreateForm(TFTelaPrin, FTelaPrin);
Application.CreateForm(TFSenha, FSenha);
Application.CreateForm(TDTabelas, DTabelas);
Application.Run;
end else begin
messagedlg(´O sistema já foi Inicializado!´,mtinformation,[mbok],0);
SetForegroundWindow(Hwnd);
end;
Ja´ tentei de tudo e nada. Mudo o TelaPrin para: FSenha, DTabelas, TelaInic, e nada. Use com ´nil´ como o seu exemplo e nada.
O meu sistema comeca com a TelaInic, que chama o Senha e depois para no TelaPrin. Observe que o Splash e´ carregado antes mesmo do TelaInic.
Agradeco alguma ajuda...
GOSTEI 0
Koplin
09/11/2003
Usar um Mutex é mais eficiente.
Dá uma olhada neste dpr:
program Project1;
uses//acrescente as q não tiverem no seu
Forms, SysUtils, Windows, Classes, Dialogs,
Unit1 in ´Unit1.pas´ ;
var aMutex:THandle;//crie esta var...
{$R *.res}
begin //aqui qqr identificação
amutex:=OpenMutex(MUTEX_ALL_ACCESS,False,´ABCDEF123´);
If aMutex = 0 then begin//aqui =acima
aMutex:=CreateMutex(nil,false,´ABCDEF123´);
//só avança se não houver outro aberto...
Application.Initialize;//trecho original
Application.CreateForm(TForm1, Form1);
Application.Run;
end else //acrescente...
ShowMessage(´Já estou no ar!´);
end.
Dá uma olhada neste dpr:
program Project1;
uses//acrescente as q não tiverem no seu
Forms, SysUtils, Windows, Classes, Dialogs,
Unit1 in ´Unit1.pas´ ;
var aMutex:THandle;//crie esta var...
{$R *.res}
begin //aqui qqr identificação
amutex:=OpenMutex(MUTEX_ALL_ACCESS,False,´ABCDEF123´);
If aMutex = 0 then begin//aqui =acima
aMutex:=CreateMutex(nil,false,´ABCDEF123´);
//só avança se não houver outro aberto...
Application.Initialize;//trecho original
Application.CreateForm(TForm1, Form1);
Application.Run;
end else //acrescente...
ShowMessage(´Já estou no ar!´);
end.
GOSTEI 0
Valdir.santos
09/11/2003
Ou tenta assim:
{$R *.res}
var Hwnd : THandle;
begin
Hwnd := FindWindow(´TApplication´, ´Sistema de Protocolo´);
if Hwnd = 0 then begin
Application.Initialize;
frmSplash := TFrmSplash.Create(Application);
frmSplash.Show;
frmSplash.Refresh;
Application.Title := ´Sistema de Protocolo´;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.Run;
SetForegroundWindow(Hwnd);
end
else begin
ShowMessage(´Programa já está sendo executado´);
SetForegroundWindow(Hwnd);
end;
end.
{$R *.res}
var Hwnd : THandle;
begin
Hwnd := FindWindow(´TApplication´, ´Sistema de Protocolo´);
if Hwnd = 0 then begin
Application.Initialize;
frmSplash := TFrmSplash.Create(Application);
frmSplash.Show;
frmSplash.Refresh;
Application.Title := ´Sistema de Protocolo´;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.Run;
SetForegroundWindow(Hwnd);
end
else begin
ShowMessage(´Programa já está sendo executado´);
SetForegroundWindow(Hwnd);
end;
end.
GOSTEI 0
Drix
09/11/2003
vasculhe na Net por componentes cool. entre eles vc ira encontrar o componente coolOne.
Apenas coloque-o em seu form principal e configure. Ele exibe uma mensagem caso tente abrir o aplicativo mais de uma vez ou simplesmente ativa e coloca o mesmo em primeiro plano.
Tente localizar em: [url]www.superdownloads.com.br[/url].
Ate mais....
DRIx
Apenas coloque-o em seu form principal e configure. Ele exibe uma mensagem caso tente abrir o aplicativo mais de uma vez ou simplesmente ativa e coloca o mesmo em primeiro plano.
Tente localizar em: [url]www.superdownloads.com.br[/url].
Ate mais....
DRIx
GOSTEI 0
Beppe
09/11/2003
Usar um Mutex é mais eficiente.
Dá uma olhada neste dpr:
program Project1;
uses//acrescente as q não tiverem no seu
Forms, SysUtils, Windows, Classes, Dialogs,
Unit1 in ´Unit1.pas´ ;
var aMutex:THandle;//crie esta var...
{$R *.res}
begin //aqui qqr identificação
amutex:=OpenMutex(MUTEX_ALL_ACCESS,False,´ABCDEF123´);
If aMutex = 0 then begin//aqui =acima
aMutex:=CreateMutex(nil,false,´ABCDEF123´);
//só avança se não houver outro aberto...
Application.Initialize;//trecho original
Application.CreateForm(TForm1, Form1);
Application.Run;
end else //acrescente...
ShowMessage(´Já estou no ar!´);
end.
Mesmo usando mutexes, será preciso chamar FindWindow para trazer o sistema para frente...
Ataliba
GOSTEI 0
Adonis
09/11/2003
Agradeco a todas as ajudas acima. Vou estuda-las...
GOSTEI 0