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 :

Interface qui fige à l'execution d'une boucle


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut Interface qui fige à l'execution d'une boucle
    Bonjour,

    J'ai un petit souci sous Delphi pour Win32.

    Dans mon code, j'ai une boucle qui doit tourner un très grand nombre de fois.

    Mais lors de ce traitement, l'interface de mon application se fige.

    Je souhaiterais mettre à disposition de l'utilisateur du programme un bouton pour annuler le traitement (ou action sur le bouton [Echap] du clavier).

    Comment puis je m'y prendre ?

    Si vous avez une solution simple, car je débute en Delphi.

    Peut être placer la boucle dans un thread spécifique ? Comment fait-on ?

    Libérer des ressources pour l'interface ?

    Je vous remercie de votre aide.

    Par contre, je dois présenter une 1ère version opérationnelle de mon application pour début de semaine prochaine donc si je pouvais avoir un peu d'aide rapidement, je vous en serait reconnaissant.

    Merci bien

    Cordialement,

    Naga

  2. #2
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 65
    Points : 64
    Points
    64
    Par défaut
    Salut, pour mieux débuter je crois qu'il faut télécharger la FAQ. Il y a la réponse à ta question dedans.
    Les vrais informaticiens n'ont pas d'attaché-case ; leur tête suffit à transporter leurs connaissances.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Oki, je vais matter, je te remercie.

    Naga

  4. #4
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    En particulier, regarde du côté de keypressed. Ça devrait te permettre d'avancer.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut,

    J'utilise la méthodologie suivante (indiquée dans la FAQ) avec une ProgressBarre. :

    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
    var
      I : Integer;
      Stop : Boolean;
     
    procedure TForm_Principale.Button_ChargerGWSClick(Sender: TObject);
    begin
      Stop := False;
      While (I < Memo_FichierGWS.Lines.Count) do
      begin with ProgressBar_AnalyseFichierGWS do
        if (Stop = True) then begin break; Exit; end;
        ProgressBar_AnalyseFichierGWS.Position := I;
        // ...
     
        Application.ProcessMessages;
        Inc(I);
      end;
     
    procedure TForm_Principale.Button_AnnulerChargementClick(Sender: TObject);
    begin
      Stop := True;
      ProgressBar_AnalyseFichierGWS.Position := 0;
    end;
    Apparement ça marche bien, je vais aussi matter keypressed.

    Sinon pour le bouton [Echap], j'utilise un événement dans ma form :

    Déclaration de 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
        procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
     
    procedure TForm_Principale.FormCreate(Sender: TObject);
    begin
      KeyPreview := True;
      ...
    end;
     
    procedure TForm_Principale.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if (Key = VK_ESCAPE) then Form_Principale.Btn_Quitter.Click; //Application.Terminate;
    end;
    Penser à associer cette procédure dans l'événement "OnKeyDown" de la form.





    Sinon une autre petite question, est-il possible de récupérer la date (et heure) de la compilation pour l'intégrer dans un Tlabel par exemple ?
    Ca me permettra de gérer (en plus de la version) l'historique de mon EXE.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    L'Exit ne sera jamais appelé après le Break ! Tu peux supprimer l'un des deux.
    Et même simplifier l'ensemble (le with ne sert manifestement à rien):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Stop := False;
    I := 0;
     
    While (I < Memo_FichierGWS.Lines.Count) and not Stop do
    begin 
      ProgressBar_AnalyseFichierGWS.Position := I;
      // ...
      Application.ProcessMessages;
      Inc(I);
    end;
    Citation Envoyé par Naga2 Voir le message
    Penser à associer cette procédure dans l'événement "OnKeyDown" de la form.
    Utilise OnKeyUp sinon ton événement vas être appelé sans discontinuer si tu gardes la touche pressée .

    Regarde FileAge pour l'heure/date de compilation.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut, merci pour ces pistes.

    Le with, a priori, est utilisé pour la TProgressBar, je l'ai mis conformément à un exemple que l'on m'avait donné auparavant.

    Ceci dit, il est peut-être inutile, je ferais le teste demain.

    Je vais voir pour FileAge et OnKeyUp.

    Dans un TMemo, est-il possible d'enregistrer une partie du mémo (de la ligne n° a à la n° b) dans un 1er fichier texte, puis ensuite de la ligne n° b+1 à la ligne n° d dans un 2ème fichier, .... ? Je ne connais pas d'avance le nombre de fichiers ainsi générés, par contre je peux connaitre les valeurs de a, b, c, .... En gros scinder le contenu d'un mémo en plusieurs fichiers.

    Je pense qu'il y a plus simple pour scinder un contenu sans passer par un TMemo, mais malheureusement, je ne peux pas faire autrement (j'ai des valeurs à modifier pendant le scindage).

    J'espère être un tout petit peu clair

    Naga

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut à tous,

    Suite à mon développement d'aujourd'hui, j'ai quelques petites questions :

    Question 1 :
    Comment puis-je récupérer le contenu d'une variable Char pour le mettre dans une variable String et vice versa ?

    Question 2 :
    Soit une variable de type Real dont je récupère la valeur à partir d'une string (StrToFloat) ensuite je fais un petit calcul puis je la reconvertis en string (FloatToStr). Mais cette manipulation supprime au passage le(s) zéro(s) non significatif(s) (1.4550 devient 1.455). Or je souhaiterais conserver ces zéros (pour des raisons de pagination), comment puis-je faire simplement ?
    Pour infos ce traitement est inclus dans une boucle qui peut tourner plusieurs centaines de milliers de fois.

    Question 3 :
    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm_Principale.Edit_PasIncrementationZOnKeyPress(Sender: TObject; var Key: Char);
    begin
      if not (Key in ['0'..'9', DecimalSeparator]) then // voir quelles saisies sont autorisées ou pas
      begin
        ShowMessage('Seuls les chiffres et le séparateur décimal "' + DecimalSeparator + '" sont autorisé.');
        Key := #0; // Ignorer les mauvaises saisies
      end;
    end;
    Ce code a pour but d'interdire à l'utilisateur de rentrer autre chose que des chiffres et un caractère de séparation décimal.
    Malheureusement, il bloque les combinaisons suivantes :
    Ctrl + C
    Ctrl + X
    Ctrl + V
    Backspace
    Suppr
    Or je souhaite les autoriser, comment puis-je faire ?

    Voila c'est tout pour le moment.

    Si vous avez des réponses à ces petites questions, je vous en serait reconnaissant.

    Merci bien,

    Naga

  9. #9
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Citation Envoyé par Naga2 Voir le message
    Salut à tous,

    Question 1 :
    Comment puis-je récupérer le contenu d'une variable Char pour le mettre dans une variable String et vice versa ?


    Naga
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var 
     cIn,cOut : char;
     sIn,sOut : string;
    begin
      cIn := 'R';
      sIn :='TTTTTTT';
      if length(sIn) >0 then 
        cOut := sIn[1]
      else
        cOut := '?';
      sOut := cIn;
    end;

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut philnext, merci, c'est tout bête en faite.

    Naga

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut a tous,

    Quelqu'un a t'il quelques petites réponses à m'apporter pour mes autres questions (voir rappel ci-dessous) ?

    Je dois fournir un 1er jus de mon application en milieu de semaine.

    Merci beaucoup.

    Rappel :

    Question 2 :
    Soit une variable de type Real dont je récupère la valeur à partir d'une string (StrToFloat) ensuite je fais un petit calcul puis je la reconvertis en string (FloatToStr). Mais cette manipulation supprime au passage le(s) zéro(s) non significatif(s) (1.4550 devient 1.455). Or je souhaiterais conserver ces zéros (pour des raisons de pagination), comment puis-je faire simplement ?
    Pour infos ce traitement est inclus dans une boucle qui peut tourner plusieurs centaines de milliers de fois.

    Question 3 :
    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm_Principale.Edit_PasIncrementationZOnKeyPress(Sender: TObject; var Key: Char);
    begin
      if not (Key in ['0'..'9', DecimalSeparator]) then // voir quelles saisies sont autorisées ou pas
      begin
        ShowMessage('Seuls les chiffres et le séparateur décimal "' + DecimalSeparator + '" sont autorisé.');
        Key := #0; // Ignorer les mauvaises saisies
      end;
    end;
    Ce code a pour but d'interdire à l'utilisateur de rentrer autre chose que des chiffres et un caractère de séparation décimal.
    Malheureusement, il bloque les combinaisons suivantes :
    Ctrl + C
    Ctrl + X
    Ctrl + V
    Backspace
    Suppr
    Or je souhaite les autoriser, comment puis-je faire ?

  12. #12
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Question 3 :
    Ben... tu les ajoutes à la liste (genre #3,#8...).
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut ALT,

    As-tu une liste complète des codes spéciaux # ?

    Et pour les combinaisons de touches, comment les gères t'on ? Ce sont aussi des codes #.. ?

    Ctrl + C par exemple.

    Merci bien

    Naga

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Question 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormatFloat('#,##0.0000');
    Citation Envoyé par Naga2 Voir le message
    Pour infos ce traitement est inclus dans une boucle qui peut tourner plusieurs centaines de milliers de fois.
    Ne fais surtout pas une conversion systématique, mais uniquement lorsque tu as besoin de l'afficher.

    Question 3:
    1. Il suffit de regarder l'état actuel de la touche Ctrl.
    2. Maintenant, ta procédure contrôle uniquement le caractère et non que la valeur réelle résultante soit valide. Ton code va accepter 1.455.0..123, ce qui te générera une belle exception. Tiens et en parlant d'exception, pourquoi ne pas la provoquer .


    Et à l'arrivée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm_Principale.Edit_PasIncrementationZOnKeyPress(Sender: TObject; var Key: Char);
    begin
      //Ctrl pressé ?...
      if GetKeyState(VK_CONTROL) and $80000000 = 0 then
        //...non
        Try
          //Convertible en réel ?...
          StrToFloat(TEdit(Sender).Text +Key);
        except
          //...non => caractère refusé !
          Key := #0;
        end;
    end;

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut Andnotor, merci pour ces éclaircissements :

    Citation Envoyé par Andnotor Voir le message
    Question 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormatFloat('#,##0.0000');


    Ne fais surtout pas une conversion systématique, mais uniquement lorsque tu as besoin de l'afficher.
    En fait je ne convertis que les valeurs que je dois traiter mathématiquement, les autres valeurs restent sous la forme String.

    Citation Envoyé par Andnotor Voir le message
    Question 3:
    1. Il suffit de regarder l'état actuel de la touche Ctrl.
    2. Maintenant, ta procédure contrôle uniquement le caractère et non que la valeur réelle résultante soit valide. Ton code va accepter 1.455.0..123, ce qui te générera une belle exception. Tiens et en parlant d'exception, pourquoi ne pas la provoquer .

    Exacte, je n'y ai pas pensé (pas bien ça).

    Citation Envoyé par Andnotor Voir le message
    Et à l'arrivée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm_Principale.Edit_PasIncrementationZOnKeyPress(Sender: TObject; var Key: Char);
    begin
      //Ctrl pressé ?...
      if GetKeyState(VK_CONTROL) and $80000000 = 0 then
        //...non
        Try
          //Convertible en réel ?...
          StrToFloat(TEdit(Sender).Text +Key);
        except
          //...non => caractère refusé !
          Key := #0;
        end;
    end;
    Il y a 2 - 3 petites choses qui m'échappent :

    Je ne comprend pas bien ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if GetKeyState(VK_CONTROL) and $80000000 = 0 then
    Qu'apporte le "Sender' dans le code ci-dessous ?
    Merci bien,

    Naga

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    En fait je ne convertis que les valeurs que je dois traiter mathématiquement, les autres valeurs restent sous la forme String.
    C'est l'inverse de FormatFloat , donc attention, tu fais (peut-être) une double conversion

    GetKeyState renvoi l'état de la touche (pressé, toggled). Si tu regardes l'aide sur cette fonction, tu verras que si le bit de poids fort est à 1, la touche est pressée.

    Donc, GetKeyState(VK_CONTROL) and $80000000 = 0 teste que la touche soit relâchée. On aurait aussi pu faire GetKeyState(VK_CONTROL) > -1. Mais personnellement, je préfaire tester le bit.

    TEdit(Sender) te permet d'assigner le même événement sur plusieurs TEdit. Il est clair que si tu en a qu'un à tester, tu pourrais écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm_Principale.Edit_PasIncrementationZOnKeyPress(Sender: TObject; var Key: Char);
    begin
      //Ctrl pressé ?...
      if GetKeyState(VK_CONTROL) and $80000000 = 0 then
        //...non
        Try
          //Convertible en réel ?...
          StrToFloat(Edit_PasIncrementationZ.Text +Key);
        except
          //...non => caractère refusé !
          Key := #0;
        end;
    end;

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Super, je vais mater ceci demain, je pense pouvoir sortir une version à peu près potable de la moulinette demain soir (j'espère sinon j'en connais un qui ne sera pas content ).

    Grâce à votre aide précieuse, j'ai réussi à développer un programme qui correspond aux besoins du chef. Il n'est certainement pas très optimisé (voir mal codé pour un pro) mais c'est normal pour un débutant me direz-vous (heu je parle du programme, pas du chef, mais ça c'est une autre histoire).

    Ceci dit, je pense que ça devrait pas trop mal marcher (les Btesteurs me diront ça).

    Naga

Discussions similaires

  1. ShowMessage qui modifie l'exécution d'une boucle
    Par OutOfRange dans le forum Langage
    Réponses: 11
    Dernier message: 14/07/2009, 01h45
  2. Programme qui ne repond plus durant une boucle
    Par Gorjeck dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/05/2008, 11h48
  3. Réponses: 23
    Dernier message: 05/09/2007, 11h53
  4. Réponses: 4
    Dernier message: 22/11/2006, 17h14
  5. pause dans l'execution d'une boucle...
    Par MasterOfChakhaL dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/04/2006, 21h55

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