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++Builder Discussion :

Détection et positionnement de curseur dans un RichEdit


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Détection et positionnement de curseur dans un RichEdit
    Bonjour tout le monde !!!

    J'éprouve quelques soucis pour gérer le positionnement du curseur dans un RichEdit. J'ai consulté un article là dessus sur ce site, mais j'avoue que je n'ai pas bien saisi ma façon dont procède...

    Voici le problème: je reçois un flux de données constant que je transfère immédiatement dans un RichEdit. Pour des raisons de mise en page, je voudrais pouvoir revenir à la ligne tous les x caractères reçus. J'ai donc besoin de détecter la position du curseur, puis de la modifier ensuite...

    Quelqu'un pourrait me dépanner ??

    Merci d'avance

    Zooz

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Tu ne peux pas compter les caractères reçus, et lorsque c'est nécessaire ajouter une nouvelle ligne avant d'ajouter les nouveaux caractères ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    En fait j'y ai pensé mais ce n'est pas possible. Les données que je reçois sont issues d'une réception via le port série et je ne connais pas à priori le nombre d'octets que je reçois.

    En fait je dois afficher des entiers qui arrivent sous forme d'octets, et suivant le nombre de digits, le nombre d'octets change.

    Je m'explique plus précisément: je reçois des "paquets" de nombres que je veux afficher. Ces nombres contiennent entre 1 et 3 chiffres (entiers) (il me semble qu'un entier occupe 2 octets). Si le nombre reçu contient moins de 3 chiffres, les digits reçus sont comblés par le caractère 0 (1 octet). Donc les paquets reçus sont a priori de taille différente.

    La seule solution que j'ai pu imaginer est de jouer sur la position du curseur pour passer à la ligne au bon moment (chaque fois que le curseur se déplace de 3 positions)...

    Voilà...

    @+

    Zooz

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne comprends pas bien, tu reçois des entiers codés sur 2 octets.
    Qui fait la conversion de ces octets vers des chaînes de caractères ?
    Si c'est toi, tu peux compter les caractères affichés.
    Tu peux par exemple t'arranger pour écrire tes caractères en sur 3 digits, tu comble avec des espaces et tu affiches avec une fonte type "courier" non proportionnelle.
    N'étant pas chez moi, je ne peux pour le moment pas t'aider beaucoup plus, désolé.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour obtenir la position du curseur (en fait la longueur du texte :
    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
    EM_GETTEXTLENGTHEX
    The EM_GETTEXTLENGTHEX message calculates text length in various ways. It is usually called before creating a buffer to receive the text from the control. 
     
    To send this message, call the SendMessage function with the following parameters. 
     
    SendMessage( 
      (HWND) hWnd,            // handle to destination window 
      EM_GETTEXTLENGTHEX,     // message to send
      (WPARAM) wParam,        // text length (GETTEXTLENGTHEX *)
      (LPARAM) lParam         // not used; must be zero
    );
    Parameters
    wParam 
    Pointer to a GETTEXTLENGTHEX structure that receives the text length information. 
    lParam 
    This parameter is not used; it must be zero. 
    Return Values
    The message returns the number of TCHARs in the edit control, depending on the setting of the flags in the GETTEXTLENGTHEX structure. If incompatible flags were set in the flags member, the message returns E_INVALIDARG .
     
    Remarks
    This message is a fast and easy way to determine the number of characters in the Unicode version of the rich edit control. However, for a non-Unicode target code page you will potentially be converting to a combination of single-byte and double-byte characters.
    Ensuite tu peux calculer la longueur de la dernière ligne par
    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
    EM_LINELENGTH
    The EM_LINELENGTH message retrieves the length, in characters, of a line in an edit control. You can send this message to either an edit control or a rich edit control.
     
    To send this message, call the SendMessage function with the following parameters. 
     
    SendMessage( 
      (HWND) hWnd,         // handle to destination window 
      EM_LINELENGTH,       // message to send
      (WPARAM) wParam,     // character index
      (LPARAM) lParam      // not used; must be zero
    );
    Parameters
    wParam 
    Specifies the character index of a character in the line whose length is to be retrieved. If this parameter is greater than the number of characters in the control, the return value is zero. 
    This parameter can be –1. In this case, the message returns the number of unselected characters on lines containing selected characters. For example, if the selection extended from the fourth character of one line through the eighth character from the end of the next line, the return value would be 10 (three characters on the first line and seven on the next). 
     
    lParam 
    This parameter is not used. 
    Return Values
    For multiline edit controls, the return value is the length, in TCHARs, of the line specified by the wParam parameter. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. It does not include the carriage-return character at the end of the line.
     
    For single-line edit controls, the return value is the length, in TCHARs, of the text in the edit control. 
     
    If wParam is greater than the number of characters in the control, the return value is zero.
     
    Remarks
    Use the EM_LINEINDEX message to retrieve a character index for a given line number within a multiline edit control.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Qu'est-ce qu'on doit en déduire ... ???
    - que tu as un buffer de saisie sans fin c'est à dire circulaire (& 255 ou autre %) ?
    - que tu recois les caractères un par un ?
    - que tu actives le RichEdit à l'aide de messages du type "événements clavier" à partir du flux ?

    Si oui, alors il faut savoir que CaretPos est en lecture seule :
    - CaretPos.x exprime la position du Caret en termes de caractères dans la ligne en cours d'édition
    - CaretPos.y exprime la ligne en cours d'édition.

    Donc lors d'un OnKeyPress ou OnKeyDown du RichEdit déclenché par ton propre message, vérifier
    la valeur de Caret.x. et le cas échéant :
    - Ajouter une ligne contenant un espace ou alors contenant le caractère en excès
    mais surtout pas vide.
    - SelectAll() positionne SelEnd après le caractère de la nouvelle ligne donc faire :
    SelStart = SelEnd (tester s'il faut -1) pour positionner le Caret à cet endroit.
    Il n'y a plus qu'à saisir dans cette nouvelle ligne et continuer tant que...
    J'espère qu'une chose, c'est que la vitesse du flux soit suffisamment lente sinon ça
    va bouchonner sévère !

    Sinon, si le mécanisme ne t'est pas imposé avec autant de contraintes, mets en place un buffer
    que tu remplis à chaque OnKeyDown ou OnKeyPress (dû à ton propre message).
    En suivant l'index tu sauras à quel moment faire :

    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
    int Index = -1;//initialisation à -1 du fait de la pré-incrémentation 
    char Buffer[256];
    ...
    {
    Index++;
    if(Index > x)
    {
    Buffer[Index] = 0; //pour terminer la chaîne
    AnsiString Chaine = Buffer;
    RichEdit->Lines->Add(Chaine);
    //RicheEdit->Lines->Add(Buffer) ???? je ne sais pas si on peut le faire directement
    Index = 0; //ici on réinitialise normalement
    }
    //dans tous les cas enregistrer le char dans le buffer
    Buffer[Index] = Key;
    //pas la peine de répercuter ce que l'on vient de saisir.
    Key = 0; 
    }
    Enfin et pour conclure, si tu as toute liberté de faire comme tu veux, alors n'utilises pas
    les messages pour simuler une action du clavier mais uniquement le buffer et un index !

    Celà dit... je ne sais pas ce que tu fais exactement !

    A plus !

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Super merci beaucoup les gars !

    @+

    Zooz

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. positionner le curseur dans la console
    Par sympho dans le forum C
    Réponses: 8
    Dernier message: 23/12/2005, 18h26
  2. [Forms 6i] Positionnement du curseur dans une liste
    Par Veve44 dans le forum Oracle
    Réponses: 2
    Dernier message: 13/12/2005, 16h28
  3. Réponses: 3
    Dernier message: 27/11/2005, 01h19
  4. Positionner le curseur dans un champ
    Par Smint dans le forum Access
    Réponses: 17
    Dernier message: 23/09/2005, 21h02
  5. Deplacer un curseur dans un RichEdit sous visual c
    Par tweek dans le forum Windows
    Réponses: 7
    Dernier message: 14/01/2004, 00h29

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