Abrir somente uma vez a aplicação
15/05/2003
0
Evitar que o usuário abra a aplicação 2 vezes, ou seja, se ele tentar acionar pela 2ª vez a aplicação, o sistema deve dar uma mensagens dizendo que o sistema já está em execução....
Fico no aguardo..
Att.
Carlão
Mosquetama
Post mais votado
15/05/2003
CreateMutex(nil, False, ´VertigoTI.Vendas´);
If GetLastError = ERROR_ALREADY_EXISTS Then
Begin
MessageBox(0, ´Este programa já está sendo executado.´, ´Vertigo TI´, MB_ICONSTOP);
Halt(0);
End;
Comodelphi
Mais Posts
15/05/2003
Carnette
Se você quiser executar uma única copia do aplicativo, o código de inicializacao do arquivo fonte do PROJETO pode ser escrito conforme segue:
program Project1;
uses
Forms,
Windows,
Dialogs,
Unit1 in ´Unit1.pas´ ;
{$R *.RES}
Var HprevHist : HWND;
begin
Application.Initialize;
HprevHist := FindWindow(Nil, PChar(´TheProgrammer´));
if HprevHist = 0 then begin
Application.Title := ´TheProgrammer´;
Application.CreateForm(TForm1, Form1);
Application.Run;
end else
MessageDlg(´Você não pode executar outra cópia do aplicativo´, mtInformation, [mbOK], 0);
Com esse código o usuário pode iniciar uma nova copia do aplicativo somente se não houver outra anterior. Caso contrario é exibido uma mensagem para o usuário.
15/05/2003
By Alemão
Hwnd: THandle;
begin
Hwnd := FindWindow(´TxConsultas´, ´EasyList´);
if Hwnd = 0 then
begin
Application.Initialize;
Application.Title := ´Easy List - Celulose Irani´;
Application.CreateForm(TxConsultas, xConsultas);
Application.CreateForm(TxDescricao, xDescricao);
Application.Run;
end
else
begin
MessageDlg (´Este programa já esta sendo executado!!!´,mtinformation,[mbok], 0);
SetForegroundWindow (Hwnd);
end;
end.
tem q ser no DPR.....
16/05/2003
Dcport
1) O terceiro parâmetro da chamada a CreateMutex é o nome do mutex. Mude-o para algum nome que faça sentido para o seu aplicativo, e que seja pouco provável de ser usado também por outro programa (repare que ele usa o nome da empresa e o nome do programa separados por ponto; é uma boa fórmula).
2) Como está mostrado, o código não desaloca o mutex criado quando detecta que ele outra instância está rodando. Apesar de o mutex já existir, o handle que CreateMutex retorna é único para a sua aplicação e precisa ser destruído com uma chamada a CloseHandle. O código mais correto seria:
var MutexHnd: Cardinal;
...
MutexHnd := CreateMutex(nil, False, ´VertigoTI.Vendas´);
If GetLastError = ERROR_ALREADY_EXISTS Then
Begin
MessageBox(...);
CloseHandle(MutexHnd);
Halt(0);
End;
...
Obs. o mutex também precisa ser destruído caso outra instância do programa não esteja rodando. Pode-se colocar a chamada a CloseHandle no fim do bloco inicial do programa.
-- dcport
Clique aqui para fazer login e interagir na Comunidade :)