genera un nuovo filetto per l'invio dei email.
>> Può l'utente da quel momento in poi fare qualche cosa all'interno dell'applicazione?
sure. ma ci sono due cose che dovete controllare:
1. l'utente vuole rinunciare dalla vostra applicazione ma i email ancora stanno trasmettendo. In questo caso potete terminare il filetto o aspettare la relativa rifinitura
2. non cambiare query1, edit1, edit2 perché il filetto li usa
>> Che cosa se un errore accade. L'utente ancora potrà ottenere questo?
Sì, la vostra prova/tranne/showmessage ancora funziona:
prova
IdSMTP.Connect;
IdSMTP.Send (IdMsg);
tranne
Showmessage (“errore quando trasmettono email ");
estremità;
Sarebbe migliore spostare tutto esegue il metodo nella prova/tranne ugualmente come questo:
procedura TEmailThread.Execute;
varietà IdSMTP: TIdSMTP;
IdMsg: TIdMessage;
I: Numero intero;
cominciare
prova
IdSMTP: =TIdSMTP.Create (zero);
IdSMTP.Host: = ' my.domain.nl'; // sostituiscono dal vostro assistente uscente
IdSMTP.Port: =25;
IdSMTP.Username: = “MyUserName„;
IdSMTP.Password: = “MyPassword„;
prova
se non IdSMTP.Connected allora
IdSMTP.Connect;
Per la I: = 0 a Query1.Recordcount -1 fa
cominciare
se allora terminato uscire;
prova
IdMsg: =TIdMessage.Create (zero);
IdMsg.From.Address: = edit1.Text;
IdMsg.Subject: = edit2.text;
IdMsg.Recipients.EMailAddresses: = Query1.FieldByName (“email ").Text;
Inizio di // una certa funzione per rendere personale corpo per cliente
IdMsg.Body.Text: = PersonalizeEmailForCustomer;
prova
IdSMTP.Connect;
IdSMTP.Send (IdMsg);
tranne
sulla E: L'eccezione fa
Showmessage (“errore quando trasmettono email: „ + E.Message);
estremità;
infine
IdMsg.Free;
estremità;
Query1.Next;
estremità;
infine
se IdSMTP.Connected allora
IdSMTP.Disconnect;
IdSMTP.Free;
estremità;
tranne
sulla E: L'eccezione fa
Showmessage (“errore quando trasmettono email: „ + E.Message);
estremità;
estremità;
>> È ancora possibile informare l'utilizzatore finale che trasmettere ha rifinito, mostra un certo risultato?
Potete usare il messaggio di OnTerminate o
con TEmailThread.Create (allineare) fare
cominciare
OnTerminate: = ThreadOnTerminate;
FreeOnTerminate: = allineare;
Riassunto;
estremità;
procedura TMainForm.ThreadOnTerminate (ASender: TObject);
cominciare
ShowMessage (“il lavoro è fatto ");
estremità;
>> Di conseguenza devo passare in qualche modo quel soddisfare al filetto
potete passare al filetto tutti i parametri che gradite via il relativo costruttore. Per esempio:
TEmailThread = codice categoria (TThread)
riservato
FSubject: stringa;
protettivo
la procedura esegue; provvigione supplementare;
pubblico
il costruttore genera (const ASubject: stringa);
estremità;
costruttore TEmailThread.Create (const ASubject: stringa);
cominciare
ereditato generare (allineare);
FSubject: = ASubject;
estremità;
procedura TEmailThread.Execute;
…
// using la varietà locale
IdMsg.Subject: = FSubject; // era IdMsg.Subject: = edit2.text;