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

Langage Delphi Discussion :

Comment annuler une opération en cours ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut Comment annuler une opération en cours ?
    Bonjour,
    Est t'il possible de faire en sorte que l'utilisateur puisse agir sur l'interface pendant une opération afin de l'annuler (quand le curseur prend la forme d'un sablier)?
    Par exemple lors de l'exécution d'une requête longue ou bien lors d'un tri de valeur dans un énorme tableau.

    Merci

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Oui c'est possible en utilisant Application.ProcessMessages et une variable générale...
    Sur le OnClick du bouton Annuler, tu mets:
    et dans le traitement, tu vérifie le plus souvent possible si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if Variable then //le ctraitement peut continuer
    Pour que le traitement du OnClick du bouton soit effectué, il faut faire des Application.ProcessMessages dans le traitement... N'oublie pas non plus d'initialiser Variable à true avant de commencer

    Il y a aussi la méthode des threads...

  3. #3
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Ok, compris pour la première méthode. Je te remercie. En quelque sorte il faut forcer l'application à écouter de temps en temps ce qui se passe dans la fenêtre.

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par Sydaze
    Je te remercie. En quelque sorte il faut forcer l'application à écouter de temps en temps ce qui se passe dans la fenêtre.
    C'est exactement ça: Application.ProcessMessages provoque le traitement des messages en attente... Donc le click du bouton, ou un Repaint, etc.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    ca ne fonctionne pas car je ne parviens pas à cliquer sur le bouton pendant le traitement, donc la variable ne passe pas à false.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 455
    Points : 5 900
    Points
    5 900
    Par défaut
    salut

    lors d'une requette ton appli n'as plus la main
    vu que tu demande a un serveur

    j'avais vu une methode a l'aide thread mais je ne peut plus te dire ou

    @+ Phil

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Est-ce que tu fais des Application.ProcessMessages le plus souvent possible pendant le traitement?

  8. #8
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Bonjour,

    il faut passer sur l'instruction pendant ton traitement, par exemple si ton traitement comprend une boucle, il faut appeler application.processmessage dans cette boucle.

    par contre, çà augment le temps de traitement

  9. #9
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    oui j'en ai mis pas mal mais rien n'y fait, l'appli ne veux pas laisser le click du bouton s'effectuer.
    arg... le faite que cela soit une requete pourrait expliquer cela

  10. #10
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    J'ai placé un TactionList et la ça fonctionne sur l'appuie d'une touche, lorsque le premier Application.ProcessMessages est atteint le traitement est quitté ce qui montre que l'appuie d'une touche est prise en compte.
    Apparemment le problème vient du fait que l'application ne me laisse pas cliquer sur le bouton pendant le traitement.

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par Sydaze
    Apparemment le problème vient du fait que l'application ne me laisse pas cliquer sur le bouton pendant le traitement.
    C'est étonnant... Normalement, c'est à ça que sert Application.Processmessages... Tu pourrais montrer un peu de code? En particulier, le code de traitement (écourté) pui le OnClick du bouton...

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Points : 8 513
    Points
    8 513
    Par défaut
    Si tu utilises des composants ADO pour tes requetes, il te suffit de passer le composant ADO en mode asynchrone pour eviter le bloquage de l'appli.
    Après il te reste a mettre en route une fonction d'annulation de la requete quand tu clics sur le bouton.

  13. #13
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Oui bien sur:

    -Pour le traitement :
    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
    55
    for i := 0 to numart - 1 do
      begin
      application.ProcessMessages;
      codice := qrystamp.Fields[0].AsString;
      if ling = 'Italiano' then
       begin
       ekrtf1.OutFile := dirstec +  '\Temp\Italiano\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.doc';
       pdftempout :=  dirstec +  '\Temp\Italiano\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.pdf';
      application.ProcessMessages;
       prelim;
      application.ProcessMessages;
       end
      else if ling = 'Inglese' then
       begin
       ekrtf1.OutFile := dirstec +  '\Temp\Inglese\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.doc';
       pdftempout :=  dirstec +  '\Temp\Inglese\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.pdf';
      application.ProcessMessages;
       prelimENG;
      application.ProcessMessages;
       end
      else if ling = 'Francese' then
       begin
       ekrtf1.OutFile := dirstec +  '\Temp\Francese\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.doc';
       pdftempout :=  dirstec +  '\Temp\Francese\' + ansirightstr(codice,4) + '_' + mskTot.Text + '.pdf';
      application.ProcessMessages;
       prelimENG;
      application.ProcessMessages;
       end;
      //pour generer le PDF
      if chkPDF.Checked = true then
      begin
         SetPDFReg (0);
            period := true;
            ekrtf1.Execute([Qryvalnutr,Qrychim,qrymicro,qrycompo,qrycompo1,qryorgan,qrydim,
            qrycons,qrynote,qryconf,qryimgACCEP,qryimgRIGEP,qryimgBERSP,qryimgACCEK,qryimgRIGEK,qryimgBERSK,qrypack1,
            qrypack2,qrypack3,qrypack4,qrypack5,qrypack6]);
            period := false;
      end;
      if (rdSstand.Checked = true) and (chkPDF.Checked = false) then
        begin
          ekrtf1.Execute([Qryvalnutr,Qrychim,qrymicro,qrycompo,qrycompo1,qryorgan,qrydim,
            qrycons,qrynote,qryconf,qryimgACCEP,qryimgRIGEP,qryimgBERSP,qryimgACCEK,qryimgRIGEK,qryimgBERSK,qrypack1,
            qrypack2,qrypack3,qrypack4,qrypack5,qrypack6]);
        end;
      ekrtf1.VarList.Clear;
      scprog.Position := scprog.Position + 1;
      application.ProcessMessages;
      if mgannuler = true then
      begin
        toolbutton10.Enabled  := false;
        label8.Visible := false;
        break;
      end;
      qrystamp.Next;
      end;
    -Pour le boutton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TfrmSchede.ToolButton10Click(Sender: TObject);
    begin
      mgannuler := true;
    end;

    les fonctions prelim et prelimENG effectue chaqune une vingtaine de requete SQL

  14. #14
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    J'utilise les composants BDE pour les requete... je suis quasiment sur que c'est la que ca bloque, l'execution de la requete prend vraiment toute la main

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 455
    Points : 5 900
    Points
    5 900
    Par défaut
    salut

    regarde cet article
    cela te donnera une idée de ce que tu doit faire

    http://bloon.developpez.com/articles...requetethread/
    ou celui la
    http://bdn.borland.com/article/0,1410,16231,00.html

    @+ Phil

  16. #16
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Génial, ça fonctionne, merci.
    Par simple curiosité, comment fait t'on pour accéder à tous les articles d'un thème? par exemple dans ce cas Delphi car je ne trouve pas cet article dans la liste proposée quand on clique sur l'onglet Delphi.

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Points : 8 513
    Points
    8 513
    Par défaut
    Citation Envoyé par Sydaze
    les fonctions prelim et prelimENG effectue chaqune une vingtaine de requete SQL
    Est ce qu'il ne vaudrait pas mieux optimiser ces deux fonctions, car faire 20 requetes, c'est clair que ca te bouffe un max de temps.
    Il n'y a pas moyen de reduire le nombre de requetes, ca fera surement gagner pas mal de temps.

  18. #18
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Non je ne peu pas optimiser le nombre de requêtes, en fait j'utilise TEkrtf pour éditer un document à partir de la base de donnée et chaque section du document édité est représenté par un dataset qui lui même est lié à un composant TQuery. Les requetes sont donc incontournables.

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

Discussions similaires

  1. comment annuler une opération
    Par lila23 dans le forum Débuter
    Réponses: 6
    Dernier message: 13/04/2009, 18h07
  2. Comment annuler une entrée clavier?
    Par doudine dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 17/02/2006, 12h22
  3. Annuler une opération
    Par Bourak dans le forum Langage
    Réponses: 4
    Dernier message: 26/12/2005, 16h04
  4. annuler une impression en cour
    Par mondanikoffi dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/07/2005, 21h56
  5. [Info]comment annuler une Externalization string?
    Par car dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 17/04/2005, 10h51

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