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

C Discussion :

Gérer le curseur


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut Gérer le curseur
    Salut à tous

    Alors voilà, j'aimerais réaliser un programme assez simple, mais qui m'aiderais à comprendre beaucoup de choses...

    Alors voilà, j'aimerais en faite pouvoir entrer autant de texte que je veux...
    C'est à dire, que lorsque le programme s'exécute rien ne se passe, il attend que l'utilisateur rentre du texte...

    Rien que ça se n'est pas si facile que ça, car je veux que ma variable ('chaine' par exemple), s'agrandisse en fur et à mesure....
    Es possible en C?

    De plus j'aimerais géré le touche entrer, c'est à dire que lorsque l'utilisateur appuit sur cette touche, le curseur revient à la ligne...


    J'ai déjà fait queques recherche, et j'ai trouvé comment déplacer le curseur grace à des coordonnée...

    Comment puis-je faire?avec quelle librairie?

    Merci d'avance de votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Tu demandes deux choses en fait:
    1. Pouvoir saisir des chaînes arbitrairement longues (il faut utiliser l'allocation dynamique, typiquement avec une boucle).
    2. Utiliser la console non plus comme un flux, mais comme une TUI (lecture de caractères avant l'appui sur Entrée, déplacement du curseur...).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    Pour la longueur de la chaine, allocation dynamique.

    Pour pouvoir déclacer le curseur :

    Code Windows : projet Win32 Console Application
    Ne pas oublier d'inclure le header : <windows.h>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void *hconsole; // il s'agit de notre handle, le pointeur vers la console.
    int fsuccess; // entier qui nous permettra de récupérer le résultat d'une fontion.
    COORD coord; // dans <windows.h>, structure de données
     
    hconsole=GetStdHandle(STD_OUTPUT_HANDLE); // on affecte l'adresse de la console à hconsole.
    coord.X=1; // abscisse de la console
    coord.Y=2; // ordonnée de la console.
    fsuccess=SetConsoleCursorPosition(hconsole, coord);// permet de placer le curseur dans hconsole, aux coordonnées coord.
    Pour plus d'infos, n'hésites pas

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Cemos: Quand tu postes un code non-portable, aies au moins l'amabilité de dire sur quelles plate-formes il marche et quelles bibliothèques il utilise.

    Ce code est pour Win32, et il utilise l'API de gestion de console de Windows. Ces fonctions sont déclarées en incluant <windows.h>.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Ok, donc pour la longeur de ma chaine je vais utiliser l'allocation dynamique, typiquement avec une boucle...

    Mais pour ce qui est de la gestion du curseur je n'est pas trés bien compris...
    Mon but et de pouvoir diriger le curseur dans le texte (gauche, droite...)
    Et de pouvoir apuiyer sur la touche entrer sans que ça envoye la chaine...mais juste que le cursuer ce place au début sur ligne juste en dessous...



    Merci d'avance

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    Je vais essayer d'être clair.

    Tout d'abord, crée une fonction qui te retournera le code ascii des touches multidirectionnelles.

    Attention, les touches multidirectionnelles ont des codes ascii composés : 224 et 80 pour la touche UP par exemple.

    En ce qui concerne la touche enter, ta fonction devra te renvoyer 13.
    tu n'auras plus qu'à implémenter ce que je t'ai mis ci-dessus. La fonction SetConsoleCursorPosition de <windows.h> permet de placer le curseur n'importe où sur la console, en fonction de deux paramètres (l'addresse de la console et une variable COORD comprenant l'abscisse et l'odonnée du curseur sur la console)

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Cemos Voir le message
    Code Windows : projet Win32 Console Application
    Ne pas oublier d'inclure la bibliothèque : <windows.h>
    Inutile de sortir la peinture pour ça. Par contre, il serait plus utile d'utiliser une terminologie correcte. Un header n'est en aucun cas une bibliothèque. C'est un fichier d'interface, c'est tout (Medinoc a d'ailleurs été parfaitement clair là-dessus).

    Tu as l'air d'être pourtant un codeur C expérimenté, donc je m'étonne que tu fasses encore cette erreur basique...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Ok merci beaucoup!

    Je pense avoir compris...

    Euh un dernier truc, quel fonction serait la mieux adaptée pour ce que je veux faire (rentrer une grande quantitée de texte), je veux dire un truc comme par exemple scanf() (Je sais que cette fonction n'est pas trés recommmandée mais c'est juste à titre d'explemple...)


    Merci d'avance

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    Comme m'a déjà dit un utilisateur expérimenté : fgets() suivie d'un fclean().

    Je plaisante bien sur. En tout cas, ces deux fonctions-ci seront nécessaires.

    PS : Pourrais-tu m'indiquer quel est ton projet ? Un éditeur de texte ?

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par aurelien36 Voir le message
    Euh un dernier truc, quel fonction serait la mieux adaptée pour ce que je veux faire (rentrer une grande quantitée de texte)
    Pour faire une saisie de taille quelconque en standard, tu peux utiliser fgetc() ou fgets() avec malloc()/realloc()...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Ok merci je vais me renseigner sur ces fonctions....

    Et oui mon but et de faire un éditeur de texte assez simple...

    Mais bon je ne sais pas trop comment mit prendre, donc je me renseigne sur les fonctions que je pourrais utiliser...



    Merci

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Si tu veux faire un éditeur de texte, il te faudra sans doute utiliser les fonctions non-standard. Non seulement pour l'affichage, mais pour la saisie (qui devra être faite caractère par caractère).

    Dans ce cas, plutôt qu'utiliser les fonctions de Windows, je conseille d'utiliser une bibliothèque portable (genre PDCurses).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par aurelien36 Voir le message
    Ok merci je vais me renseigner sur ces fonctions....

    Et oui mon but et de faire un éditeur de texte assez simple...

    Mais bon je ne sais pas trop comment mit prendre, donc je me renseigne sur les fonctions que je pourrais utiliser...
    Autrement-dit, tu fais le travail à l'envers... Commence déjà par définir exactement ce que tu veux faire, on verra ensuite comment le faire...

    Si tu veux faire une saisie 'plein ecran', c'est pas du tout la même chose que faire une saisie 'ligne'. Commence déjà par définir ça.

    Comme je te l'ai dit sur un autre forum, si tu ne donnes pas tout de suite des limites très précises à ton projet, ça peut être énorme !

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    Je te laisse chercher, si tu es bloqué, n'hésites pas. J'ai justement du faire un éditeur de texte en première année de mes études. Disons que le projet m'a rodé à ce niveau là.

    Petit conseil :

    Je te conseille ici de raisonner ainsi :

    Demande la saisie d'un caractère et affiche le dans la foulée. N'attends pas la saisie complète d'une chaine de caractere. (voir POST de Medinoc)

    Algorithmiquement parlant :

    1 - Capter le code ASCII d'une lettre
    2 - Afficher la lettre
    3 - Incrémenter le X de ta variable COORD
    4 - Positionner le curseur avec la fonction SetConsoleCursorPosition

    J'attends de tes nouvelles.

    Bon courage.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Merci beaucoup!

    J'avais déja réfléchie à ce que je voulais faire, voilà ce que j'avais :
    -On demande à l'utilisateur s'il veut creer un fichier ou en ouvrir un.
    --Si il veut ouvrir on lui demande le chemin et on ouvre.
    --Sinon on affiche un nouvel 'feuille blanche'.
    -On le laisse taper ce qu'il veut.
    -Dés qu'il appuit sur la touche 'Esc' on lui demande si il veut enrengistrer le fichier, si oui où.
    -Le nom du fichier...
    -Si il veut fermer.
    --Si oui on ferme.
    --Sinon on raffiche le texte

    Ensuite pour ce qui est des touches :
    SUPPR = efface le caractére juste avant le curseur, si il y en a plus => rien faire.
    BACKSPACE = efface le dernier caractére, si il y en a plus => rien faire.
    INSERT = Bonne question!
    HOME = Place le curseur au début de la ligne courante.
    FIn = place le curseur en fin de ligne courante.
    Gauche = Le curseur se décalle de 1 vers la gauche, si il est au début d'une ligne, il vient se placer à la fin de celle juste avant.
    Droite = Le curseur se décalle de 1 vers la droite, si il est à la fin d'une ligne, il vient se placer au début de celle juste avant.
    Haut = Le curseur monte d'une ligne(+1y si on été dans un graphique), si il est sur la premiére ligne du texte, rien ne ce passe.
    Bas = curseur decsend d'une ligne(-1y si on été dans un graphique), si il est sur la derniére ligne du texte, il crée une nouvelle ligne.


    Et pour le curseur je viens de trouver ce code (qui est facile à comprendre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <conio.h>
    #include <stdio.h>
     
    void main(void)
    {
    int x,y;
     
    puts("Essai 1"); /* on affiche pour le test */
    x=wherex(); y=wherey(); /* on demande l'emplacement du curseur */
    gotoxy(x+3,y-2); /* on le déplace de 3 caractères à droite et de 2 vers le haut */
    puts("Essai 2"); /* deuxième affichage */
    gotoxy(10,6); /* on va à la 10ième colonne, 6eme ligne */
    puts("Essai 3"); /* et dernier affichage */
    }
    Quand pensez-vous?


    Merci d'avance.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    En ce qui concerne ton algo textuel, c'est pas mal, à approfondir. Mais c'est déjà bien pensé.

    D'aprés moi, l'enregistrement et l'ouverture de fichier est secondaire. Laisse de coté pour le moment.

    Tout d'abord, pense à l'affichage de caractère.

    MAIS : As-tu réfléchis à l'enchainement de tes lignes ? As-tu songé aux listes chainées ?

    En ce qui concerne le code, difficile de juger, surtout que wherex(), wherey() et gotoxy() sont des fontions et procédure que tu vas devoir implémenter toi même.

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par aurelien36 Voir le message
    J'avais déja réfléchie à ce que je voulais faire, voilà ce que j'avais :
    -On demande à l'utilisateur s'il veut creer un fichier ou en ouvrir un.
    --Si il veut ouvrir on lui demande le chemin et on ouvre.
    --Sinon on affiche un nouvel 'feuille blanche'.
    -On le laisse taper ce qu'il veut.
    -Dés qu'il appuit sur la touche 'Esc' on lui demande si il veut enrengistrer le fichier, si oui où.
    -Le nom du fichier...
    -Si il veut fermer.
    --Si oui on ferme.
    --Sinon on raffiche le texte

    Ensuite pour ce qui est des touches :
    SUPPR = efface le caractére juste avant le curseur, si il y en a plus => rien faire.
    BACKSPACE = efface le dernier caractére, si il y en a plus => rien faire.
    INSERT = Bonne question!
    HOME = Place le curseur au début de la ligne courante.
    FIn = place le curseur en fin de ligne courante.
    Gauche = Le curseur se décalle de 1 vers la gauche, si il est au début d'une ligne, il vient se placer à la fin de celle juste avant.
    Droite = Le curseur se décalle de 1 vers la droite, si il est à la fin d'une ligne, il vient se placer au début de celle juste avant.
    Haut = Le curseur monte d'une ligne(+1y si on été dans un graphique), si il est sur la premiére ligne du texte, rien ne ce passe.
    Bas = curseur decsend d'une ligne(-1y si on été dans un graphique), si il est sur la derniére ligne du texte, il crée une nouvelle ligne.
    Tu veux donc faire de l'édition pleine page... Si il n'y a qu'une page (pas de scrolling, donc, un nombre limité de lignes et de colonnes), c'est pas trop compliqué.

    En principe, l'usage veut que le touche SUPPR (DEL) efface le caractère situé à droite du curseur, alors que la touche BS (BackSpace) efface le caractère situé à gauche.

    La touche INS permet de gérer l'état Insert/Overwrite.

    Par exemple, si j'ai écrit (_ représente le curseur)
    hello world
    en mode overwrite, si je tapes 'wild', ça donnera :
    hello wildd
    alors qu'en mode insert, ça fera
    hello wildworld

    L'état Overwrite est le mode le plus simple. L'état Insert est complexe à gérer...

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Citation Envoyé par Cemos Voir le message
    Tout d'abord, pense à l'affichage de caractère.

    MAIS : As-tu réfléchis à l'enchainement de tes lignes ? As-tu songé aux listes chainées ?

    En ce qui concerne le code, difficile de juger, surtout que wherex(), wherey() et gotoxy() sont des fontions et procédure que tu vas devoir implémenter toi même.
    Merci.

    Mais je n'ai pas tous compris

    Je ne vois pas ce que tu veux dire exactement par :As-tu réfléchis à l'enchainement de tes lignes ? As-tu songé aux listes chainées ?

    Ensuite je ne vois pas non plus ce que tu veux dire exactement par :
    Tu vas devoir implémenter toi même.

    Merci

    EDIT = Merci pour ces informations -ed-!

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Cemos Voir le message
    En ce qui concerne le code, difficile de juger, surtout que wherex(), wherey() et gotoxy() sont des fontions et procédure que tu vas devoir implémenter toi même.
    Ca existe dans conio (DOS/Windows)

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par aurelien36 Voir le message
    As-tu réfléchis à l'enchainement de tes lignes ? As-tu songé aux listes chainées ?
    Les listes chainées doubles sont la manière 'naturelle' de gérer un traitement de texte simple. En effet, le parcours, l'insertion et la suppression sont simples et rapides, ce qui n'est pas le cas d'un tableau. Mais je crois savoir que tu débutes, c'est pourquoi je ne pense pas que les listes chainées soient à l'ordre du jour pour le moment...
    Tu vas devoir implémenter toi même.
    implémenter = coder

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/02/2012, 12h25
  2. comment gérer la position du curseur de la souris
    Par colorid dans le forum Langage
    Réponses: 3
    Dernier message: 16/05/2011, 08h54
  3. Blibliothèque pour gérer deux souris et deux curseurs ?
    Par hatespam dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 13/06/2010, 16h56
  4. Gérer le curseur dans un fichier XML
    Par oeilvert dans le forum Qt
    Réponses: 4
    Dernier message: 09/06/2010, 09h37
  5. [FLASH MX2004] Gérer le curseur d'un champs de saisie
    Par personne64 dans le forum Flash
    Réponses: 3
    Dernier message: 22/02/2006, 17h12

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