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 :

Obtenir les coordonnées d'un curseur (RichEdit)


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut Obtenir les coordonnées d'un curseur (RichEdit)
    Bonjour,

    J'ai un petit problème, j'aimerais connaître la position du curseur dans un
    RichEdit.

    Actuellement je développe une application, et je voudrais faire une petite fenetre qui s'ouvre lorsque l'on presse ctrl+space ( un peu comme dans Bcb et pas mal d'autre IDE).

    Le seul souci c'est qu'il faudrait que je connaisse la position du curseur afin de positionner la fenetre juste à côter de celui-ci.


    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Galip:
    Une possibilite:
    Un TRichEdit deux TLabel double click dans l'evenement OnMouseMove du TRichEdit le code a inserer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::RichEdit1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    Label1->Caption = X;
    Label2->Caption = Y;
    }
    Ca peut se faire sur un autre evenement Mouse

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut
    Merci de ta réponse,

    Le seul souci c'est qu'avec l'événement OnMouseMove, j'ai la position de la souris et ce qu'il me faudrais c'est la position du curseur.

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux faire ceci dans le OnKeyUp ou encore OnKeyPress ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::RichEdit1KeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
      ShowMessage(IntToStr(RichEdit1->SelStart)); // Affiche la position du caret
    }
    J'espère avoir bien saisi le sens de ta question
    @+

    EDIT:

    Ce code est peut être plus dans ce que tu souhaites faire je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::RichEdit1KeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
      ShowMessage("X:"+IntToStr(RichEdit1->CaretPos.x)+", Y:"+IntToStr(RichEdit1->CaretPos.y));
    }

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut
    Merci beaucoup ton code marche nikel.

    C'est clair et efficace

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par Galip
    Merci beaucoup ton code marche nikel.

    C'est clair et efficace

    Merci !

    Par contre, j'arrive pas à positionner un bouton à l'endroit du Caret!
    Le soucis, c'est la conversion de données ...

    J'ai ce code mais en vain :

    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
    void __fastcall TForm1::Cliquer(TObject *Sender)
    {
      TButton *BoutonCliquer = (TButton*)Sender;
      BoutonCliquer->Visible=False;
    }
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     TPoint a= ClientToScreen(RichEdit1->CaretPos);
     TButton *MyButton = new TButton(this);
     MyButton->Parent=this;
     MyButton->Left = a.x + MyButton->Width /2;
     MyButton->Top = a.y + MyButton->Height;
     MyButton->OnClick=Cliquer;
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     TPoint a= ClientToScreen(RichEdit1->CaretPos);
    ShowMessage(IntToStr(a.x)+" "+IntToStr(a.y));
    }
    //---------------------------------------------------------------------------
    Si jamais tu as réussi, je suis prenant

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Je pense ( pas sur et je vais vérifier ) que c'est parceque l'Edit ou le RichEdit perds son Focus lorsque tu passes dans l'évènement OnClick() du TButton.
    Donc en qq sorte, adieu CaretPos et cie ...

    Tiens, c'est marrant ca, je vais jeter un oeil ( un seul, parceque j'en ai plus que deux ).


  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci Sunchaser de venir nous aider!

    Je pense que je devrais ouvrir un autre post , qu'en penses tu ?

    Sinon, je récupère bien les coordonnées du RichEdit, mais lorsque l'on passe à la ligne dans le RichEdit, je ne bouge que d'un pixel en Y et je ne pense pas que ça soit vraiment le cas ... Pareil en X.

    C'est une chose qui m'intéresse !

  9. #9
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Heu .... ben j'ai l'impression que ca va être bien casse-pied a faire ca !

    (Impression a chaud apres un premier test ...)

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut
    Je vois que la conversation se poursuit

    Pour te dire franchement, j'ai tester ton code et j'ai vu que sa fonctionnait alors je me suis dit que je ferais sa demain ^^.

    Donc si demain tout fonctionne je vous mettrez le code.


    Bonsoir.

  11. #11
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Bon en observant mon chien, lors de sa petite sortie nocturne, en train de faire caca sur le trottoir du voisin, j'ai eu une petite idée:

    . dans le .H:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:
                    TPoint EdPoint;
    . dans le .CPP:
    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
     
    void __fastcall TForm2::RichEdit1Click(TObject *Sender)
    {
    GetCaretPos(&EdPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::RichEdit1Change(TObject *Sender)
    {
    GetCaretPos(&EdPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::RichEdit1Enter(TObject *Sender)
    {
    GetCaretPos(&EdPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::Button31Click(TObject *Sender)
    {
     TButton *mb = new TButton(this);
     mb->Parent = RichEdit1;
     mb->Left = EdPoint.x;
     mb->Top = EdPoint.y;
     mb->Width = 15;
     mb->Height = 15;
    }
    //---------------------------------------------------------------------------
    Maintenant ca a l'air de placer le button aux bonnes coordonnées, mais - histoire de jouer - un autre petit problème apparait:
    ca écrase le texte en certains endroits, plus qu'il ne le faudrait par rapport a la taille du button en tout cas...

    A voir donc.
    @ +

    (au fait, j'ai pas l'impression que ce soit le caca du chien qui m'inspire, mais plutôt l'air frais de la nuit ... )

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Je viens de tester ton code et pour la position du bouton c'est niquel !

    Bon si on regarde bien, on dirait qu'il y a une copie du "canvas" ...
    Si tu regardes, tu écris tu textes, tu cliques sur le bouton qui affiche un nouveau bouton dans le RichEdit, tu positionnes du Caret juste avant le bouton et tu t'amuses à faire ENTRER, tu verras que le dessin du bouton se copie ...

    Je suis pas du tout calé dans ce genre de chose, et je crains que je ne puisse que constater tes progrès ....

    Je chercherai encore un peu, là je vais au dodo

  13. #13
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Idem ...

    Bonne nuitée

  14. #14
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    J'ai peut être trouvé! Il faut changer le repère et ne pas prendre le RichEdit comme parent du TButton que l'on va créer, mais la form!

    On a donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TButton *mb = new TButton(this);
      mb->Parent = this;
      mb->Left = RichEdit1->Left+EdPoint.x + 3;
      mb->Top = RichEdit1->Top+EdPoint.y + 3;
      mb->Width = 15;
      mb->Height = 15;
    }
    Je ne pense pas que cela change quoique ce soit puisque après, le bouton se détruit

    Qu'en dis- tu?

  15. #15
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut
    Oui je viens de tester ta solution, sa marche nikel.

    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
    void __fastcall TForm1::RichEdit1Change(TObject *Sender)
    {
     
       GetCaretPos(&EdPoint);
       if(Form2->Showing)
       {
             Form2->Left = RichEdit1->Left+EdPoint.x + 3;
             Form2->Top=RichEdit1->Top+EdPoint.y + 3-Form2->Height;
       }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::RichEdit1Enter(TObject *Sender)
    {
    GetCaretPos(&EdPoint);        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RichEdit1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      Form2->Close();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key)
    {
     
            if(GetAsyncKeyState(VK_CONTROL)!=0 && GetAsyncKeyState(VK_SPACE)!=0)
            {
                 Form2->Show();
                 Form2->Parent=this;
                 Form2->Left=RichEdit1->Left+EdPoint.x + 3;
                 Form2->Top=RichEdit1->Top+EdPoint.y + 3-Form2->Height;
                 Form2->ListBox1->SetFocus();
                 btncreer=true;
            }
    }
    J'ai fait une Form2 sans bordure et avec une ListBox,
    j'ai encore une petite question pour ajouter du texte dans le RichEdit j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->RichEdit1->Lines->Add(ListBox1->Items->Strings[ListBox1->ItemIndex]);
    Seulement, le texte ajouter est mis à la ligne suivante, comment faire pour que le texte ajouter se rajoute au bout de la ligne courrante ?


    Merci d'avance.

  16. #16
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Je n'ai pas BCB sous la main, mais je peux te donner une méthode pour l'ajout :

    1) On stocke dans une variable tout le text avant le curseur;
    2) On stocke dans une autre variable tout le texte après le curseur (au cas ou il y aurai déjà du texte après)
    3) Lorsque tu sélectionne le texte de ton menu, tu fais :
    RichEdit.text = Variable1 + MotDuListBox + Variable 2;

    C'est vraiment une piste sans pour autant que celà fonctionne !
    J'essaierai de voir cela ce soir!

    @+

  17. #17
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Points : 69
    Points
    69
    Par défaut
    Merci beaucoup pour ton idée,

    D'ailleurs tu m'en a donnée une autre

    Voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString texte=ListBox1->Items->Strings[ListBox1->ItemIndex];
    Form1->RichEdit1->SelText=texte;
    SelText sa te permet d'insérer du texte à l'endroit ou est positionner le curseur.

    A+ et merci beaucoup pour ta participation.

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ba de rien, ce fut un plaisir de participer à ce sujet!!

    J'ai encore appris différentes choses grâce à cela et j'avoue que c'était intéressant !

    Bonne continuation

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

Discussions similaires

  1. Obtenir les coordonné 2D de coordonné 3D
    Par LastSpear dans le forum OpenGL
    Réponses: 6
    Dernier message: 20/08/2009, 23h23
  2. [Java3D]Obtenir les coordonnés de la caméra
    Par surfeurman5 dans le forum 3D
    Réponses: 3
    Dernier message: 31/03/2008, 15h35
  3. Obtenir les coordonnées d'un element
    Par joKED dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/05/2007, 12h30
  4. Obtenir les coordonnées d'un tableau
    Par Etanne dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/12/2005, 09h14
  5. Obtenir les coordonnées réelles
    Par chep dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/04/2005, 12h05

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