MFC:récupérer le texte a chaque entrée clavier dans une CEDIT
8 réponses
jihene.benmarzouk
Bonjour,
j'aimerai r=E9cup=E9rer chaque ligne saisie dans mon CEDIT CTRL =E0
part ,pour cela j ai fait ce petit code:
void CListPinDlgAdd::OnEnChangeEdit3()
{CString S;
MSG* pMsg;
j'ai essay=E9 avec ce code d'intercepter l entr=E9e clavier , mais des que
j tape dans mon cedit mon application g=E9n=E8re une erreur et se ferme ,
je comprend pas, sachant que en enlevant le "if" ,tout se passe bien.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
domi
wrote:
Bonjour, j'aimerai récupérer chaque ligne saisie dans mon CEDIT CTRL à part ,pour cela j ai fait ce petit code: void CListPinDlgAdd::OnEnChangeEdit3() {CString S; MSG* pMsg;
j'ai essayé avec ce code d'intercepter l entrée clavier , mais des que j tape dans mon cedit mon application génère une erreur et se ferme , je comprend pas, sachant que en enlevant le "if" ,tout se passe bien.
pMsg n'est initialisé nulle part...
jihene.benmarzouk@gmail.com wrote:
Bonjour,
j'aimerai récupérer chaque ligne saisie dans mon CEDIT CTRL à
part ,pour cela j ai fait ce petit code:
void CListPinDlgAdd::OnEnChangeEdit3()
{CString S;
MSG* pMsg;
j'ai essayé avec ce code d'intercepter l entrée clavier , mais des que
j tape dans mon cedit mon application génère une erreur et se ferme ,
je comprend pas, sachant que en enlevant le "if" ,tout se passe bien.
Bonjour, j'aimerai récupérer chaque ligne saisie dans mon CEDIT CTRL à part ,pour cela j ai fait ce petit code: void CListPinDlgAdd::OnEnChangeEdit3() {CString S; MSG* pMsg;
j'ai essayé avec ce code d'intercepter l entrée clavier , mais des que j tape dans mon cedit mon application génère une erreur et se ferme , je comprend pas, sachant que en enlevant le "if" ,tout se passe bien.
pMsg n'est initialisé nulle part...
jihene.benmarzouk
Bonjour, j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
Bonjour,
j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de mémoire.
Le code correct serait quelque chose comme :
MSG* pMsg; pMsg=malloc(sizeof(MSG)); // si C ou bien pMsg=new MSG(...); // si C++
Ensuite seulement, vous pouvez jouer avec pMsg.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre chaque sous-condition. Outre une meilleure lisibilité, il y a des compilos qui pourraient interpréter la chose de façon baroque :
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de
mémoire.
Le code correct serait quelque chose comme :
MSG* pMsg;
pMsg=malloc(sizeof(MSG)); // si C
ou bien
pMsg=new MSG(...); // si C++
Ensuite seulement, vous pouvez jouer avec pMsg.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre
chaque sous-condition. Outre une meilleure lisibilité, il y a des
compilos qui pourraient interpréter la chose de façon baroque :
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de mémoire.
Le code correct serait quelque chose comme :
MSG* pMsg; pMsg=malloc(sizeof(MSG)); // si C ou bien pMsg=new MSG(...); // si C++
Ensuite seulement, vous pouvez jouer avec pMsg.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre chaque sous-condition. Outre une meilleure lisibilité, il y a des compilos qui pourraient interpréter la chose de façon baroque :
merci pour vos réponses, j'ai pas trop compris comment je vais remplir la pMsg avec le MSG* pMsg=new MSG() , donc j ai crée une autre classe dont la classe de base est CEDIT, et et j'ai ajouté une variable de type cette classe, et ça marché , solution un peu tirée par les cheveux malheureusement .
merci pour vos réponses, j'ai pas trop compris comment je vais remplir
la pMsg avec le MSG* pMsg=new MSG() , donc j ai crée une autre classe
dont la classe de base est CEDIT, et et j'ai ajouté une variable de
type cette classe, et ça marché , solution un peu tirée par les
cheveux malheureusement .
merci pour vos réponses, j'ai pas trop compris comment je vais remplir la pMsg avec le MSG* pMsg=new MSG() , donc j ai crée une autre classe dont la classe de base est CEDIT, et et j'ai ajouté une variable de type cette classe, et ça marché , solution un peu tirée par les cheveux malheureusement .
Sylvain SF
Bertrand Lenoir-Welter a écrit :
j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
Le contraire serait étonnant. Vous utilisez un pointeur pMsg qui ne pointe sur rien et vous tentez d'exploiter les données de ce "rien". [...] if(NULL->message==WM_KEYDOWN ...
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de mémoire.
et le développeur avant lui !
Le code correct serait quelque chose comme :
MSG* pMsg; pMsg=malloc(sizeof(MSG)); // si C ou bien pMsg=new MSG(...); // si C++
cela évitera l'erreur grossière mais ne réalisera pas ce que souhaite faire le PO; il cherche ici à connaître et utiliser le dernier message traité par son application, alors que celui-ci est entièrement consommé quand la notification "EN_CHANGE" est postée.
il devrait en fait surcharger OnChar(...) pour son contrôle.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre chaque sous-condition. Outre une meilleure lisibilité, il y a des compilos qui pourraient interpréter la chose de façon baroque
pur question de goût; la priorité des opérateurs est clairement définie par la norme, si un compilateur les interprète à sa sauce, celui-ci ne mérite peut être pas d'être utilisé.
Sylvain.
Bertrand Lenoir-Welter a écrit :
j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
Le contraire serait étonnant. Vous utilisez un pointeur pMsg qui ne
pointe sur rien et vous tentez d'exploiter les données de ce "rien".
[...]
if(NULL->message==WM_KEYDOWN ...
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de
mémoire.
et le développeur avant lui !
Le code correct serait quelque chose comme :
MSG* pMsg;
pMsg=malloc(sizeof(MSG)); // si C
ou bien
pMsg=new MSG(...); // si C++
cela évitera l'erreur grossière mais ne réalisera pas ce que souhaite
faire le PO; il cherche ici à connaître et utiliser le dernier message
traité par son application, alors que celui-ci est entièrement consommé
quand la notification "EN_CHANGE" est postée.
il devrait en fait surcharger OnChar(...) pour son contrôle.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre
chaque sous-condition. Outre une meilleure lisibilité, il y a des
compilos qui pourraient interpréter la chose de façon baroque
pur question de goût; la priorité des opérateurs est clairement définie
par la norme, si un compilateur les interprète à sa sauce, celui-ci ne
mérite peut être pas d'être utilisé.
j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
Le contraire serait étonnant. Vous utilisez un pointeur pMsg qui ne pointe sur rien et vous tentez d'exploiter les données de ce "rien". [...] if(NULL->message==WM_KEYDOWN ...
ce qui n'a aucun sens et doit quelque peu heurter le gestionnaire de mémoire.
et le développeur avant lui !
Le code correct serait quelque chose comme :
MSG* pMsg; pMsg=malloc(sizeof(MSG)); // si C ou bien pMsg=new MSG(...); // si C++
cela évitera l'erreur grossière mais ne réalisera pas ce que souhaite faire le PO; il cherche ici à connaître et utiliser le dernier message traité par son application, alors que celui-ci est entièrement consommé quand la notification "EN_CHANGE" est postée.
il devrait en fait surcharger OnChar(...) pour son contrôle.
Un conseil annexe, prenez l'habitude d'ajouter des parenthèses entre chaque sous-condition. Outre une meilleure lisibilité, il y a des compilos qui pourraient interpréter la chose de façon baroque
pur question de goût; la priorité des opérateurs est clairement définie par la norme, si un compilateur les interprète à sa sauce, celui-ci ne mérite peut être pas d'être utilisé.
Sylvain.
jihene.benmarzouk
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la quelle j'ai mis ce petit code pour intercepter le retour clavier (et ça marche):
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne me renvoi le texte que si j'appuie sur la touche entrée , et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la CDIALOG contenant le CEDIT disparaît , j'ai vérifié avec les proprietés de la CEDIT et de la CDIALOG , mais j'ai pas trouvé de sol
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la
quelle j'ai mis ce petit code pour intercepter le retour clavier (et
ça marche):
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne
me renvoi le texte que si j'appuie sur la touche entrée
, et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la
CDIALOG contenant le CEDIT disparaît , j'ai vérifié avec les
proprietés de la CEDIT et de la CDIALOG , mais j'ai pas trouvé de sol
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la quelle j'ai mis ce petit code pour intercepter le retour clavier (et ça marche):
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne me renvoi le texte que si j'appuie sur la touche entrée , et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la CDIALOG contenant le CEDIT disparaît , j'ai vérifié avec les proprietés de la CEDIT et de la CDIALOG , mais j'ai pas trouvé de sol
Sylvain SF
a écrit :
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la quelle j'ai mis ce petit code pour intercepter le retour clavier (et ça marche):
oui, j'ai bien lu que vous aviez opté pour une mauvaise solution, et cela fonctionne mal ? étonnant ...
votre question initiale porte sur un "code surprise", un code où nous devons deviner sa définition et son action supposé. "OnEnChangeEdit3" n'est pas une méthode virtuelle de CWnd donc j'imagine que vous avez enregistré cet handler en réponse au notification ON_EN_CHANGE sur ce control (ce via les belles macros inbitables des MFC).
déteter un caractère spécial (ici Entrée) pour faire un traitement spécial aurait été plus efficace.
reste que "récupérer chaque ligne saisie dans mon CEDIT CTRL à part" ne veux pas dire grand chose. est-ce un edit control multi-line (ES_MULTILINE) ? a-t-il le style ES_WANTRETURN ? (s'il ne l'a pas votre dialog se fermera dès le premier entrée. d'ailleurs est-ce que cela le texte suivant décrit ?
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne me renvoi le texte que si j'appuie sur la touche entrée , et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la CDIALOG contenant le CEDIT disparaît
/tout ce qu'il y'a dans la CDialog/ est également un peu vague, par défaut un CDialog a un DoDataExchange() qui se charge de récupérer les données des différents contrôles du dialog, mais est-elle correctement utilisée ? ou encore est-ce que "disparait" veux seulement dire que le dialogue se ferme (ce qui est normal!).
pour revenir à votre question, en quoi la récupération ligne à ligne du contenu de l'edit doit être réalisé "en live" ? ne serait-il pas suffisant de parser ce contenu à la fin (lorsque l'on clique sur "OK") pour le découper en lignes distinctes à ce moment ?
Sylvain.
jihene.benmarzouk@gmail.com a écrit :
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la
quelle j'ai mis ce petit code pour intercepter le retour clavier (et
ça marche):
oui, j'ai bien lu que vous aviez opté pour une mauvaise solution,
et cela fonctionne mal ? étonnant ...
votre question initiale porte sur un "code surprise", un code
où nous devons deviner sa définition et son action supposé.
"OnEnChangeEdit3" n'est pas une méthode virtuelle de CWnd
donc j'imagine que vous avez enregistré cet handler en
réponse au notification ON_EN_CHANGE sur ce control (ce via
les belles macros inbitables des MFC).
déteter un caractère spécial (ici Entrée) pour faire un
traitement spécial aurait été plus efficace.
reste que "récupérer chaque ligne saisie dans mon CEDIT CTRL
à part" ne veux pas dire grand chose. est-ce un edit control
multi-line (ES_MULTILINE) ? a-t-il le style ES_WANTRETURN ?
(s'il ne l'a pas votre dialog se fermera dès le premier entrée.
d'ailleurs est-ce que cela le texte suivant décrit ?
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne
me renvoi le texte que si j'appuie sur la touche entrée
, et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la
CDIALOG contenant le CEDIT disparaît
/tout ce qu'il y'a dans la CDialog/ est également un peu vague,
par défaut un CDialog a un DoDataExchange() qui se charge de
récupérer les données des différents contrôles du dialog, mais
est-elle correctement utilisée ? ou encore est-ce que "disparait"
veux seulement dire que le dialogue se ferme (ce qui est normal!).
pour revenir à votre question, en quoi la récupération ligne à
ligne du contenu de l'edit doit être réalisé "en live" ? ne serait-il
pas suffisant de parser ce contenu à la fin (lorsque l'on clique sur
"OK") pour le découper en lignes distinctes à ce moment ?
comme j l'ai déjà dit ,j'ai crée une classe fille a CEDIT,dans la quelle j'ai mis ce petit code pour intercepter le retour clavier (et ça marche):
oui, j'ai bien lu que vous aviez opté pour une mauvaise solution, et cela fonctionne mal ? étonnant ...
votre question initiale porte sur un "code surprise", un code où nous devons deviner sa définition et son action supposé. "OnEnChangeEdit3" n'est pas une méthode virtuelle de CWnd donc j'imagine que vous avez enregistré cet handler en réponse au notification ON_EN_CHANGE sur ce control (ce via les belles macros inbitables des MFC).
déteter un caractère spécial (ici Entrée) pour faire un traitement spécial aurait été plus efficace.
reste que "récupérer chaque ligne saisie dans mon CEDIT CTRL à part" ne veux pas dire grand chose. est-ce un edit control multi-line (ES_MULTILINE) ? a-t-il le style ES_WANTRETURN ? (s'il ne l'a pas votre dialog se fermera dès le premier entrée. d'ailleurs est-ce que cela le texte suivant décrit ?
mais le problème avec le CEDIT BOX qui n'est pas multiligne , elle ne me renvoi le texte que si j'appuie sur la touche entrée , et quand j'appuie sur la touche entrée ,tout ce qu'il y'a dans la CDIALOG contenant le CEDIT disparaît
/tout ce qu'il y'a dans la CDialog/ est également un peu vague, par défaut un CDialog a un DoDataExchange() qui se charge de récupérer les données des différents contrôles du dialog, mais est-elle correctement utilisée ? ou encore est-ce que "disparait" veux seulement dire que le dialogue se ferme (ce qui est normal!).
pour revenir à votre question, en quoi la récupération ligne à ligne du contenu de l'edit doit être réalisé "en live" ? ne serait-il pas suffisant de parser ce contenu à la fin (lorsque l'on clique sur "OK") pour le découper en lignes distinctes à ce moment ?
Sylvain.
jihene.benmarzouk
Bonjour merci pour la réponse sylvain , en effet , j'ai mis mon code comme suivant: