 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
TEDANIS Novato

Registrado: Sexta-Feira, 2 de Dezembro de 2016 Mensagens: 64
|
Enviada: Sáb Mar 31, 2018 10:23 am Assunto: Abrir programa somente uma vez qual o correto? {RESOLVIDO} |
|
|
Eu encontrei o codigo abaixo para impedir que o programa abra 2 vezes e funciona legal, minha duvida é se o Application.Initialize deve vir antes ou depois do codigo
No arquivo DPR do projeto:
| Código: | var
MutexHandle: THandle;
begin
//O CORRETO É DESSE JEITO:
application.Initialize; //primeiro vem o application.initialize
MutexHandle := CreateMutex(nil, TRUE, 'Agenda TKS');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'A Agenda já está em execução' + #13 + 'Clique no icone do programa na barra de tarefas para restaurar a Agenda ' ,'', mb_IconHand);
CloseHandle(MutexHandle);
Halt(0);
end;
end;
..............
Application.Run;
OU DESSE MODO:
var
MutexHandle: THandle;
begin
MutexHandle := CreateMutex(nil, TRUE, 'Agenda TKS');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'A Agenda está minimizada!' + #13 + 'Clique no icone do programa na barra de tarefas para restaurar a Agenda ' ,'', mb_IconHand);
CloseHandle(MutexHandle);
Halt(0);
end;
end;
Application.Initialize: //o application.initialize vem depois do codigo
...........
Application.Run; |
Editado pela última vez por TEDANIS em Ter Abr 03, 2018 9:06 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Seg Abr 02, 2018 10:01 am Assunto: |
|
|
O segundo método é o correto, tenta criar o Mutex e se for criado com sucesso inicializa-se a aplicação.
| Código: | var
MutexHandle: THandle;
begin
MutexHandle := CreateMutex(nil, TRUE, 'Agenda TKS');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'A Agenda está minimizada!' + #13 + 'Clique no icone do programa na barra de tarefas para restaurar a Agenda ' ,'', mb_IconHand);
CloseHandle(MutexHandle);
Halt(0);
end;
end;
Application.Initialize: //o application.initialize vem depois do codigo
...........
Application.Run; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
| Voltar ao Topo |
|
 |
TEDANIS Novato

Registrado: Sexta-Feira, 2 de Dezembro de 2016 Mensagens: 64
|
Enviada: Ter Abr 03, 2018 7:58 am Assunto: |
|
|
Valeu Natan.
Tenho mais uma duvida, vi em outro exemplo que em vez de HALT(0) se usa o APPLICATION.TERMINATE para encerrar o programa quando ele já está em execução, qual a diferença entre HALT e APPLICATION.TERMINATE e qual deles é o mais indicado para encerrar a execução do programa se ele já estiver aberto? |
|
| Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Abr 03, 2018 10:11 am Assunto: |
|
|
Application.Terminate pára os loops de mensagem permitindo que o thread principal saia normalmente, execute as limpezas necessárias, etc.
Documentação do Delphi:
| Citação: | Termina a execução do aplicativo.
Chamar Terminate para finalizar o aplicativo programaticamente. Ao chamar Terminate em vez de liberar o objeto do aplicativo, você permite que o aplicativo seja encerrado de maneira ordenada.
Terminate chama a função PostQuitMessage da API do Windows para executar um encerramento ordenado do aplicativo. Terminar não é imediato. Encerrar é chamado automaticamente em uma mensagem WM_QUIT e quando o formulário principal é fechado. |
Halt, por outro lado, é uma finalização anormal imediata. Basicamente, arrancando o processo da memória.
Documentação do Delphi:
| Citação: |
Inicia a finalização anormal de um programa.
Halt realiza uma finalização anormal de um programa e retorna ao sistema operacional.
Para executar uma finalização normal de um aplicativo Delphi, chame o método Terminate no objeto Application global. Se o aplicativo não usar uma unidade que forneça um objeto Application, chame o procedimento Exit do bloco principal do Programa. |
Resumindo, o Halt fecha o programa de maneira brusca e imediata, já o Application.Terminate é o contrário, pois fecha ordenadamente e mais lento.
Para este caso, na minha opinião, você pode usar o Application.Terminate seguido de um Exit para que saia do bloco.
| Código: | var
MutexHandle: THandle;
begin
MutexHandle := CreateMutex(nil, TRUE, 'Agenda TKS');
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'A Agenda está minimizada!' + #13 + 'Clique no icone do programa na barra de tarefas para restaurar a Agenda ' ,'', mb_IconHand);
CloseHandle(MutexHandle);
Application.Terminate;
Exit;
end;
end;
Application.Initialize: //o application.initialize vem depois do codigo
...........
Application.Run; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
| Voltar ao Topo |
|
 |
TEDANIS Novato

Registrado: Sexta-Feira, 2 de Dezembro de 2016 Mensagens: 64
|
Enviada: Ter Abr 03, 2018 9:05 pm Assunto: |
|
|
| Ok Natan, obrigado. |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|