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

Free Pascal Discussion :

[Graph] Actions clavier dans la fenêtre graphique


Sujet :

Free Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [Graph] Actions clavier dans la fenêtre graphique
    Bonjour à tous!
    Je commence à programmer en Pascal sous Windowns X_P et j'utilise FreePascal afin de compiler mon code. Je souhaite réaliser une petite application graphique dos afin de prendre en main le langage avant de ma lancer dans un projet plus conséquent.
    J'ai cependant rencontré plusieurs problèmes que vous pourrez peut être m'aider à résoudre.
    Voici le programme sur lequel je me suis appuyé pour faire mes essais:
    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
     
    Program inigraph1;
    { Program to demonstrate static graphics mode selection }
    uses graph;
    const
      TheLine = 'We are now in 640 x 480 x 256 colors!'+
                ' (press <Return> to continue)';
     
    var
      gd, gm, lo, hi, error,tw,th: integer;
      found: boolean;
     
    begin
      { We want an 8 bit mode }
      gd := D8bit;
      gm := m640x480;
      initgraph(gd,gm,'');
      { Make sure you always check graphresult! }
      error := graphResult;
      if (error <> grOk) Then
        begin
        writeln('640x480x256 is not supported!');
        halt(1)
        end;
      { We are now in 640x480x256 }
      setColor(cyan);
      rectangle(0,0,getmaxx,getmaxy);
      { Write a nice message in the center of the screen }
      setTextStyle(defaultFont,horizDir,1);
      tw:=TextWidth(TheLine);
      th:=TextHeight(TheLine);
      outTextXY((getMaxX - TW) div 2,
                (getMaxY - TH) div 2,TheLine);
      { Wait for return }
      readln;
      { Back to text mode }
      closegraph;
    end.
    Voici les problèmes rencontrés :
    - Le programme se compile correctement et ce lance semble t'il correctement cependant il se passe 6 bonnes seconde entre l'affichage de la fenêtre de saisie texte et l'affichage de la fenêtre graphique. Est ce normal ? N'est il pas possible d'executer l'affichage plus rapidement ?
    - Le code comporte l'instruction "readln" cependant lorsque la fenêtre graphique est apparue avec le message "We are now in 640 x 480 x 256 colors (press <Return> to continue)" et bien lorsque j'appuie sur Return, il ne se passe rien. Il faut que je ferme le fernêtre graphique, alors seulement dans la fenêtre de texte cela fonctionne et la touche return permet de quitter le programme.

    Pourriez vous éclairer mes lanternes sur le comportement de ce code?
    Je vous remercie par avance.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Après avoir visité d'autre forums, il semblerait que lors de l'ouverture d'une fenêtre graphique, celle ci devient la fenêtre active, or c'est dans la fenêtre de texte que les actions sont attendues si bien qu'en rendant le fenêtre de texte active le programme répond au instructions qui attendent une actions telle que dans mon cas le "readln".

    Savez vous s'il existe une solution pour le programme réagisse aux actions dans la fenêtre graphique ?

    Merci de votre aide.
    Pfeifer

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue !

    La fenêtre graphique créée au moment de l'exécution du programme est une vraie fenêtre GUI Windows.
    Pour simuler le ReadLn dans la fenêtre graphique, une solution est d'utiliser l'API : la fonction GetKeyState renvoie l'état actuel d'une touche du clavier.

    Il faut donc déclarer l'unité Windows dans l'en-tête :
    et remplacer le ReadLn par une boucle comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      { Wait for return }
      repeat
      until GetKeyState(VK_RETURN) <> 0;
    Attention cependant : la fonction Rectangle existe également dans l'unité Windows. Pour éviter une erreur de compilation, il faut préciser qu'il s'agit de la routine de l'unité Graph :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Graph.rectangle(0,0,getmaxx,getmaxy);
    J'ai testé cette solution avec succès. Mais ce n'est pas très élégant, d'autres en trouveront peut-être de meilleures.

    Bonne prog !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ok, merci beaucoup pour ces précisions, je vais creuser la question.

    Par contre en ce qui concerne la lenteur de l'initialisation de la fenêtre graphique? Avez vous une idée?

    Pfeifer

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    J'imagine que tu exécutes l'appli à partir de la console en plein écran ? Si oui, fais l'expérience de la démarrer depuis la console fenêtrée : le démarrage devrait être beaucoup plus rapide.

    Windows met pas mal de temps pour commuter du mode texte plein écran vers le mode graphique fenêtré (et vice-versa d'ailleurs).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kai,
    Citation Envoyé par Alcatîz Voir le message
    J'imagine que tu exécutes l'appli à partir de la console en plein écran ? Si oui, fais l'expérience de la démarrer depuis la console fenêtrée : le démarrage devrait être beaucoup plus rapide.

    Windows met pas mal de temps pour commuter du mode texte plein écran vers le mode graphique fenêtré (et vice-versa d'ailleurs).
    J'allais répondre quelque chose dans le genre, en ajoutant que c'est aussi un problème de matériel, l'écran surtout, qui ne bascule pas en un clin d'œil (la carte graphique non plus, d'ailleurs).
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Pfeifer Voir le message
    lorsque j'appuie sur Return, il ne se passe rien.
    La documentation mise à jour (?) en décembre 2011 propose toujours le même exemple, et il ne se passe toujours rien quand on appuie sur Return.

    Merci à Alcatîz pour la solution proposée.

    Une autre solution qui est indiquée ici est d'utiliser l'unité WinCrt et ses fonctions ReadKey et KeyPressed, les fonctions homonymes de l'unité Crt étant indisponibles en mode graphique.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Couleur du texte dans une fenêtre graphique
    Par luilui dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/06/2008, 23h02
  2. Réponses: 5
    Dernier message: 19/05/2008, 20h58
  3. Trapper les événements clavier dans une fenêtre
    Par NicoV dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/03/2008, 10h28
  4. Réponses: 7
    Dernier message: 22/10/2007, 18h57
  5. [Virtual Pascal] [OWL] Actions clavier dans un dialogue non modal
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 28/07/2005, 11h04

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