Fórum Cancelar envio de muitos emails #258461
15/11/2004
0
Estou com o seguinte problema, estou usando o seguinte código para enviar e-mails atravez dos componentes da paleta Indy:
try Panel_Progresso.Visible := true; Gauge1.MaxValue := Qtd_Reg; Gauge1.Progress := 0; IBQry_Contato.First; while not IBQry_Contato.Eof do begin Gauge1.Progress := Gauge1.Progress + 1; // Destinatário IdMsgSend.Recipients.EMailAddresses := IBQry_Contato.FieldByName( ´CONTATO_EMAIL´ ).AsString; // Envia mensagem SMTP.Send(IdMsgSend); // Pula para proximo registro IBQry_Contato.Next; end; finally SMTP.Disconnect; Panel_Progresso.Visible := false; end;
Funciona perfeitamente ... o que eu queria é adicionar um botao para cancelar a ação quando houver a necessidade de parar o envio das mensagens .... Por exemplo estou mandando 500 emails .... quando clico em qualquer parte do form vem a mensagem no caption do form dizendo que o programa nao esta respondendo ... só que o programa continua enviando as mensagens ... quando tudo acaba onprograma volta a funcionar normalmente ...
Alguem sabe como posso colocar o botao para cancelar?
Mmoreira
Curtir tópico
+ 0Posts
15/11/2004
Heavyromulo
Crie um outro formulario com o gauge e um botao cancelar, crie um variavel na parte ´public´ da Unit do tipo Boolean.
no evento on show deste novo formulario coloque :
Variavel_Boolean := true;
no evento onClick do botão cancelar coloque :
Close;
no evento Onclose do formulario coloque :
Variavel_Boolean := false;
/////////////////// mudando o seu codigo //////////////////////////
try
Novo_formulario.Show;
Novo_formulario.Gauge1.MaxValue := Qtd_Reg;
Novo_formulario.Gauge1.Progress := 0;
IBQry_Contato.First;
while not IBQry_Contato.Eof do begin
Novo_formulario.Gauge1.Progress := Novo_formulario.Gauge1.Progress + 1;
// Destinatário
IdMsgSend.Recipients.EMailAddresses := IBQry_Contato.FieldByName( ´CONTATO_EMAIL´ ).AsString;
// Envia mensagem
SMTP.Send(IdMsgSend);
// Pula para proximo registro
IBQry_Contato.Next;
Application.ProcessMessages;
if not novo_formulario.Variavel_boolean then break;
end;
finally
SMTP.Disconnect;
novo_formulario.free;
end;
[color=red:a146cd0126][/color:a146cd0126][color=red:a146cd0126][/color:a146cd0126][color=red:a146cd0126][/color:a146cd0126][color=red:a146cd0126][/color:a146cd0126][color=red:a146cd0126][/color:a146cd0126][color=red:a146cd0126][/color:a146cd0126]
Gostei + 0
15/11/2004
Gurc
Gustavo Royer Chaurais
Gostei + 0
16/11/2004
Mmoreira
vc poderia passar mais informações sobre a questao que vc levantou sobre Threads
valew
Gostei + 0
18/11/2004
Gurc
Geralmente o que faço é gerar uma Thread que possui a conexão com o Indy.
Você sabe usar as Threads? No Help do Delphi tem exemplos detalhados do uso delas. Tente entender e qualquer dúvida me questione por aqui. Outra coisa, se você for usar métodos pela aplicação e pela Thread, ou usar várias Threads não se esqueça de usar sincronização ou seções críticas. Imagino que este não seja o seu caso, mas é bom criar uma cultura do uso do método Synchronize.
Até mais,
Qualquer coisa estamos aí.
Gustavo Royer Chaurais
Gostei + 0
23/11/2004
Mmoreira
vc disse para eu mudar um pouco meu código ... e funcionou perfeitamente a não ser por um detalher ...
No form que tem a gauge vc modificou assim:
Novo_formulario.Show;
O problema é que se eu clicar no form de traz o form que tem a gauge some mas os emails continuam a ser enviado ... mas se eu colocar assim:
Novo_formulario.ShowModal;
ai os emails não sao enviados ... só é enviado o primeiro e-mail da lista e depois o programa retorna o seguinte erro:
Access violation at address 0046DE1D in module ´easyMAIL´. Read of address 000002F4.
e agora o que eu poderia fazer para resolver o meu problema?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)