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

Bases de données Delphi Discussion :

Application.ProcessMessages dans une table


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut Application.ProcessMessages dans une table
    J'ai vu code dans le faq delphi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.ButtonMarcheClick(Sender: TObject);
    var i : integer;
    begin
      { Mise à faux de l'arrêt }
      Stop := False;
      I    := 0;
      { Traitement long }
      Repeat
        Inc(i);
        Label1.Caption := IntToStr(i);
        { Mise à jour des évènements en attente }
        Application.ProcessMessages;
      Until (i >= 100000000) or stop
    end;
    Par exemple, comment faire compter le nombre d'enregistrement dans une table en utilisant le code ci-dessus afin que l'utilisateur puisse suivre le déroulement du traitement ?
    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonsoir

    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
     
    procedure TForm1.ButtonMarcheClick(Sender: TObject);
    var i : integer;
    begin
      i := 0;
      Stop := False;
      with tatable do begin  //  active
        first;
        while not eof and stop do begin
          inc(i);
          edit1.text := IntToStr (i);
          Application.ProcessMessages;
          next;
        end;
      end;
    en fonction de la taille de ta table ça risque d'être long et illisible
    sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.ButtonMarcheClick(Sender: TObject);
    begin
       edit1.text := IntToStr (tatable.recordcount);
    end;
    sera beaucoup plus rapide!

    à plus!

  3. #3
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Merci à toi.
    Voici ce que je constate pour le premier code :rien ne se passe quand je clique sur le bouton, le Edit1 reste vide.
    Pour le second code(Matable.recordcount), quand on clique sur le bouton, il affiche directement le nombre, sans qu'on ne voit voit l'incrémentation se dérouler dans le Edit1; comme le ferai Application.ProcessMessage;

  4. #4
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonjour
    ça va être dûr, car je viens de voir sur le forum delphi:

    le Application.ProcessMessages ne sert qu'a laisser passer les messages windows pour le rafraichissement de ta form et les applications à coté.
    il faut faire un essai avec un DbEdit (sans disablecontrol)

    à plus!

  5. #5
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Alors là, ca va être difficile pour moi. Car tu viens de me parler de quelque chose de nouveau, à savoir l'usage de DBEdit(sans disablecontrol).
    Si ce n'est pas trop vous demander, pouvez-vous me donner un exemple?
    Merci.

  6. #6
    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
    Citation Envoyé par banban54
    bonjour
    ça va être dûr, car je viens de voir sur le forum delphi:
    le Application.ProcessMessages ne sert qu'a laisser passer les messages windows pour le rafraichissement de ta form et les applications à coté.
    Tient, je crois que c'est moi qui est écrit cela

    Sinon pour revenir sur le sujet, Sondo :

    - Qu'est ce que tu veux montrer à l'utilisateur ?
    - La progression du traitement quand tu fais un table.open ?
    - Afficher le nombre d'enregistrements de la table ?
    - Faire défiler les nombres dans un label de 0 jusqu'au nombre d'enregistrements de la table ?

  7. #7
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    voilà ce que je veux en premier :
    - Faire défiler les nombres dans un label de 0 jusqu'au nombre d'enregistrements de la table.
    Deuxièmement :
    - Si possible voir La progression du traitement quand tu fais un table.open.
    Merci.

  8. #8
    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
    Citation Envoyé par sondo
    voilà ce que je veux en premier :
    - Faire défiler les nombres dans un label de 0 jusqu'au nombre d'enregistrements de la table.
    Je vois pas trop l'interêt mais bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var 
      i : integer;
    begin
      i := 0;
      LaTable.First;
      While not LaTable.EOF do
      begin
        Inc(i);     
        LeLabel.Caption := intToStr(i);
        Application.ProcessMessages;
        LaTable.Next;
      end;
    end;
    Citation Envoyé par sondo
    Deuxièmement :
    - Si possible voir La progression du traitement quand tu fais un table.open.
    Merci.
    Avec les composants BDE, je ne sais pas s'il existe un moyen, avec les composants ADO, il y a une possibilité -> une QR que je sui en train d'écrire


    [QR] Comment utiliser une progressbar avec un TAdoQuery ?

    Afin de pouvoir utiliser un AdoQuery avec un composant de type ProgressBar, il faut configurer les options du composant, afin de le rendre asynchrone, de la manière suivante :

    Propriété ExecuteOptions :
    • eoAsyncExecute à True
    • eoAsyncFetchNonBlockinng à True


    Grace à cette configuration vous pouvez maintenant utiliser les deux événements onFecthProgress et OnFetchComplete

    Ci-dessous un exemple d'utilisation :

    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
     
    procedure TfrmMain.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
      MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Max:= MaxProgress;
      ProgressBar1.Position := Progress;
      Application.ProcessMessages;
    end;
     
    procedure TfrmMain.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
      const Error: Error; var EventStatus: TEventStatus);
    begin
      // La requete est terminée, alors on passe à vrai la variable pour laisser le programme continuer
      bMaVarGlobal := True; 
    end;
    Le code pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    bMaVarGlobal := False; 
    With AdoQuery do
    begin
      Close;
      // Ici le SQL
      Open;
      // On attend que la requete se termine pour continuer
      While not bMaVarGlobal do
        Application.ProcessMessages;
    end;

  9. #9
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    @Malatar
    Tient, je crois que c'est moi qui est écrit cela
    c'est vrai, comme quoi ce que tu dis est interressant!

    @sondo
    pour le bout de programme j'ai repri ton exemple, en fait ça ne fonctionnait pas à cause du 'stop':
    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
    procedure TForm1.ButtonMarcheClick(Sender: TObject);
    var i : integer;
    begin
      i := 0;
    //  Stop := False;
      with tatable do begin  //  active
        ProgressBar1.Max:= RecordCount;
        first;
        while not eof {and stop} do begin
          inc(i);
          edit1.text := IntToStr (i);
          ProgressBar1.Position:= i;
          Application.ProcessMessages;
          next;
        end;
      end;
    end;
    fonctionne trés bien, mais j'arrive un peu tard après Malatar
    à plus

  10. #10
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Merci bien, ca marche.
    Pour le TAdoQuery, je vais faire un test pour voir.
    Encore merci.

  11. #11
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Bon courage à vous.
    Je crois tu trouvera un moyen avec les composants BDE. Je ne connais vraiment pas ADO et je vais profiter pour apprendre. Bref merci beaucoup.

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Juste pour préciser :
    en fonction de la taille de ta table ça risque d'être long et illisible
    sinon:

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.ButtonMarcheClick(Sender: TObject);
    begin
       edit1.text := IntToStr (tatable.recordcount);
    end;
    sera beaucoup plus rapide!
    Euh oui sauf que le recordcount sur les query ou sur les Ttable fetch toutes les données de ta requête et donc ramène tout sur le poste client. Ce sera donc plus rapide en développement mais pas en exécution. A moins que ce problème ne soit constaté que sur les TTable et les TQuery mais pour prendre de bonnes habitudes et ne pas se poser la question il vaut mieux éviter de placer des recordcount à droite et à gauche, sauf évetuellement sur des clientdataset qui fonctionne avec les données du cache...

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

Discussions similaires

  1. Déterminer la Valeur la plus grande dans une table
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/08/2014, 23h35
  2. Réponses: 3
    Dernier message: 26/03/2009, 15h08
  3. Réponses: 7
    Dernier message: 29/09/2008, 15h44
  4. Recherche de donnee dans une table associée
    Par josoft dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2003, 15h22
  5. Comment stocker un ficher dans une table postgres
    Par josoft dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/06/2003, 16h41

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