crea un nuevo hilo de rosca para enviar email.
>> ¿Puede el usuario a partir de ese momento encendido hacer cualquier cosa dentro del uso?
sure. pero hay dos cosas que usted tiene que controlar:
1. el usuario quiere parar de su uso pero los email todavía están enviando. En este caso usted puede terminar el hilo de rosca o esperar su acabamiento
2. no cambiar query1, edit1, edit2 porque el hilo de rosca lo utiliza
>> Qué si ocurre un error. ¿El usuario todavía podrá conseguir esto?
Sí, su intento/excepto/showmessage todavía trabaja:
intento
IdSMTP.Connect;
IdSMTP.Send (IdMsg);
excepto
Showmessage (“error al enviar el email ");
extremo;
Sería mejor envolver todo ejecuta método en intento/excepto también como esto:
procedimiento TEmailThread.Execute;
var IdSMTP: TIdSMTP;
IdMsg: TIdMessage;
I: Número entero;
comenzar
intento
IdSMTP: =TIdSMTP.Create (nada);
IdSMTP.Host: = ' my.domain.nl'; // substituyen por su servidor saliente
IdSMTP.Port: =25;
IdSMTP.Username: = “MyUserName”;
IdSMTP.Password: = “MyPassword”;
intento
si no IdSMTP.Connected entonces
IdSMTP.Connect;
Para I: = 0 a Query1.Recordcount -1 hace
comenzar
si entonces está terminado salir;
intento
IdMsg: =TIdMessage.Create (nada);
IdMsg.From.Address: = edit1.Text;
IdMsg.Subject: = edit2.text;
IdMsg.Recipients.EMailAddresses: = Query1.FieldByName (“email ").Text;
Comienzo de // una cierta función para personalizar el cuerpo por cliente
IdMsg.Body.Text: = PersonalizeEmailForCustomer;
intento
IdSMTP.Connect;
IdSMTP.Send (IdMsg);
excepto
en E: La excepción hace
Showmessage (“error al enviar el email: ” + E.Message);
extremo;
finalmente
IdMsg.Free;
extremo;
Query1.Next;
extremo;
finalmente
si IdSMTP.Connected entonces
IdSMTP.Disconnect;
IdSMTP.Free;
extremo;
excepto
en E: La excepción hace
Showmessage (“error al enviar el email: ” + E.Message);
extremo;
extremo;
>> ¿Todavía es posible informar al usuario final que el envío ha acabado, demuestra un cierto resultado?
Usted puede utilizar el mensaje de OnTerminate o
con TEmailThread.Create (verdad) hacer
comenzar
OnTerminate: = ThreadOnTerminate;
FreeOnTerminate: = verdad;
Curriculum vitae;
extremo;
procedimiento TMainForm.ThreadOnTerminate (ASender: TObject);
comenzar
ShowMessage (se hace el “trabajo ");
extremo;
>> Por lo tanto necesito pasar ese contenido al hilo de rosca de alguna manera
usted puede pasar al hilo de rosca cualquier parámetro que usted tenga gusto vía su constructor. Por ejemplo:
TEmailThread = clase (TThread)
privado
FSubject: secuencia;
protegido
el procedimiento ejecuta; invalidación;
público
el constructor crea (const ASubject: secuencia);
extremo;
constructor TEmailThread.Create (const ASubject: secuencia);
comenzar
heredado crear (verdad);
FSubject: = ASubject;
extremo;
procedimiento TEmailThread.Execute;
…
// usar el var local
IdMsg.Subject: = FSubject; // era IdMsg.Subject: = edit2.text;