Para Executar Uma Única Cópia Do Aplicativo
Amigos , Tirei Esta Dica Do Clube. Mas Não Esta Compilando. Alguem Sabe Porque Ou Conhece Outra Maneira De Realizar.
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if HprevHist = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;
Não Compila Porque Diz Que HPREVVIST Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if HprevHist = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;
Não Compila Porque Diz Que HPREVVIST Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:
Marco Salles
Curtidas 0
Respostas
Josinaldo
25/12/2003
//abra a unit do projeto -> project -> view source
{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
end;
{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
end;
GOSTEI 0
Marco Salles
25/12/2003
//abra a unit do projeto -> project -> view source
{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);//
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
end;
Obrigado Josinaldo. Mas Estou Na Dúvida No Trecho:´Nome _Formulario´,
Já Que a Unit Do Projeto Não Tem Formulário. Então Não Sei o Nome Que Devo Usar :?:
Não Seria o Nome Da Unit :?: Ou Nome Do Projeto. :?:
Se For Sem Ou Com Extensão :?:
Obrigado...
GOSTEI 0
Marco Salles
25/12/2003
Bom Dia Para Todos.Há Ums Dias Atrás Levantei Est aSituação No Forum.
O Josinaldo Gentilmente Sugeriu Que EScrevesse O Código Abaixo.
Enviada: Qui Dez 25, 2003 9:13 pm Assunto:
--------------------------------------------------------------------------------
//abra a unit do projeto -> project -> view source
{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
Acontece Dois Fatos :
O Primeiro é Que Continua Sem Compilar. Para Resolver Este Problema
Declarei Na Secção Uses Da Unit Do Projeto a Unit Windows.
uses
Windows; //Declarei Istop Manualmente.
Forms,
Unit1 in ´Unit1.pas´ ;
O Problema Da Compilação Parece Que Foi Resolvido. Mas As Instruções Apresentadas Insistem Em Não Fazer Efeito. Isto é Continuam Permitindo a Execução De Mais De Um Aplicativo. Testei Passo A Passo o Comando De Instruções e o Valor Da Variável Handle Em Qualquer Situação É Sempre ´ZERO´.
Então Amigos Continuam Pedindo Ajuda Sobre Este Tópico. Obrigao....
Colegas Sobre Este Tópico.
O Josinaldo Gentilmente Sugeriu Que EScrevesse O Código Abaixo.
Enviada: Qui Dez 25, 2003 9:13 pm Assunto:
--------------------------------------------------------------------------------
//abra a unit do projeto -> project -> view source
{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
Acontece Dois Fatos :
O Primeiro é Que Continua Sem Compilar. Para Resolver Este Problema
Declarei Na Secção Uses Da Unit Do Projeto a Unit Windows.
uses
Windows; //Declarei Istop Manualmente.
Forms,
Unit1 in ´Unit1.pas´ ;
O Problema Da Compilação Parece Que Foi Resolvido. Mas As Instruções Apresentadas Insistem Em Não Fazer Efeito. Isto é Continuam Permitindo a Execução De Mais De Um Aplicativo. Testei Passo A Passo o Comando De Instruções e o Valor Da Variável Handle Em Qualquer Situação É Sempre ´ZERO´.
Então Amigos Continuam Pedindo Ajuda Sobre Este Tópico. Obrigao....
Colegas Sobre Este Tópico.
GOSTEI 0
Cebikyn
25/12/2003
Três opções com técnicas diferentes:
[color=blue:7a332ce4ce][b:7a332ce4ce]1- Usando CreateMutex:[/b:7a332ce4ce][/color:7a332ce4ce]
No [b:7a332ce4ce]fim[/b:7a332ce4ce] de qualquer unit (antes do [b:7a332ce4ce]end.[/b:7a332ce4ce] ) coloque isto (exatamente como está):
[color=blue:7a332ce4ce][b:7a332ce4ce]2- Usando CreateSemaphore:[/b:7a332ce4ce][/color:7a332ce4ce]
No OnCreate de algum form:
[color=blue:7a332ce4ce][b:7a332ce4ce]3- Usando GlobalAddAtom:[/b:7a332ce4ce][/color:7a332ce4ce]
Este é para ser usado se o programa só puder ser inicializado uma vez por seção do Windows. No OnCreate de qualquer form:
[color=blue:7a332ce4ce][b:7a332ce4ce]1- Usando CreateMutex:[/b:7a332ce4ce][/color:7a332ce4ce]
No [b:7a332ce4ce]fim[/b:7a332ce4ce] de qualquer unit (antes do [b:7a332ce4ce]end.[/b:7a332ce4ce] ) coloque isto (exatamente como está):
var mHandle: THandle; // Mutexhandle initialization mHandle := CreateMutex(nil, True, ´XYZ´); if GetLastError = ERROR_ALREADY_EXISTS then begin ShowMessage(´Este programa já está sendo executado!´); halt; end; finalization if mHandle <> 0 then CloseHandle(mHandle)
[color=blue:7a332ce4ce][b:7a332ce4ce]2- Usando CreateSemaphore:[/b:7a332ce4ce][/color:7a332ce4ce]
No OnCreate de algum form:
procedure TForm1.FormCreate(Sender: TObject); var Sem: THandle; begin Sem := CreateSemaphore(nil, 0, 1, ´PROGRAM_NAME´); if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then begin CloseHandle(Sem); ShowMessage(´Este programa já está sendo executado.´); Halt; end; end;
[color=blue:7a332ce4ce][b:7a332ce4ce]3- Usando GlobalAddAtom:[/b:7a332ce4ce][/color:7a332ce4ce]
Este é para ser usado se o programa só puder ser inicializado uma vez por seção do Windows. No OnCreate de qualquer form:
procedure TForm1.FormCreate(Sender: TObject); var atom: Integer; begin if GlobalFindAtom(´A Text used to be stored in memory´) = 0 then atom := GlobalAddAtom(´A Text used to be stored in memory´) else begin ShowMessage(´Este programa só pode ser iniciado uma única vez.´); Close; end; end;
GOSTEI 0
Rafaelgm
25/12/2003
[quote:184a954242=´Marco Salles´]Amigos , Tirei Esta Dica Do Clube. Mas Não Esta Compilando. Alguem Sabe Porque Ou Conhece Outra Maneira De Realizar.
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if [b:184a954242]HprevHist[/b:184a954242] = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;
Não Compila Porque Diz Que [b:184a954242]HPREVVIST[/b:184a954242] Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:[/quote:184a954242]
O nome da variável é ´HPrevInst´, e não ´HprevHist´ e nem ´HPREVVIST´.
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if [b:184a954242]HprevHist[/b:184a954242] = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;
Não Compila Porque Diz Que [b:184a954242]HPREVVIST[/b:184a954242] Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:[/quote:184a954242]
O nome da variável é ´HPrevInst´, e não ´HprevHist´ e nem ´HPREVVIST´.
GOSTEI 0
Beppe
25/12/2003
De qualquer forma *não* se usa HPrevInst no Win32. Esta variável está aí para compatibilidade com 16 bits. Usem qualquer das alternativas que o cebikyn mostrou.
GOSTEI 0