Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido)5 Sistemas diferentes, apenas um abre de cada vez.


Douglas Soares

Pergunta

Boa tarde, tenho 5 sistemas, 4 são sistemas que clientes usam dependendo de suas necessidades, 1 é o controle de clientes, o Formulário principal de ambos se chama frmPrincipal, e uso uma função do nosso amigo Churc, para executar o programa mesmo se já estiver aberto no Tray, (http://scriptbrasil.com.br/forum/index.php?showtopic=137378), ele não deixa abrir outro programa porque ele procura pelo nome frmPrincipal, se ve que já encontra aberto ele não abre nenhum otro.... o problema é que não posso renomear para frmPrincipal1, frmPrincipal2, pois há muitas coisas ligadas a esse formulário, e isso pode estragar tudo, ehehe, no entando segue o código de um dos programas, não lembro bem o nome da unit... acho que é o DPR:

program SIGI;

uses
  Forms,
  Windows,
  Dialogs,
  SysUtils,
  Messages,
  formtal in C:\blabla\form.pas,
  ..........................................,
  .......................,
  ...................,
  ..........................;

{$R *.RES}
Var
  HprevHist : HWND;
  MutexHandle : THandle;
  szParams: String = '';

procedure GetParams;
var
  i: Integer;
begin
  for i := 1 to ParamCount do
  if (i = 1) then szParams := ParamStr(i) else
  szParams := szParams + ' ' + ParamStr(i);
end;

function fromBackup: Boolean;
begin
  Result := Pos('-reiniciar', LowerCase(szParams)) > 0;
end;

function OneInstanceAndRunning: Boolean;
begin
result := false;
if (MutexHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)
then
begin
GetParams;
if not fromBackup then
MessageDlg('O Programa já está em Execução nessa Maquina!', mtWarning,
[mbOK], 0);

result := true;
end;
end;

begin
  GetParams;
  
  MutexHandle := CreateMutex(nil, True, 'AdministraIgrejas');
  if OneInstanceAndRunning and not (fromBackup) then
  begin
    hPrevInst := FindWindow('TFrmPrincipal', nil);
    if hPrevInst <> 0 then
    begin
    SendMessage(hPrevInst, WM_SYSCOMMAND, SC_RESTORE, 0);
    SendMessage(hPrevInst, WM_RESTFROMTRAY, 0, 0);
    end;
    CloseHandle(MutexHandle);
    Halt;
  end;
  try
  Application.Initialize;
  Application.Title := 'AdministraIgrejas';
//frmTabelas := TfrmTabelas.Create(Application);
//frmTabelas.ShowModal;
//frmTabelas.Free;
  frmAbertura := TfrmAbertura.Create(Application); // Cria o form de abertura
  frmAbertura.Show;
  frmAbertura.Update;
  Application.CreateForm(TfrmPrincipal, frmPrincipal);
  Application.CreateForm(TdtmPrincipal, dtmPrincipal);
  Application.CreateForm(TfrmSelAnoDiz, frmSelAnoDiz);
  Application.CreateForm(TfrmSelMesAd, frmSelMesAd);
  Application.CreateForm(TFrmPesqCaixa, FrmPesqCaixa);
  Application.CreateForm(TFrmPesqBanco, FrmPesqBanco);
  Application.CreateForm(TfrmSemConexao, frmSemConexao);
  frmAbertura.Hide;
  frmAbertura.Free;
  Application.Run;
  finally
    if LongBool(MutexHandle) then
    CloseHandle(MutexHandle);
  end;
end.

Creio que o problema está bem naquela Linha hPrevInst := FindWindow('TFrmPrincipal', nil);, porem não sei como fazer de outra forma.....

alguma ajuda? :rolleyes:

Obrigado

Editado por Douglas_Soares
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
o problema é que não posso renomear para frmPrincipal1, frmPrincipal2, pois há muitas coisas ligadas a esse formulário, e isso pode estragar tudo

Voce pode sim alterar o nome do form, basta manter o nome da Unit ... se voce estiver fazendo referencia ao nome do form, neste caso terá que alterar somente nas chamadas a esse form

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

hPrevInst := FindWindow(nil, 'Formulário principal');

você pode usar colocando pelo título da janela.

Ai vai um exemplo:

program Project1; 
uses 
  Forms, 
  Windows, 
  Dialogs, 
  Unit1 in 'Unit1.pas' {Form1}; 
{$R *.RES} 
Var  hPrevInst: HWND; 
begin 
  Application.Initialize;  
  Application.Title := 'Project1'; 
  hPrevInst := FindWindow(Nil, PChar('Project1')); //voce pode colocar o pchar tb se necessario
  if hPrevInst = 0 then begin
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
  end else begin
    MessageDlg('Já existe uma instancia deste aplicativo rodando em seu sistema.', mtInformation, [mbOK], 0);   
    halt;//ou Application.Terminate;
  end;

Editado por Eder Moraes
Link para o comentário
Compartilhar em outros sites

  • 0

Aê!!! fiquei hoje o dia todo fuçando e vendo aqui os exemplos... ainda faltava umas coisinhas, fui fuçando e fuçandoooooo, agora fico 10000%

Segue o código:

program BLABLA;

uses
  Forms,
  Windows,
  Dialogs,
  SysUtils,
  Messages,
  Princ in 'Princ.pas' {frmPrincipal},

{$R *.RES}
Var
  HprevHist : HWND;
  MutexHandle : THandle;
  szParams: String = '';

procedure GetParams;
var
  i: Integer;
begin
  for i := 1 to ParamCount do
  if (i = 1) then szParams := ParamStr(i) else
  szParams := szParams + ' ' + ParamStr(i);
end;

function fromBackup: Boolean;
begin
  Result := Pos('-reiniciar', LowerCase(szParams)) > 0;
end;

function fromlocal : Boolean;
begin
  Result := FindWindow(nil, 'AdministraIgrejas') > 0;
end;

function OneInstanceAndRunning: Boolean;
begin
result := false;
if (MutexHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)
then
begin
GetParams;
if not fromBackup then
MessageDlg('O Programa já está em Execução nessa Maquina!', mtWarning,
[mbOK], 0);

result := true;
end;
end;

begin
  GetParams;

  MutexHandle := CreateMutex(nil, True, 'AdministraIgrejas');
  if OneInstanceAndRunning and not (fromBackup) and (fromlocal) then
  begin
    hPrevInst := FindWindow('TFrmPrincipal', nil);
    if hPrevInst <> 0 then
    begin
    SendMessage(FindWindow(nil, 'AdministraIgrejas'), WM_SYSCOMMAND, SC_RESTORE, 0);
    SendMessage(HPrevInst, WM_RESTFROMTRAY, 0, 0);
    end;
    CloseHandle(MutexHandle);
    Halt;
  end;
  try
  Application.Initialize;
  Application.Title := 'AdministraIgrejas';
  frmAbertura := TfrmAbertura.Create(Application); // Cria o form de abertura
  frmAbertura.Show;
  frmAbertura.Update;
  Application.CreateForm(TfrmPrincipal, frmPrincipal);
  Application.CreateForm(TdtmPrincipal, dtmPrincipal);
  Application.CreateForm(TfrmSelAnoDiz, frmSelAnoDiz);
  Application.CreateForm(TfrmSelMesAd, frmSelMesAd);
  Application.CreateForm(TFrmPesqCaixa, FrmPesqCaixa);
  Application.CreateForm(TFrmPesqBanco, FrmPesqBanco);
  Application.CreateForm(TfrmSemConexao, frmSemConexao);
  frmAbertura.Hide;
  frmAbertura.Free;
  Application.Run;
  finally
    if LongBool(MutexHandle) then
    CloseHandle(MutexHandle);
  end;
end.

Ou seja, onde está AdministraIgrejas, nos outros programas coloquei seu respectivo Title... quem quiser ver os programas que eu mecho entra nesse link: http://www.soareseneves.com.br, ehehehe

Obrigado pessoal!!!!!!!!!!!

Editado por Douglas_Soares
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...