Ir para conteúdo
  • Cadastre-se

dev botao

Programa se "esconde" por trás dos demais


  • Este tópico foi criado há 314 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Olá a todos,

Estou com uma dificuldade inusitada.

Meu sistema ao abrir verifica se possui alguma atualização, se sim ele abre um programa atualizador que baixa uma nova versão do mesmo, carrega novamente o sistema e se fecha.

O problema é que às vezes, por exemplo, na hora de abrir o programa atualizador, ele se esconde atrás de outras janelas e o usuário não têm noção assim que uma atualização está sendo realizada.

Ou quando atualiza e abre o sistema novamente, ele se esconde atrás de outras janelas e o usuário não percebe que o sistema já abriu.

Como os amigos lidam com essa situação?

Desde já agradeço a atenção de todos

 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
5 minutos atrás, Juliomar Marchetti disse:

Quando chamar e mandar o show

use o  application.bringtofront

Oi @Juliomar Marchetti

Tudo bom?

No exemplo que o sistema vê que precisa ser atualizado e chama o atualizador.exe, aí o atualizador.exe se esconde. Eu tenho que aplicar esse código no evento FormShow do único formulário do atualizador.exe? Seria isso?

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

  • Membros Pro
4 horas atrás, bnobre disse:

Oi @Juliomar Marchetti

Tudo bom?

No exemplo que o sistema vê que precisa ser atualizado e chama o atualizador.exe, aí o atualizador.exe se esconde. Eu tenho que aplicar esse código no evento FormShow do único formulário do atualizador.exe? Seria isso?

Tentei dessa forma que explicitei acima, mas não funcionou. Continua "escondendo" a janela da aplicação.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
3 horas atrás, EdmarFrazao disse:

outras sugestões.

 

    Application.Restore;

    Aplicativos.restoretomost
    Application.BringToFront;
    self.BringToFront;

 

 

Olá @EdmarFrazao

Tudo bom com você meu amigo...

Vou testar sim... Na verdade eu achei esses comandos em alguns sites, fiz uma pesquisa na net e no site da Embarcadero, mas não achei nenhuma documentação explicando sobre os mesmos. Queria saber exatamente qual a finalidade de cada um.

Você saberia me dizer ou indicar onde posso achar a documentação?

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Olá @Renato Rubinho

Como você está?

O stayontop que achei faz referência ao valor fsStayOnTop da propriedade FormStyle da classe TCustomForm (https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Forms.TCustomForm.FormStyle). Seria isso? Se for eu achei meu confuso a documentação:

Citar

This form remains on top of the desktop and of other forms in the project, except any others that also have FormStyle set to fsStayOnTop. If one fsStayOnTop form launches another, neither form will consistently remain on top.

"Este formulário permanece no topo da área de trabalho e de outros formulários no projeto" Tradução Google Translate

Ficou meio sem sentido essa frase pra mim, como assim na frente de outros formulários? Eu preciso é que a aplicação apareça na frente das outras QUANDO ABRIR.

Essa frase faz mais sentido na modalidade MDI, onde tem um MDI Pai e diversos MDI filhos que podem ser acessados sem fechar os demais. Aqui no meu caso é fsNormal e chamo todo mundo via ShowModal. A tela 1 chama a tela 2, portando preciso fechar a tela 2 pra voltar a tela 1.

3 horas atrás, Renato Rubinho disse:

Pesquise também sobre stayontop.

Se não funcionar adequadamente, durante o processamento do programa que deve ficar na frente, use para atualizar os comandos a seguir.

Application.ProcessMessages

Application.BringToFront

Onde EXATAMENTE você sugere que eu coloque esses comandos? Tentei colocar no evento FormShow do Form Principal, mas não funcionou.

Nunca achei uma documentação do Application.ProccesMessages, mas sei que ele é usado quando preciso desenhar algo na tela do programa sem que o mesmo trave, não seria isso?

Já esse Application.BringToFront serve pra que? Em uma tradução livre seria trazer a aplicação para frente, mas aqui ao menos não trouxe a mesma à frente dos outros programas. E eu não acho documentação do mesmo.

Desde já agradeço a sua atenção meu amigo

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
3 horas atrás, EdmarFrazao disse:

outras sugestões.

 

    Application.Restore;

    Aplicativos.restoretomost
    Application.BringToFront;
    self.BringToFront;

 

 

Esqueci de perguntar meu amigo... Onde devo testar esses comandos? A princípio estou testando no evento FormShow do form Principal.

Achei muita gente na internet com comandos pra testar, mas ninguém diz explicitamente onde colocá-los.

E teve um aí da lista que o teu tradutor alterou o que você escreveu... Seria no caso Application.RestoreTopMosts?

Link para o comentário
Compartilhar em outros sites

  • Consultores
1 hora atrás, bnobre disse:

Essa frase faz mais sentido na modalidade MDI, onde tem um MDI Pai e diversos MDI filhos que podem ser acessados sem fechar os demais. Aqui no meu caso é fsNormal e chamo todo mundo via ShowModal. A tela 1 chama a tela 2, portando preciso fechar a tela 2 pra voltar a tela 1.

Se você criar uma aplicação que não seja MDI, pode abrir dos forms sem ser modal, e ambos podem ser manipulados, com o stayontop, seu form ficará acima dos demais desta aplicação.

1 hora atrás, bnobre disse:

Nunca achei uma documentação do Application.ProccesMessages

https://docwiki.embarcadero.com/Libraries/Alexandria/en/Vcl.Forms.TApplication.ProcessMessages

Se você executa um processo ( clicar num botão por exemplo ) sem ser via thread, enquanto não terminar de processar, a aplicação não responde ( fica a tela branca no Windows se você ficar clicando nela ) e ao final a aplicação volta a responder. Se você utiliza este método, as mensagens são processadas durante o processo. Se tiver um loop, você pode utilizá-lo para atualizar uma barra de progresso por exemplo.

1 hora atrás, bnobre disse:

Onde devo testar esses comandos? A princípio estou testando no evento FormShow do form Principal.

No FormShow e durante o processamento com o ProcessMessages, assim você irá "atualizar" a aplicação.

1 hora atrás, bnobre disse:

teve um aí da lista que o teu tradutor alterou o que você escreveu... Seria no caso Application.RestoreTopMosts?

Não conhecia este.

https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Forms.TApplication.RestoreTopMosts

 

Por fim, pesquisando sobre suas dúvidas encontrei este tópico que parece ser a mesma necessidade que você tem e foi dito que resolveu.

https://www.devmedia.com.br/forum/stayontop-funciona-mais-nao-me-respeita/336596

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Citar

Se você criar uma aplicação que não seja MDI, pode abrir dos forms sem ser modal, e ambos podem ser manipulados, com o stayontop, seu form ficará acima dos demais desta aplicação.

Então no meu caso não irá servir, o cenário aqui é outro, não são forms diferentes de uma mesma aplicação, são aplicações diferentes...

Para ficar um exemplo mais claro, eu tenho a aplicacao1.exe e aplicacao2.exe. Estou com a janela do Meu Computador aberta onde localizo e executo a aplicacao1.exe, essa por sua vez dá um ShellExecute chamando a aplicacao2.exe e depois se fecha, pois quero somente rodando a aplicacao2.exe. A aplicacao2.exe abre, mas fica ESCONDIDA atrás da janela do Meu Computador. Preciso que ela fique na frente dos outros programas ao abrir, não precisa ficar em definitivo, mas só ao abrir, para o usuário ver que carregou. Depois o mesmo pode minizar, fechar, fazer o que quiser com esse programa.

Citar

Valeu, é praticamente o que eu já achava que fazia, mas a documentação é sempre importante pra definir com certeza.

Citar

No FormShow e durante o processamento com o ProcessMessages, assim você irá "atualizar" a aplicação.

Então foi onde testei, mas não funcionou. Mas não creio que nesse cenário o ProcessMessages seria útil, pois são 2 aplicações diferentes e a segunda se ESCONDE ao ser chamada. Ela é chamada, mas não fica na frente... O ProcessMessages é para quando a aplicação não responde e visualmente parece que travou... Correto? Se sim não teria nem problema a segunda aplicação travar, contanto que ela travasse aparecendo na frente de todos os outros programas... Esse é o problema, ela fica escondida atrás dos demais programas e o cliente não percebe que ela abriu kkkkkkkkkkkkkkkkk

Citar

Legal, mas não funcionou... Mas ao ler a documentação já imaginei que não funcionaria, pois diz basicamente que restaura os formulários para fsStayOnTop. Mas meu cenário não são formulários de uma mesma aplicação se escondendo conforme expliquei no início desse post.

Citar

Por fim, pesquisando sobre suas dúvidas encontrei este tópico que parece ser a mesma necessidade que você tem e foi dito que resolveu.

Então meu amigo, peço até desculpas pois eu acho que não me expressei bem sobre o cenário aqui. Pelo que li nesse tópico entra novamente de um único sistema com várias janelas no mesmo, onde se quer uma na frente, pois o autor diz: "eu estou desenvolvendo um sistema baseado em duas janelas, uma principal onde relaciono uma lista de canais e outra em paralelo, onde o video ou a estação de rádio é transmitida."

Aqui o problema é diferente, é como o exemplo que dei da aplicacao1.exe e aplicacao2.exe no início. Estou com a janela do Meu Computador aberta onde localizo e executo a aplicacao1.exe, essa por sua vez dá um ShellExecute chamando a aplicacao2.exe e depois se fecha, pois quero somente rodando a aplicacao2.exe. A aplicacao2.exe abre, mas fica ESCONDIDA atrás da janela do Meu Computador. Aí o cliente acha que a aplicacao2.exe não abriu e vai lá abrir ela dinovo manualmente.

Mas só por curiosidade testei e não funcionou. Mas novamente no final ele está setando como fsStayOnTop, que é relacionado a controle de forms na mesma aplicação. O cenário dele é diferente.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia

Primeiro de tudo, se você tem alguma rotina rodando direto no create ou no onShow, pode ser por isso que não traz a aplicação para frente, para teste, coloque em um timer ou no final do OnActivate.

1. Realmente no link da devmedia não li direito e achei que fosse o mesmo por ele ter citado outro exe, em todo caso, como ele faz uma abordagem diferente, teste para ver se eventualmente traz sua segunda aplicação para frente.

2. Outro teste, na sua aplicação 2, no início do OnActivate, coloque este código e veja se a cada 5 segundos ela vai para frente das demais.

Isso tem que executar antes de qualquer outra rotina na sua segunda aplicação.

while True do
begin
  Sleep(5000);
  Application.BringToFront;
  Application.ProcessMessages;
end;

Se funcionar, veja qual a melhor abordagem para você, pois nesse caso ele não vai sair desse loop nunca, é apenas um teste.

Link para o comentário
Compartilhar em outros sites

Eu uso no active

a combinação, em geral funciona.

     Application.Restore
     Aplicativos.restoretomost
     Application.BringToFront;
     self.BringToFront;

 

Ou adicionar um timer com atraso de 2seg

para forçar com os comandos acima

 

outra opção RestauraFoco @Rafael L. Costa

 

Editado por EdmarFrazao
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Bom dia meu amigo @Renato Rubinho

A luta continua kkkkkkkkkkkkkkkkk

Citar

Primeiro de tudo, se você tem alguma rotina rodando direto no create ou no onShow, pode ser por isso que não traz a aplicação para frente, para teste, coloque em um timer ou no final do OnActivate.

Pensei ser isso também... Aí coloquei um Timer com 5 segundos só por garantia e executei os comandos Application.BringToFront e o Application.ProcessMessages... Nada!!!

Citar

1. Realmente no link da devmedia não li direito e achei que fosse o mesmo por ele ter citado outro exe, em todo caso, como ele faz uma abordagem diferente, teste para ver se eventualmente traz sua segunda aplicação para frente.

Como já estava sem opção tentei a tal abordagem. E acontece um comportamento interessante, mas que infelizmente não atende a minha necessidade... Trouxe a aplicação para a frente, mas em primeiro lugar sem o foco estar nela, aí o usuário tem que clicar na mesma pra poder escrever... Mas até aí tudo bem, pois eu só queria que ele visse que está aberta. O problema é que ela fica na frente SEMPRE kkkkkkkkkkkkkkkkkkkkkkkk Só preciso que ela fique na frente quando abrir para o usuário ver que ela está aberta e não abrir a toa novamente, se ficar sempre na frente vai atrapalhar o usuário usar o computador.

Citar

2. Outro teste, na sua aplicação 2, no início do OnActivate, coloque este código e veja se a cada 5 segundos ela vai para frente das demais.

Nada também... Não sei qual o mistério, porque o Application.BringToFront não funciona, de acordo com a documentação a finalidade dele é simplesmente trazer a aplicação para a frente das demais, conforme eu preciso: https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Forms.TApplication.BringToFront

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Oi @EdmarFrazao

Tudo bom?

Citar

Ou adicionar um timer com atraso de 2seg

Sim, coloquei um atraso de 5seg, nada!

Citar

outra opção RestauraFoco @Rafael L. Costa

Pra garantir que não tinha nenhum código atrapalhando, executei o RestauraFoco em um timer depois de 10s, mas nada. O ícone da aplicação até pisca na barra de tarefas, mas ela fica escondida das demais.

Mistério isso!!!

Link para o comentário
Compartilhar em outros sites

  • Consultores

Outra sugestão, crie uma nova "aplicação 2" sem nada, se não funcionarem essas opções, acredito que tenha que focar em outra solução.

Teste 1:

Coloque apenas o código a seguir no onActivate.

while True do
begin
  Sleep(5000);
  Application.BringToFront;
  Application.ProcessMessages;
end;

Teste 2:

Ao invés do código acima, coloque apenas um timer com o código a seguir 

Application.BringToFront;
Application.ProcessMessages;

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 314 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.