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 Pascal Discussion :

[LG]comment désigner un caractère affiché dans la fenêtre?


Sujet :

Langage Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [LG]comment désigner un caractère affiché dans la fenêtre?
    Bonjour,
    je débute en pascal et voici en français une instruction que je voudrais traduire en pascal :


    IF le caractère se trouvant à la position X, Y sur l'écran vaut une certaine valeur
    THEN faire une certaine action
    ELSE une autre


    En fait je ne sais pas comment désigner la partie en gras
    => un caractère se trouvant à un certain point d'abscisse X et d'ordonnée Y.

    Pourriez-vous m'aider ?
    Merci beaucoup.

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour !

    Malheureusement, il n'existe pas d'instruction toute prête pour faire ce que tu veux.
    Mais, pas de panique, tout est faisable

    Je vais partir du fait que tu développes sous Dos, avec Turbo Pascal. Si ce n'est pas le cas, il faudra le préciser, car certaines choses changeront.

    En fait, il faut lire directement dans la mémoire vidéo. Celle-ci est située à l'adresse B800:0000 (je pars du principe que tu as une carte graphique couleur ). Pour pouvoir la lire, il faut déjà savoir comment elle est organisée. EN mémoire vidéo texte, chaque caractère ets codé sur 2 octets. Le premier désigne le code ASCII du caractère, et le second ses attributs, c'est à dire sa couleur de fond et sa couleur d'arrière-plan.

    Muni de ces informations, il suffit de créer un tableau placé à cette adresse grâce à la directive absolute, comme ceci :

    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
    type
      TCharRec = record
        Ch: Char;
        Color: Byte;
      end;
     
    type
      TScreen = array[1..25, 1..80] of TCharRec;
     
    var
      Screen: TScreen absolute $B800:$0000;
     
    begin
      if Screen[Ligne, Colonne].Ch = Caractere then ...
    end;
    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut suite...
    Merci d'avoir répondu si vite ;-)

    En fait, pour tout dire, je fais partie de ceux qui doivent faire un démineur ;-) lol
    Tu me demandes si je suis sous Dos, avec Turbo Pascal, en fait je suis sous dos et avec Dev-Pascal mais en fait les instructions du petit travail nous demandent que le code source puisse être compilé avec n'importe quel compilateur, sous Linux, sous Windows,... :-s

    En fait quand j'affiche la grille de déminage il me faut une procédure qui utilise des Readkey pour voir si le joueur veut aller à gauche, en bas, à droite,...
    Quand il veut 'mettre un petit drapeau' (que je symbolise par # à l'écran), il doit appuyer sur Espace.
    Mais en fait j'aimerais que, quand il réappuye sur Espace le '#' soit remplacé par un '_' (l'état initial quoi)

    Voilà pourquoi j'avais besoin d'une condition sur un caractère affiché à une certaine place sur l'écran...

    Penses-tu qu'il y a une autre méthode pour résoudre ce problème (plus longuement expliqué...) ?

    Encore merci

    PS : avec Dev-Pascal j'ai une petite erreur dans le code que tu m'as donné :

    13 / 28 test.pas
    Error: absolute can only be associated a var or const
    13 / 28 test.pas
    Fatal: Syntax error, ; expected but ordinal const found

    Ligne 13 : Screen: TScreen absolute $B800:$0000;
    (le 28ème caractère est le premier '$')

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    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 939
    Points : 59 409
    Points
    59 409
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    $B800:$0000 est une adresse segmentée; or, FreePascal (qui est derrière DevPascal) est un compilateur 32 bits.

    Mais à propos de ta programmation, il vaudrait mieux travailler avec un tableau à 2 dimensions que tu déclares comme variable : aller tester le contenu de la mémoire vidéo n'est pas une technique très propre.
    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]

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Pas la peine d'utiliser ce que je t'ai dit si tu cherches la portabilité. Elle est nulle dans ce cas

    Tu te sortiras de ton problème en déclarant un tableau à 2 dimensions comme le suggère Alcatîz qui contiendra tes valeurs et qu'il te suffira de lire et modifier comme il le faut. Pour l'écran, il suffira d'afficher le contenu du tableau.

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    en fait j'espérais ne pas devoir passer par cette étape et pouvoir 'lire' des caractères affichés... Hélas non lol

    La vie est injuste ;-) lol


    Merci bcp et si j'ai l'une ou l'autre question je reviendrai


Discussions similaires

  1. Réponses: 0
    Dernier message: 22/11/2008, 20h10
  2. Réponses: 2
    Dernier message: 07/06/2006, 08h42
  3. Réponses: 9
    Dernier message: 12/05/2006, 09h21
  4. Réponses: 28
    Dernier message: 22/09/2005, 11h57
  5. Réponses: 23
    Dernier message: 22/04/2004, 11h55

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