boa tarde, tenho uma aplicação em delphi que envia email, quando a açao de enviar email e chamada eu dou um show em um form, uma telinha chamada aguarde com efeito visual que fica ativa por 3 segundos, porem quando essa tela e aberta o codigo de enviar email fica congelado e so volta a funcionar quando esse form aguarde e fechado, tem algum forma de fazer com que o codigo continue sendo executado mesmo com esse forme aberto?
Delphi
9 Respostas
Como você está exibindo o form? Está usando Showmodal ou somente Show?
Se fizer ShowModal, a execução fica parada enquanto o form é exibido. Tente usar Show, e um timer no form de “Aguarde” para fechá-lo após X segundos.
Outra opção é usar uma thread para mandar o email ou exibir o form, assim seu código não fica travado nesse trecho.
Abraço.
entao estou usando o showModal, pq se uso o show a label contida no form aguarde nao fica visivel…
ouvi falar sobre thread porem n tenho uma minima noção de como usar…
O programa tem o seguinte funcionamento, de inicio abre a tela de login, nessa tela tem uma opçao esqueci minha senha, ao clicar pede o nome de usuario, faz uma consulta no banco e envia um email a esse respectivo usuario, enquanto esta enviando quero abrir esse form de aguarde e que ele feche ao terminar a ação sem interromper a mesma.
A solução mais simples seria com Show mesmo. Esse Label, você está alterando o texto dele de alguma forma? Ou é um texto estático, que já está configurado quando o form é aberto?
Abraço.
então uma parte da label é estatica, a frase ‘aguarde’, porem existem mais 3 labels que seriam as reticencias, 3 pontos ‘…’ cada ponto é uma label , cada uma é acionada por um timer causando um efeito visual que faz os ponto ‘piscarem’ , apenas para efeito visual.
O envio de email que ocorre depois do Show deve estar congelando esse Timer, já que aparentemente é um processo bloqueante, por isso as reticências não funcionam bem.
Não é o ideal, mas teste colocar Application.ProcessMessages dentro do método do timer que atualiza o Label. Isso fará com que o programa processe mensagens pendentes, como a atualização do Label.
Abraço.
fiz o que disse, mas infelizmente ainda nao deu terço, a tela aparece em ‘branco’ da mesma forma, a label ‘aguarde’ que e estatica tambem nao fica visivel
Então o envio do email é bloqueante mesmo. Acredito que threads seriam um caminho, assim o envio de email ficaria em uma thread paralela e o sistema não congelaria por completo.
Não é tão complicado quanto parece. Dê uma olhada em:
- https://pt.stackoverflow.com/questions/105396/como-criar-uma-anonymous-thread-em-delphi
- https://drgarcia1986.wordpress.com/2013/01/31/threads-no-delphi-por-onde-comecar-parte-i/
Abraço.
poxa valeu mesmo esta me ajudando muitoo, vou estudar o conteudo que me mandou, obrigado mesmo, abraços
atualizando o post, se eu usar um Application.ProcessMessages; depois de chamar o formAguarde fez as labels ficarem visiveis, porem sem o efeito visual delas piscarem, meu professor disse que eu teria de usar threads mesmo pra ter o efeito visual, mas com essa ‘gambiarra’ ja deu uma bela ajudada, obriagado pela ajuda