IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[Indy smtp] Comment avoir une PogressBar ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut [Indy smtp] Comment avoir une PogressBar ?
    bonjour,
    est-il possible de mettre une progressbar lors de l'envoi d'un fichier (avec IdSmtp)? A un moment dans ma modeste application, on peut envoyer un état créé avec rave report (en fait une commande) à un fournisseur. L'envoi dure un certain temps et je voudrais mettre une progressbar afin que l'utilisateur ne pense pas que le programme s'est planté.
    Merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Oui il est possible de rajouter une progressbar. Le Composant idSMTP déclanche trois évenements :
    1- OnWork (Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer)

    >>> permet de faire progresser ta barre avec le param aWorkCount qui indique le facteur de progression

    2- OnWorkBegin (Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCountMax: Integer);
    >>> se déclanche au début de l'émission, donc tu pourra l'utiliser pour afficher ta barre ou l'initialiser avec AWorkCountMax indiquant le max de la barre

    3- OnWorkEnd (Sender: TObject; AWorkMode: TWorkMode)
    >>> se déclanche à la fin du traitement .. pemet de faire disparaitre/remettre à zéro la barre de prog par exemple.

    Il est à noter que ces trois évenements sont dispo pour la majorité des composant Indy faisant une émission ou une réception (idFTP, idPOP3, ...)
    ce qui explique (en partie) l'existance du param AWorkMode du type TWorkMode qui indique le sens de l'opération en cours (émission ou réception, ou selon les termes Indy Read or Write)

    tiré de l'aide Indy

    TWorkMode = (wmRead, wmWrite);

    Description

    TWorkMode is an enumerated type that indicates the work mode or operation, and is used in the TWorkBeginEvent, TWorkEvent, and TWorkEndEvent events. TWorkMode can contain the values:

    wmRead - The component is reading data from the peer.
    wmWrite - The component is sending data to the peer.
    http://www.pocketmt.com GLCD Font Creator home site.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci,
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure TFMail.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
       if AWorkMode = wmWrite then
         begin
            ProgressBar1.Max := AWorkCountMax; //Maximum = taille de l'élément
            ProgressBar1.Position := 0; //Position à zéro
         end;
    end;
     
    procedure TFMail.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
       if AWorkMode = wmWrite then
         begin
           ProgressBar1.Position := AWorkCount;
         end;
    end;
     
    procedure TFMail.IdSMTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
       if AWorkMode = wmWrite then
         begin
          ProgressBar1.Position := 0;
         end;
    end;
    et évidemment, il ne se passe rien au niveau de la progressbar.
    Le fichier s'envoie mais j'oublie certainement quelque chose. y a-t-il des propriétés spéciales a ajouter sur la progressbar?
    Merci de votre aide.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    selon la taille du fichier que tu envoie, tu n'as pas le temps de voir la progressbar bougé, enleve ce que tu as mis sur le onworkend.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par Malatar
    selon la taille du fichier que tu envoie, tu n'as pas le temps de voir la progressbar bougé, enleve ce que tu as mis sur le onworkend.
    tout à fait d'accord, et dans la procedure onWork rajoute un petit :

    ProgressBar.Refresh;
    Application.ProcessEvents;


    ca ira mieux apres je pense
    http://www.pocketmt.com GLCD Font Creator home site.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci de vous donner la peine de répondre, mais désolé ca ne marche pas.

    L'envoi d'un fichier .pdf (c'est mon état créé avec rave) dure +/-entre 5 et 10 sec.

    ProgressBar.Refresh;
    Application.ProcessEvents;
    ProcessEvents n'est pas reconnu, il me manque quelque chose dans les uses?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdMessage, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, Buttons, ExtCtrls,
      ComCtrls;
    Encore merci a vous.

  7. #7
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Quand j'y pense ... Je me rapelle qu'avec une certaine version (9.xx je pense) des Indy il y avait un Bug dans le OnWorkBegin et le paramètre AWorkCountMax été tjr à 0 (vérifiez en mode debug). Dans ce cas là on remplacait le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TFMail.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
       if AWorkMode = wmWrite then
         begin
            ProgressBar1.Max := AWorkCountMax; //Maximum = taille de l'élément
            ProgressBar1.Position := 0; //Position à zéro
         end;
    end;
    par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TFMail.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
       if AWorkMode = wmWrite then
         begin
            ProgressBar1.Max := TailleFichier; //Maximum = taille de l'élément
            ProgressBar1.Position := 0; //Position à zéro
         end;
    end;
    où la TailleFichier est calculée comme celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TailleFichier := TailleFichier + TailleFichier div 3 ; 
    P.S. Vous pouvez sortit TailleMsg en facteur si vous voulez  :wink:
    parce que en codage base64 la taille est augmentée d'environ 1/3 par rapport à la taille réelle du fichier.

    Bien sûr que dans le cas d'un envoi de fichier multiple TailleFichier est la somme des tailles des fichiers
    http://www.pocketmt.com GLCD Font Creator home site.

  8. #8
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par piscine
    ProgressBar.Refresh;
    Application.ProcessEvents;
    ProcessEvents n'est pas reconnu, il me manque quelque chose dans les uses?
    Désolé ... c'était Application.ProcessMessages
    http://www.pocketmt.com GLCD Font Creator home site.

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Es tu sûr que AWorkMode est bien a wmWrite ?
    Essais sans le if.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    à Malatar :
    Es tu sûr que AWorkMode est bien a wmWrite ?
    oui, oui
    :
    Essais sans le if
    tjs pas

    à octal :
    c'était Application.ProcessMessages
    j'avais déja essayé, désolé

    en tout cas merci à tous les deux encore une fois, je vais esssayer avec
    Code:

    procedure TFMail.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCountMax: Integer);
    begin
    if AWorkMode = wmWrite then
    begin
    ProgressBar1.Max := TailleFichier;
    ProgressBar1.Position := 0
    end;
    a+

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Es tu sûr que ta piece jointe est bien mise dasn ton composant IDMessage ?

    Car un mail uniquement Text tu verras meme pas la progressbar se deplacer.

    De plus je crois qu'il y a un soucis avec un IDMessage au format HTML + Piece jointe. quand le texte est au format HTML la piece jointe disparait.
    Autant ton problème vient de la.

    Fait une recherche sur le forum sur smtp ou idmessage, y a un post qui en parle
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Je crois bien que oui. voici mon code de l'évenement envoyer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    procedure TFMail.BEnvoyerClick(Sender: TObject);
    Var
      IdSMTP1: TIdSMTP;
      IdMessage1: TIdMessage;
      idText2: TidText;
      p: TidMessageParts;
      MyBody:TStrings;
    Begin
         if (messagedlg('Voulez-vous envoyer cette commande?',mtconfirmation,[mbok,mbcancel],0) = mrok) then
            begin
              IdMessage1:=TIdMessage.Create(nil);
              IdSMTP1:=TIdSMTP.Create(nil);
     
              p := idMessage1.MessageParts;
              MyBody:=TStringlist.create;
              MyBody.Add('<b>Mon message </b>');
     
              idText2 := TidText.Create(p);
              idText2.ContentType := 'text/plain';
              idText2.Body.Text := mMessage.text;
     
              With IdMessage1 do
                Begin
                  CharSet:='iso-8859-1';
                  Encoding:=meMIME;
                  ContentType:= 'multipart/mixed';
                  From.Text:=eExp.text;
                  Body.Text := mMessage.Text;
     
                  Recipients.EMailAddresses:=eDestin.text;
                  Subject:=eObjet.text;
     
                  TIdAttachment.Create(IdMessage1.MessageParts,opendialog1.FileName);
                End;
              with IdSMTP1 do
              begin
                  Host:='relay.skynet.be';
                  Connect(300);
                  try
                    send(IdMessage1);
                    showmessage('La commande a bien été envoyée.');
                  finally
                    Disconnect;
                  End;
                    IdMessage1.Free;
                    Free;
              end;
            end
            else
              begin
                FMail.Refresh;
                LFichJoint.Caption := '';
              end;
    end;
    Le fichier envoyé est en format .pdf, il s'envoie bien, le destinataire recoit l'objet, le texte du message et le fichier en .pdf. merci encore

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    alors un oubli, à tout seigneur, tout honneur, "mon code" provient de la faq delphi.

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Normal que cela ne fonctionne pas, vu que tu crées dynamiquement le composant IDsmtp et que tu ne lies pas les événements a ce composant .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IdSMTP1:=TIdSMTP.Create(nil); 
    IdSMTP1.OnWork := IdSMTP1Work;
    idSMTP1.OnWorkBegin := IdSMTP1WorkBegin;
    idSMTP1.OnWorkEnd := IdSMTP1WorkEnd;
    Tu ne fais jamais appel aux événements ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    ben ca ne marche toujours pas, mais est-ce que ce n'est pas la même chose de les définir dans les évevènements de l'inspecteur d'objet?

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Si tu as posé ton composant IDSMTP sur une form, tu n'as aucunement besoin de le créer dynamiquement.

    Moi je te conseil

    1 - de poser un composant IDSMTP sur la form
    2 - de virer la creation dynamique ( TIDSMPT.create(nil))
    3 - de nommer le composant IDSMTP en IDSMTP1 (normalement pas besoin mais au cas ou.
    4 - de virer les if dans tes evenements.
    5 - de lier tes evenements au composant

    Normalement ca devrait fonctionner, j'ai toujours utilisé comme ça et j'ai jamais eu de problème.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/10/2005, 13h01
  2. Comment avoir une fonction à deux résultats ?
    Par xenos dans le forum Langage
    Réponses: 9
    Dernier message: 02/10/2005, 10h32
  3. Comment avoir une référence sur une Vue
    Par Philippe299 dans le forum MFC
    Réponses: 1
    Dernier message: 12/08/2005, 10h03
  4. [Qreport] Comment avoir une preview personnalisée ?
    Par jcharles dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/05/2005, 09h14
  5. [eclipse][plugin] Comment avoir une fenêtre avec focus
    Par relivio dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/04/2004, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo