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

 Delphi Discussion :

Ajouter un TProgessBar dans une procédure de recherche !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut Ajouter un TProgessBar dans une procédure de recherche !
    Bonsoir à toutes et à tous,

    Avec une ancienne procédure de recherche, j'ai un TProgessBar fait maison qui à l'air de fonctionner en utilisant un Timer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if p1.position = 100 then p1.position := 1 ;
    p1.position := p1.position +1 ;
     
    if p1.position = 100 then begin
     
    timer1.enabled := false;
    w3.Play;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.BchercherClick(Sender: TObject);
    begin
    RichEdit1.Clear;
    timer1.Enabled := true;
    ScruteDossier(Edit1.text,Edit2.Text,attributs,CheckBox8.Checked,False);
     
    end;
    Il me semble que je pourrai me passer du timer en l'incluant directement dans la procédure.

    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
     
    Procedure ScruteDossier(Dossier:string;filtre:string;attributs:integer;recursif:boolean; eff:boolean);
    var
    DossierTrouve:string;
    Resultat:Integer;
    SearchRec:TSearchRec;
    begin
      If Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
      if (eff=true) then
       ScruteFichier(Dossier,filtre,attributs,true)
      else ScruteFichier(Dossier,filtre,attributs,false);
     
      if recursif then
      begin
        Resultat:=FindFirst(Dossier+'\'+'*.*',FaDirectory,SearchRec);
        while Resultat=0 do
        begin
          if (SearchRec.Name<>'.') and (SearchRec.Name<>'..')
             and ((SearchRec.Attr and faDirectory)>0)then
          begin
            DossierTrouve:=Dossier+'\'+SearchRec.Name;
     
            // attention, souvent un memo est trop petit pour contenir tous les fichiers d'un disque dur !
            // si vous avez Delphi3 choisisez un TRichEdit vous serez moins limité
            if recursif then
             if (eff=true) then
              ScruteDossier(DossierTrouve,filtre,attributs,recursif,true)
             else ScruteDossier(DossierTrouve,filtre,attributs,recursif,false);
            Application.ProcessMessages;
          end;
          Resultat:=FindNext(SearchRec);
     
        end;
      end;
      FindClose(SearchRec);
     
    end;
    Et mes tests ne sont pas concluants.

    Si quelqu'un avait une idée.

    @+,

    Cincap

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,

    Je ne comprends pas le but du code dans la gestion du timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if p1.position = 100 then  // (1)
        p1.position := 1;
      p1.position := p1.position + 1;
     
      if p1.position = 100 then    // <=== ICI car le test (1) à vrai ne se fera jamais !
      begin
        timer1.enabled := false;
        w3.Play;
      end;
    end;
    Sinon vous pouvez ajouter dans la procédure ScruteFichier un appel à une procédure qui mettra à jour la progressbar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure UpdateP1;
    begin
      if Form1.p1.position = 100 then
        Form1.p1.position := 1 ;
      Form1.p1.position := Form1.p1.position +1 ;
     
      if Form1.p1.position = 100 then
      begin
        w3.Play;
      end;
    end;
    Notez que le code n'est pas très propre . Du fait que ce n'est pas une procédure de classe, j'appelle explicitement Form1 !
    D'autre part, cette procédure a toutes les chances d'être appelée plus souvent que si c'était par un événement OnTimer.
    Enfin, dans ce cas et contrairement à la méthode avec timer, la propriété position de la progressbar est réinitialisée dès lors que p1.position = 100...

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @Ph. B., merci pour ta réponse, j'ai donc testé et mon ProgressBar, vacille et ne joue plus son rôle.

    Quant à :

    if p1.position = 100 then // <=== ICI car le test (1) à vrai ne se fera jamais !
    Ce n'est que comme cela que le TProgessBar fonctionne avec le TTimer car si je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if p1.position = 100 then  begin// (1)
        p1.position := 1;
      p1.position := p1.position + 1;
     
        timer1.enabled := false;
        w3.Play;
      end;
    end;
    end;
    cela ne fonctionne pas.

    @+,

    Cincap

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par cincap Voir le message
    @Ph. B., merci pour ta réponse, j'ai donc testé et mon ProgressBar, vacille et ne joue plus son rôle.
    Vacille ? il tombe de la fenêtre ?

    Plus sérieusement, je voulais dire que le test (1) est inutile...
    Quand position = 100, le timer est arrêté (2° test). La procédure ne sera plus appelée. A moins que la propriété position n'ait été réinitialisé dans du code qui n'a pas été présenté ici ?

    En fait, je voudrais comprendre le but du progressbar ? rendre compte de la progression du traitement (de 0% à 100 % réalisé) ? ou montrer que le traitement est en cours tout simplement (tant que cela bouge) ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ Ph. B. oups trompé de verbe !

    rendre compte de la progression du traitement (de 0% à 100 % réalisé)
    En fait c'est cela qui m'importe.

    Pour le moment cela le fait avec le timer apparemment mais...

    @+,

    Cincap

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Ok...
    Que fait ScruteFichier(...) que l'on voit être appelé mais dont on ne voit pas le code... Sans vouloir être indiscret !

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ Ph. B., il n'y a rien d'indiscret, voici la procédure "ScruteFichier" de recherche en test :

    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
     
    Procedure ScruteFichier(Dossier:string;filtre:string;Attributs:integer; eff:boolean);
    var FichierTrouve:string;
        Resultat:Integer;
        SearchRec:TSearchRec;
    begin
      If Dossier[length(Dossier)]='\' then Dossier:=copy(Dossier,1,length(Dossier)-1);
      Resultat:=FindFirst(Dossier+'\'+filtre,Attributs,SearchRec);
      while Resultat=0 do
      begin
        Application.ProcessMessages;
        if ((SearchRec.Attr and faDirectory)<=0)
         then
        begin
          FichierTrouve:=Dossier+'\'+SearchRec.Name;
          Form1.RichEdit1.Lines.Add(FichierTrouve);
          if (eff=true) then
           DeleteFile(FichierTrouve);
        end;
        Resultat:=FindNext(SearchRec);
        Form1.beffacer.Enabled := true;
        //Form1.w3.play;
        //showmessage(inttostr(richedit1.lines.Count))
        form1.label2.caption := 'Nombre de fichiers : ' + inttostr(form1.richedit1.lines.Count);
      end;
      FindClose(SearchRec);
     
    end;
    Je préfère adapter le TProgressBar dans la procédure "ScruteDossier".

    @+,

    Cincap

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par cincap Voir le message
    Je préfère adapter le TProgressBar dans la procédure "ScruteDossier".
    Ok, mais je m'interroge (ou j'ai peut être loupé quelque chose ?) ...
    Le progressbar évolue au rythme du timer et non de la progression de la recherche.
    La corrélation initiale à 0% ne peut être que juste , mais par la suite, on ne sait à priori pas quand le traitement sera achevé. La progression affichée par le progressbar ne peut donc corréler la progression de la recherche.
    C'est pour cela que j'ai demandé les détails sur le traitement et que je me demandais si le progressbar ne servait juste qu'à indiquer que le traitement est en cours et non sa progression effective ni sa plus ou moins proche fin...

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ Ph. B., bonsoir, le but recherché est dès que je clique sur le TButton "Chercher", que le TProgressBar démarre et ne s'arrête qu'à la fin de la recherche, sans timer.

    A mon avis, avec ces procédures de recherche, ce n'est peut être pas faisable car j'ai déjà utilisé un TProgressBar dans une procédure de resize de plusieurs fichiers et cela fonctionne correctement.

    @+,

    Cincap

  10. #10
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Salut cincap,

    D'une manière générale, les Tprogressbar sont plus performants lorsqu'ils sont inclus dans un Thread détaché de la procédure principale.

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    Ils n'ont surtout de sens que s'ils représentent une mesure de la progression du traitement, en temps ou en pourcentage de réalisation.

    Pour les autres cas, une simple animation"Work in progress" suffit :
    traitement en cours.
    traitement en cours..
    traitement en cours...
    traitement en cours.
    etc
    ou une animation quelconque plus "sexy".
    Pour une recherche de fichiers, ça peut être un compteur des fichiers trouvés et/ou traités, au moyen d'une fonction CallBack dans la procédure de recherche, et grâce à ProcessMessges pour éviter un thread.
    Mais il ne convient pas d'utiliser une ProgressBar déconnectée de la réalité de ce qu'elle représente. Pour l'utilisateur, rien de plus énervant qu'une barre à 100% pendant plusieurs dizaines de secondes sans que la main soit rendue, et rien de moins honnête qu'une barre qui va disparaître à 15% (même si ça peut faire plaisir !)

  12. #12
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    et grâce à ProcessMessges pour éviter un thread.

    Le Thread est plus performant que le processmessage qui a tendance à bloquer l'application.

  13. #13
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    qui a tendance à freiner l'application.

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ cantador et @ tourlourou, en effet dans une autre application, j'utilise le Thread et le TProgressBar de couleur (PB) indique bien le début et la fin du traitement en le codant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PB.Maximum := SourceFiles.Count;
    C'est dommage qu'il n'est pas prévu sur le site d'annuler une demande comme le "Resolut".

    On va en rester la pour ne pas perdre votre temps.

    Merci à tous,

    @ Cincap

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 17h48
  2. [AC-2003] Comment ajouter un état dans une recherche multicritére
    Par galius21 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/05/2009, 15h17
  3. recherche dans une procédure Stockée
    Par alassane0101 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 13/07/2008, 04h38
  4. Recherche;ajout et suppression dans une BD via VB
    Par uvany1 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/04/2007, 17h39
  5. ajout et suppression dans une procédure
    Par sissi25 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 30/07/2006, 22h31

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