Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

MFC:récupérer le texte a chaque entrée clavier dans une CEDIT

8 réponses
Avatar
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;

if(pMsg->message =3D=3D WM_KEYDOWN && pMsg->wParam =3D=3D VK_RETURN)
{
GetDlgItem(IDC_EDIT3)->GetWindowText(S) ;
} }

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.

8 réponses

Avatar
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;

if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
GetDlgItem(IDC_EDIT3)->GetWindowText(S) ;
} }

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...
Avatar
jihene.benmarzouk
Bonjour,
j'ai initialisé pMsg =NULL; et c'est toujours le même problème :((
Avatar
Bertrand Lenoir-Welter
> 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".

MSG* pMsg=0;
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)

revient à écrire

if(NULL->message==WM_KEYDOWN ...

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 :

if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))
Avatar
jihene.benmarzouk
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 .
Avatar
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.
Avatar
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
Avatar
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.
Avatar
jihene.benmarzouk
Bonjour merci pour la réponse sylvain ,
en effet , j'ai mis mon code comme suivant:

void CMicroFamilyDlgAdd::OnBnClickedOK()
{
LPSTR S;
//::GetWindowText(m_edit3.GetSafeHwnd (),S,sizeof(S));
//m_edit3.GetWindowText(S);

::AfxMessageBox(m_edit3);//m_edit3 est une value de type CString
}

et en changeant multiline et wantreturn , ma dialog ne disparait plus
mais je ne récupère plus de text.