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

MFC Discussion :

[MFC][CEdit] Communication entre 2 contrôles CEdit..


Sujet :

MFC

  1. #1
    Membre du Club

    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 40
    Points
    40
    Par défaut [MFC][CEdit] Communication entre 2 contrôles CEdit..
    Bonjour à tous!!!

    Cela concerne toujours mon application SDI basée sur un FormView.

    J'ai 2 objets CMyEdit et CMyCodEdit tous deux derivés de CEdit, tous deux présents sur mon formulaire.

    Voilà ce que je veux faire:
    Le control CMyCodEdit contient le contenu d'un fichier.

    Le control CMyEdit affiche des lignes d'erreur sous un format précis.
    Au clic sur une des lignes de ce controle il extrait du message d'erreur le numero de la ligne du fichier concerné.

    Je fais cela comme ça :

    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
    void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CString tmp;
    	CMainFrame * theFrm;
     
    	int n = CharFromPos(point); 
     
    	ligneCliquee = HIWORD(n);
     
    	tmp.Format("Lig %d",getLigneSel());
     
    	theFrm = (CMainFrame*) AfxGetMainWnd(); //test valeur retournée
    	theFrm->m_wndStatusBar.SetPaneText(1,tmp);
     
    	CEdit::OnLButtonDown(nFlags, point);
    }
     
    int  CMyEdit::getLigneSel(){
     
    	CString laLigne;
    	char l[512];
     
    	this->GetLine(ligneCliquee, l );
    	laLigne.Format("%s",l);
     
    	laLigne = laLigne.Right(laLigne.GetLength()-laLigne.Find("(")-1);
    	laLigne = laLigne.Left(laLigne.Find(","));
     
    	if (laLigne.IsEmpty()){
    		return -1;
    	}else{
    		return atoi(laLigne.GetBuffer(0));
    	}
    }
    Cela marche impec. Seulement ce que je voudrais c'est que une fois le numéro de ligne intercepté, celle-ci soit selectionnée dans le control CMyCod Edit.

    Je pense qu'il faut envoyer un message mais je en capte pas trop comment procéder.
    Je ne vois pas comment envoyer un message de mon CMyEdit à mon CMyCodEdit et quelle message envoyé...
    Dois-je en créer un???

    Merci d'avance pour votre aide!!!

    Et bonne apéro!!! ( On est Dimanche quand même 8) )

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour ton pb il faut utiliser SetSel mais avec une petit variante :
    il faut utiliser l'envoi par un postmessage.
    setsel utilise en interne un SendMessage et
    leftbuttondown va enlever la sélection immédiatement derrière!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int n = CharFromPos(point);
        int nLineIndex = HIWORD(n);
        int nCharIndex = LOWORD(n);
        //SetSel(nCharIndex,nCharIndex+LineLength(nLineIndex));      ::PostMessage(m_hWnd,EM_SETSEL,nCharIndex,nCharIndex+LineLength(nLineIndex));
    bon app!

  3. #3
    Membre du Club

    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Merci farscape pour ton aide précieuse.

    Seulement il ya encore un petit problème...

    En effet ton code me permet de mettre en selection une ligne de mon CMyEdit (celui sur lequel j'ai cliqué). Or ce que je recherche c'est sélectionné la ligne du control CMyCodEdit.

    En gros je veux créer le même système que Visual quand il génère des erreurs de compilation: quand on clique sur l'erreur, visual se place sur la ligne concernée.

    J'ai essayé comme ça:
    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
    void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CString tmp;
    	CMainFrame * theFrm;
     
    	int n = CharFromPos(point); 
    	//int nLineIndex = HIWORD(n); 
    	//int nCharIndex = LOWORD(n); 
     
    	ligneCliquee = HIWORD(n);
     
    	::PostMessage(theFrm->GetDlgItem(IDC_MJJ)->m_hWnd, EM_SETSEL, 0, 0+LineLength(ligneCliquee)); 
     
    	CEdit::OnLButtonDown(nFlags, point);
    }
    mais ça à l'air d'être gore car il me génère un rapport d'erreur...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    dans ton exemple la variable theFrm n'est pas initialisée !
    ça m'etonne pas que le postmessage explose .

    [/code]

  5. #5
    Membre du Club

    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Quelle truie je fais ....

    Voici le code pour ceux que ça interesse...

    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
    void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CString tmp;
    	CMainFrame * theFrm;
    	theFrm = (CMainFrame*) AfxGetMainWnd();
     
    	int n = CharFromPos(point); 
     
    	ligneCliquee = HIWORD(n);
     
    	CMyCodEdit * mce = (CMyCodEdit *) ((theFrm->GetActiveView())->GetDlgItem(IDC_MJJ));
    	::PostMessage(mce->m_hWnd, EM_SETSEL, 0, mce->LineLength(ligneCliquee) ); 
     
    	CEdit::OnLButtonDown(nFlags, point);
    }
     
    int  CMyEdit::getLigneSel(){
     
    	CString laLigne;
    	char l[512];
     
    	this->GetLine(ligneCliquee, l );
    	laLigne.Format("%s",l);
     
    	laLigne = laLigne.Right(laLigne.GetLength()-laLigne.Find("(")-1);
    	laLigne = laLigne.Left(laLigne.Find(","));
     
    	if (laLigne.IsEmpty()){
    		return -1;
    	}else{
    		return atoi(laLigne.GetBuffer(0));
    	}
    }
    Merci encore et encore farscape!!!

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

Discussions similaires

  1. [MFC] SendMessage entre 2 contrôles
    Par Manson dans le forum MFC
    Réponses: 6
    Dernier message: 13/06/2005, 09h33
  2. [MFC] aller en bas d'un CEdit
    Par bourinator dans le forum MFC
    Réponses: 5
    Dernier message: 29/06/2004, 13h46
  3. [MFC] communication entre onglets d'une fenêtre
    Par bigboomshakala dans le forum MFC
    Réponses: 12
    Dernier message: 29/05/2004, 12h12
  4. Réponses: 6
    Dernier message: 28/02/2004, 09h19
  5. [MFC] Retour à la ligne dans un CEdit
    Par Kant dans le forum MFC
    Réponses: 7
    Dernier message: 18/02/2004, 08h58

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