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

Lazarus Pascal Discussion :

Interruption de l'exécution


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut Interruption de l'exécution
    Bonjour
    voici le code initial

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    procedure TFormSDFTest.BtOKClick(Sender: TObject);
     
    var
       MySDF: SDFmini;
       MyMol,lne: TStringList;
       NAtom,NBond: integer;
       i,j, a, lidx,Aidx: Integer;
       somme,dxA,dyA,dxB,dyB,dx,dy, vx ,vy: double;
       ix,iy, IxT, iyT : integer;
       MyFPMol: TMolecule;
       PAt: PRAtom;
       PBd: PRBond;
       mdl: TCFR;
       frg: LRDsc;
       ddx : double;
       //
       w: TArcCost;
       s,t,lgth: Node;
       v: TNodeCost;
       p,pth: TNodeInfo;
       frgstr: string;
       aid: AtomID;
       bid: BondID;
       pdsc: PRDsc;
       CMax, dxmin, dxmax, dymin, dymax: double;
       xg , yg, alphax, alphay, alpha : double ;
       mox, moy: double;
       cliquez :Integer;
     
     
    begin
     
     
     
       (*  MySDF:=SDFmini.Create(EditSDFfile.Text);*)
     
         MySDF:=SDFCret(EditSDFfile);
         //MyFPMol:=TMolecule.Create;
         MyFPMol:=MyFP();
         lne:=lne2(w);
     
     
         //Lecture dule ISIDA
     
         mdl:=mdlCret(EditISIDAfile);
         frg:=frg2(mdl);
     
         Refresh1.Enabled:=true;
    repeat
              MyMol:=suivantsdf(MySDF,MyFPMol);
             lne.DelimitedText:=MyMol[3];
             lne.Clear;
               stockage(MyFPMol,MyMol,lne);
              initpoidsliaison(MyFPMol);
     
     
     
                  MyFPMol :=miseenforme(MyFPMol, PaintBox1);
                  affichagesymbole(MyFPMol, PaintBox1);
     
                  extractpaths(MyFPMol,frg);
     
     
     
     
              tracageliaison(MyFPMol, PaintBox1);
     
     
               MyFPMol.Clear;
    until (MySDF.fend)
     
    liberer(MySDF,lne,MyFPMol, mdl);
     
    end;
    Je cherche à remplacer mon repeat par un bouton suivant qui donc me lirai pas à pas le contenu de la boucle "repeat".
    J'ai creer un bouton suivant avec l'action OnClick et j'ai copier le contenu de repeat dedans de ce type

    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
    TApplication.HandleException Access violation
      Stack trace:
      $082924B3  SDFMINI__NEXTTMOL,  line 61 of basicsdf.pas
      $08089A1D  TFORMSDFTEST__SUIVANTSDF,  line 194 of unitsdftest.pas
      $08089C6E  TFORMSDFTEST__SUIVANTCLICK,  line 326 of unitsdftest.pas
      $081773A4  TCONTROL__CLICK,  line 2227 of ./include/control.inc
      $081B82FF  TBUTTONCONTROL__CLICK,  line 72 of ./include/buttoncontrol.inc
      $081B88E5  TCUSTOMBUTTON__CLICK,  line 164 of ./include/buttons.inc
      $081B8E41  TBUTTON__CLICK,  line 331 of ./include/buttons.inc
      $081B819A  TBUTTONCONTROL__WMDEFAULTCLICKED,  line 26 of ./include/buttoncontrol.inc
      $08069879
      $0816DA82  TWINCONTROL__WNDPROC,  line 4920 of ./include/wincontrol.inc
      $081F3617  DELIVERMESSAGE,  line 111 of lclmessageglue.pas
      $08287100  GTK2WSBUTTON_CLICKED,  line 1853 of gtk2wsstdctrls.pp
      $00FCE9FC
      $00FC1072
      $00FD67A8
      $00FD7B2D
      $00FD7FB6


    Bref ici n'est pas la question
    En gros ca marche pas...
    J'ai penser utiliser une interruption avec ce code la

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    procedure TFormSDFTest.BtOKClick(Sender: TObject);
     
    var
       MySDF: SDFmini;
       MyMol,lne: TStringList;
       NAtom,NBond: integer;
       i,j, a, lidx,Aidx: Integer;
       somme,dxA,dyA,dxB,dyB,dx,dy, vx ,vy: double;
       ix,iy, IxT, iyT : integer;
       MyFPMol: TMolecule;
       PAt: PRAtom;
       PBd: PRBond;
       mdl: TCFR;
       frg: LRDsc;
       ddx : double;
       //
       w: TArcCost;
       s,t,lgth: Node;
       v: TNodeCost;
       p,pth: TNodeInfo;
       frgstr: string;
       aid: AtomID;
       bid: BondID;
       pdsc: PRDsc;
       CMax, dxmin, dxmax, dymin, dymax: double;
       xg , yg, alphax, alphay, alpha : double ;
       mox, moy: double;
       cliquez :Integer;
     
     
    begin
     
     
     
       (*  MySDF:=SDFmini.Create(EditSDFfile.Text);*)
     
         MySDF:=SDFCret(EditSDFfile);
         //MyFPMol:=TMolecule.Create;
         MyFPMol:=MyFP();
         lne:=lne2(w);
     
     
         //Lecture dule ISIDA
     
         mdl:=mdlCret(EditISIDAfile);
         frg:=frg2(mdl);
     
         Refresh1.Enabled:=true;
    repeat
              MyMol:=suivantsdf(MySDF,MyFPMol);
             lne.DelimitedText:=MyMol[3];
             lne.Clear;
               stockage(MyFPMol,MyMol,lne);
              initpoidsliaison(MyFPMol);
     
     
     
                  MyFPMol :=miseenforme(MyFPMol, PaintBox1);
                  affichagesymbole(MyFPMol, PaintBox1);
     
                  extractpaths(MyFPMol,frg);
     
     
     
     
              tracageliaison(MyFPMol, PaintBox1);
     
     
               MyFPMol.Clear;
     Suivant.tag :=0
     repeat
     until( Suivant.tag :=1)
    until (MySDF.fend)
     
    liberer(MySDF,lne,MyFPMol, mdl);
     
    end;
    avec une procédure de Suivant.tag à 1 lors du click
    Je rentre dans la boucle mais je ne ressort jamais.
    Je bloque je n'ai pas d'autre solution.
    A savoir que sans la boucle repeat, il me lit 1 fois le code (normal )

    J'avais penser bloquer chaque repeat par une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.ProcessMessages;
               ShowMessage('Clickez pour continuer');
    Mais la méthode n'est la bonne

  2. #2
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    sous BCB6 il y avait la fonction Sleep

    Pause d'une seconde:
    peut que sous lazarus ca marche aussi ?
    A+
    .
    Why
    .
    //------------------

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    La commande existe merci et permet de bloquer le repeat
    mais je ne rentre pas dans ma boucle à nouveau lors d'un clic bouton


    J'ai peut etre une idée
    je mettrai sleep a la fin de ma fonction (juste avant le until) avec une valeur très grande (genre 2h)
    et je voudrai alors creer un bouton suivant qui lorsque je cliquerai dessus changerai la valeur du sleep à 500 par exemple..


    Par contre je ne vois pas comment programme la chose

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je n'ai peut-être pas compris la question (un peu feignant le dimanche et pis votre code vous êtes dedans... et moi vraiment pas). Enfin si le sujet est de sortir le repeat contenu dans le bouton et faire un repeat dont chaque étape sera déclenchée par un click sur un autre bouton, je ferais ainsi :
    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
     
    var
      Form1: TForm1; 
      iLoc : integer;
      iMax : integer;
    implementation
     
    { Repeat dans le button------------------------------------------------ }
    procedure TForm1.ButtonRepeatINbuttonClick(Sender: TObject);
    var iLoc : integer;
        iMax : integer;
    begin
        iMax:= 10;
        iLoc:= 0;
        repeat
              //--Deb la procédure à effectuer
              Showmessage(IntToStr(iLoc));
              //--Fin la procédure à effectuer
              inc(iLoc);
        until iLoc=iMax;
    end;
    { Repeat dans le button------------------------------------------------ }
     
    { Repeat hors du button------------------------------------------------ }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      iLoc:= 0;
      iMax:= 10;
    end;
     
    procedure TForm1.ButtonRepeatOUTbuttonClick(Sender: TObject);
    begin
      if iLoc<iMax then begin
         //--Deb la procédure à effectuer
         Showmessage(IntToStr(iLoc));
         //--Fin la procédure à effectuer
         inc(iLoc);
     end;
    end; 
    { Repeat hors du button------------------------------------------------ }
    Une fois arrivée à la fin de la boucle, on peut ajouter un bouton de réinitialisation [iLoc:= 0;] et même avec un autre bouton parcourir dans le sens inverse [dec(iLoc);].

    Cordialement. Gilles

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Ce n'est pas en interrompant ta boucle repeat que tu pourras faire ce que tu veux faire. Il te faut voir les choses différemment.

    Si j'ai bien compris (ce qui n'est pas simple car ton code n'est pas commenté) ton but est d'afficher des molécules une par une avec des boutons suivant et précédent pour changer de molécule.

    Pour la suite de mon explication je vais considérer qu'une molécule est une chaine de caractère.

    Tout d'abord il te faut un moyen de mémoriser la molécule en cours de visualisation. Tu commences donc par déclarer un champ MolCourante dans ta fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TForm1 = class 
    ......
     
    private
      MolCourante : String;
    Tu initialises ce champ dans l'évènement OnCreate de ta fenetre par un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MolCourante:=PremiereMolecule;
    Tu dois ensuite t'arranger pour que ta fenêtre affiche la molécule courante. Le plus simple pour cela est de déposer un Panel sur ta fiche et de dessiner MolCourante dans l'évènement OnPaint du Panel.

    Il ne te reste plus qu'à ajouter les boutons 'suivant' et 'précédent' sur la fiche puis à redéfinir l'évènement OnClick de tes boutons pour qu'il te permettes de passer à la molécule suivante ou précédente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MolCourante:=MoleculeSuivante(MolCourante);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MolCourante:=MoleculePrecedente(MolCourante);
    Voilà en gros le principe. Tu peux ensuite améliorer les choses en grisant les boutons 'suivant' et 'précédent' quand tu es au début ou à la fin de ta liste de molécules.

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    Ce n'est pas en interrompant ta boucle repeat que tu pourras faire ce que tu veux faire. Il te faut voir les choses différemment.

    Si j'ai bien compris (ce qui n'est pas simple car ton code n'est pas commenté) ton but est d'afficher des molécules une par une avec des boutons suivant et précédent pour changer de molécule.

    Pour la suite de mon explication je vais considérer qu'une molécule est une chaine de caractère.

    Tout d'abord il te faut un moyen de mémoriser la molécule en cours de visualisation. Tu commences donc par déclarer un champ MolCourante dans ta fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TForm1 = class 
    ......
     
    private
      MolCourante : String;
    Tu initialises ce champ dans l'évènement OnCreate de ta fenetre par un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MolCourante:=PremiereMolecule;
    Tu dois ensuite t'arranger pour que ta fenêtre affiche la molécule courante. Le plus simple pour cela est de déposer un Panel sur ta fiche et de dessiner MolCourante dans l'évènement OnPaint du Panel.

    Il ne te reste plus qu'à ajouter les boutons 'suivant' et 'précédent' sur la fiche puis à redéfinir l'évènement OnClick de tes boutons pour qu'il te permettes de passer à la molécule suivante ou précédente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MolCourante:=MoleculeSuivante(MolCourante);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MolCourante:=MoleculePrecedente(MolCourante);
    Voilà en gros le principe. Tu peux ensuite améliorer les choses en grisant les boutons 'suivant' et 'précédent' quand tu es au début ou à la fin de ta liste de molécules.
    Tout a fait d'accord !

    En fait, il ne faut jamais chercher a arreter une partie du code, comme une boucle ... Il faut toujours repenser le code d'une autre facon !

    L'exemple fourni par batyann811 est un bon exemple.

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pourquoi ne pas deporter la boucle dans une fonctione à appeler avec des parametres ?

    ce qui donnerais :

    bouton Next -> inc(N); ShowMole(Moles[N]);
    bouton Prec -> dec(N); ShowMole(Moles[N]);
    bouton Empty/Hide -> ShowMole(EmptyMole);
    bouton Voir "N" -> N := Valeur saisie; ShowMole(Moles[N]);
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. [E-07] Exécution sans interruption d'une macro automatique de sauvegarde
    Par JMVBAExcel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/01/2009, 20h40
  2. Interruption d'exécution de code
    Par Kimado dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/05/2007, 17h30
  3. Réponses: 17
    Dernier message: 19/02/2005, 19h36
  4. Exécution d'interruption détournée
    Par scorbo dans le forum Assembleur
    Réponses: 29
    Dernier message: 07/02/2005, 21h43

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