Bonjour tout le monde![]()
J'ai crée une petite fenêtre qui se lance lorsque l'utilisateur clique sur un bouton afin d'envoyer un email, avec un fichier en pièce jointe.
Cette fenêtre a pour but de faire patienter l'utilisateur : affichage de la progression du traitement de l'envoi de l'email. J'utilise pour cela le composant TCGauge (onglets Samples), car il me permet d'afficher la progression en % .
Je pense que la Progress Bar aurait également fait l'affaire.
Pour envoyer l'email j'utilise le composant TIdSMTP (onglets Indy Clients).
Mon probleme est le suivant : l'email arrive bien a destination ainsi que sa pièce jointe, j'arrive à faire progresser ma barre en temps réel, mais pas de manière proportionnelle !
Je m'explique : le but du jeu est d'afficher je pense dans ma jauge de progression, l'état à un instant T du nombre d'octets envoyés.
Sur le composant TIdSMTP , il existe 3 événements :
- OnWorkBegin : appelé dès que j'envoie l'email
- OnWork : appelé à plusieurs reprises lors du traitement d'envoi d'email
- OnWorkEnd : lorsque l'envoi est terminé
J'ai donc eu l'idée de mesurer avant d'envoyer un email, la taille en octets du fichier joint.
Je recupère cette taille, et j'affecte donc à ma jauge sur le WorkBegin, la valeur maximum, en positionnant la valeur de départ à 0
A noter que la valeur "AWorkCountMax" passée en paramètre me renvoie 0, donc je ne vois pas trop a quoi celle-ci peut me servir ... Pourtant dans l'aide cette variable est censée représenter le nombre d'octets qui vont être envoyés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void __fastcall TfrmEnvoiEmail::SMTPConnecWorkBegin(TObject *Sender, TWorkMode AWorkMode, const int AWorkCountMax) { cggeProgress->Progress = 0; cggeProgress->MaxValue = TailleFicJoint; }
Sur le Work, j'actualise ma barre de la sorte (et c'est ici que je nécessite votre aide)
Cette incrémentation est totalement arbitraire, je pense qu'il faut que j'utilise la valeur AWorkCount qui devrait me renvoyer le nombre d'octets déja envoyés à cet instant T.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void __fastcall TfrmEnvoiEmail::SMTPConnecWork(TObject *Sender, TWorkMode AWorkMode, const int AWorkCount) { cggeProgress->Progress += cggeProgress->MaxValue*0.01; }
Le problème c'est que vers la fin de l'envoi, cette valeur est SUPERIEURE à la taille en octet de mon fichier joint. Je pense que ceci est normal, puisqu"il y a également les informations comme le corps du message, l'adresse expediteur, l'adresse destinataire etc ...
Alors comment faire pour calculer équitablement et proportionnellement la progression de l'envoi ? Comment connaitre à l'avance le nombre d'octets TOTAL qui vont être envoyés ? (j'ai déja la taille du fichier, comment recupérer la taille des informations "textes" de l'email ...) ??
Sur le WorkEnd, bien sûr je fais :
Si quelqu'un a déja été confronté à cette problématique, je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void __fastcall TfrmEnvoiEmail::SMTPConnecWorkEnd(TObject *Sender, TWorkMode AWorkMode) { cggeProgress->Progress = cggeProgress->MaxValue; }
Car en effet, même si ma jauge progresse, son avancement de représente pas le réel état du traitement ... la jauge va par exemple sur un fichier joint de 2 Mo mettre 20 secondes pour arriver à 60%, pui hop sauter en l'espace de 2 secondes à 100%. Certes pour l'utilisateur, cela ne change pas grand chose, mais étant perfectionniste, j'aimerais améliorer tout cela![]()
Merci d'avance![]()
Partager