Cancelar envio de muitos emails

Delphi

15/11/2004

Salve pessoal

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

Mmoreira

Curtidas 0

Respostas

Heavyromulo

Heavyromulo

15/11/2004

Xará, faça o seguinte :
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
Gurc

Gurc

15/11/2004

Colegas, esse código deve funcionar, mas, quando trabalhamos com Indy é extremamente aconselhável que usemos Threads para o processamento. Se quiserem saber mais a respeito entrem em contato.
Gustavo Royer Chaurais


GOSTEI 0
Mmoreira

Mmoreira

15/11/2004

gurc
vc poderia passar mais informações sobre a questao que vc levantou sobre Threads

valew


GOSTEI 0
Gurc

Gurc

15/11/2004

Desculpe a demora...
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
Mmoreira

Mmoreira

15/11/2004

heavyromulo

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
POSTAR