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 :

Lazarus freeze en exécution


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de netsabes
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut Lazarus freeze en exécution
    Bonjour,

    je souhaite créer un bouton On/Off qui lance un petit dessin, ou en arrête l'exécution.
    Avant de continuer plus loin, j'ai voulu tester le principe suivant :

    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.Button1Click(Sender: TObject);
    var
       x,y : integer;
    begin
      if button1.Caption='Go !!!' then Button1.Caption:='Stop...' else button1.Caption:='Go !!!';
      button1.Repaint;
      while button1.Caption='Stop...' do
      begin
        x:=round(random*PaintBox1.canvas.width)+1;
        y:=round(random*PaintBox1.canvas.height)+1;   
        paintbox1.Canvas.moveto(x,y);
        paintbox1.canvas.lineto(x+1,y+1);
      end;
    end;
    Le Repaint me permet de mettre à jour le caption, qui sinon ne change pas, mais malgré cela, le clic sur le bouton Stop ne stoppe rien et le programme continue de placer des points sans réagir au clic.

    Quelle méthode faudrait-il utiliser ?

    Et, autre question : suis-je obligé de placer un moveto, lineto, ou existe-t-il un moyen de placer un point, genre putpixel de turbopascal ?

    Merci.

    Seb.

  2. #2
    Membre confirmé Avatar de netsabes
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut
    J'ai une partie de la réponse : l'utilisation de canvas.pixels[x,y] me permet de tester ou de redéfinir la couleur d'un point.

    En revanche, j'en trouve l'exécution excessivement lente. C'est normal ?

    Seb.

  3. #3
    Membre Expert

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Citation Envoyé par netsabes Voir le message
    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.Button1Click(Sender: TObject);
    var
       x,y : integer;
    begin
      if button1.Caption='Go !!!' then Button1.Caption:='Stop...' else button1.Caption:='Go !!!';
      button1.Repaint;
      while button1.Caption='Stop...' do
      begin
        x:=round(random*PaintBox1.canvas.width)+1;
        y:=round(random*PaintBox1.canvas.height)+1;   
        paintbox1.Canvas.moveto(x,y);
        paintbox1.canvas.lineto(x+1,y+1);
      end;
    end;
    Salut

    Tu viens de créer une boucle infinie .... La condition button1.Caption='Stop...' est toujours vraie, donc ta boucle ne s'arrete jamais, et donc ta fenetre "freeze" ...

    Pour ton probleme, il ne faut pas que tu crées de boucle comme tu l'a fait. Utilise le composant TTimer, qui permet de répéter une action toutes les N secondes.

    Donc, tu poses ton composant TTimer, et dans son évenement onTimer, tu dessines un point aléatoire sur le Canvas de ta PaintBox. Ensuite, le TButton devra simplement activer ou désactiver le Timer via sa propriété Active. (Timer.Active:=false);

    Tu peux modifier la propriété Interval du TTimer pour augmenter ou réduite le temps d'attente entre 2 évenements OnTimer.

    Bonne chance

  4. #4
    Membre confirmé Avatar de netsabes
    Inscrit en
    Mars 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 82
    Par défaut
    Ok, je pensais que le gestionnaire d'événements interceptait les événements même quand un autre processus était actif.

    Du coup, lors de l'exécution de button1.clic, je pensais qu'il était capable de détecter un deuxième button1.clic.

    Merci pour l'info.

    Seb.

Discussions similaires

  1. Problème pour créer un exécutable avec Cx-Freeze
    Par moumoute77 dans le forum Général Python
    Réponses: 2
    Dernier message: 17/02/2014, 01h05
  2. Réponses: 6
    Dernier message: 31/12/2011, 13h17
  3. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  4. Exécution indivisible (accès conccurent)
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 23/07/2002, 08h09
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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