ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Abrir programa somente uma vez qual o correto? {RESOLVIDO}

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
TEDANIS
Novato
Novato


Registrado: Sexta-Feira, 2 de Dezembro de 2016
Mensagens: 64

MensagemEnviada: Sáb Mar 31, 2018 10:23 am    Assunto: Abrir programa somente uma vez qual o correto? {RESOLVIDO} Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Abr 02, 2018 10:01 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
TEDANIS
Novato
Novato


Registrado: Sexta-Feira, 2 de Dezembro de 2016
Mensagens: 64

MensagemEnviada: Ter Abr 03, 2018 7:58 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Abr 03, 2018 10:11 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
TEDANIS
Novato
Novato


Registrado: Sexta-Feira, 2 de Dezembro de 2016
Mensagens: 64

MensagemEnviada: Ter Abr 03, 2018 9:05 pm    Assunto: Responder com Citação

Ok Natan, obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB