Comment fait-on pour effacer le contenu de mon CEdit mutiligne?
Merci d'avance
Comment fait-on pour effacer le contenu de mon CEdit mutiligne?
Merci d'avance
Salut,
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part CEdit::SetWindowText("");
Suffit pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part CEdit::SetSel(0,-1);CEdit::Clear()
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
J'ai essayé, mais ça écrase seulement ce que j'ai dans mon CEdit.
Ca réécrit à partir du début du CEdit, mais ce qui a été écrit précedemment est toujours là :s
Je comprend pas ce que tu veux dire ? Ce n'est pas écraser ton CEdit que tu veux faire ?
Question accéssoire : as-tu une variable associée ? Auquel cas, ce serait plutôt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 str_cedit.Empty(); UpdateData(FALSE);
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Dsl, en fait le pb venait d'autre part
En effet, ça fonctionne
Je fais un petit test tout con:
ToCtrl() fait un SetWindowText() et AppendToCEdit() ajoute du texte à la suite du CEdit.
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 void CTestCardReaderDlg::OnTest() { static bool bFirst = TRUE; ToCtrl(m_editResult, CString(_T(""))); if (bFirst) { AppendToCEdit(m_editResult, CString(_T("Un\r\n"))); AppendToCEdit(m_editResult, CString(_T("Deux\r\n"))); AppendToCEdit(m_editResult, CString(_T("Trois\r\n"))); AppendToCEdit(m_editResult, CString(_T("Quatre\r\n"))); bFirst = FALSE; } else { AppendToCEdit(m_editResult, CString(_T("Cinq\r\n"))); AppendToCEdit(m_editResult, CString(_T("Six\r\n"))); } Sleep(2000); }
Quand j'appuie sur le bouton test, il m'affiche:
Quand j'appuie une nouvelle fois sur le bouton test, il m'affiche:Un
Deux
Trois
Quatre
puis au bout de 2s, m'efface 'Quatre'.Cinq
Six
Quatre
Donc en fait, la CEdit est effacée seulement à la fin de la fonction, et non pas lors de l'appel de :
La mise à jour du CEdit avec UpdateData() est donc exécutée en sortie de fonction?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ToCtrl(m_editResult, CString(_T("")));
Je ne comprend pas : tu mélanges un m_editResult/DDX_Text et SetWindowText. Car là, effectivement, ça génère quelques problèmes.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Dans TestCardReaderDlg.h :
Dans TestCardReaderDlg.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CEdit m_editResult; CString m_strResult;
Enfin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DDX_Control(pDX, IDC_RESULT, m_editResult); DDX_Text(pDX, IDC_RESULT, m_strResult);
Ai-je mélangé quelque-chose?
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 template<> bool ToCtrl<const CString>(CWnd& ctrl, const CString& value) { ctrl.SetWindowText(value); return TRUE; } void AppendToCEdit(CEdit& editBox, CString& strMessage) { int cbLen = editBox.GetWindowTextLength(); editBox.SetSel(cbLen, cbLen); editBox.ReplaceSel(strMessage); }
Salut,
Ben je dirais qu'à un moment tu peux avoir une incohérence entre m_strResult et m_editResult.SetWindowText(). Donc un écrasement d'une des deux valeurs selon un UpdateData(TRUE) ou UpdateData(FALSE).
La simplicité permettant de diminuer le nbr de bug, je te conseille soit de supprimer m_strResult, soit de changer les SetWindowText par une mise à jour de m_strResult suivi de l'UpdateData.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Je n'ai gardé que m_editResult, j'ai supprimé m_strResult, et toujours le même problème.
Quand tu testes chez toi, ça marche? Je suis sous VC++ 6.0, peut-être que ça y joue...
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 void CTestCardReaderDlg::OnTest() { CString strResult; static bool bFirst = TRUE; m_editResult.SetWindowText(_T("")); if (bFirst) { AppendToCEdit(m_editResult, CString(_T("Un\r\n"))); AppendToCEdit(m_editResult, CString(_T("Deux\r\n"))); AppendToCEdit(m_editResult, CString(_T("Trois\r\n"))); AppendToCEdit(m_editResult, CString(_T("Quatre\r\n"))); bFirst = FALSE; } else { AppendToCEdit(m_editResult, CString(_T("Cinq\r\n"))); AppendToCEdit(m_editResult, CString(_T("Six\r\n"))); bFirst = TRUE; } Sleep(2000); }
Edit:
Apparemment c'est parce-que Windows gère les mises à jours sous forme de message. Le message est transmis à la fin de la fonction sur le clic du bouton, donc, l'effacement ne s'effectue qu'une fois la fonction exécutée![]()
Essaies de coller un UpdateWindow pour forcer un WM_PAINT.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Ca ne change rien, mon collègue m'a conseillé de passer par un thread
Avoir 2 threads qui gère de l'I.H.M. ca risque de te créer plus de soucis qu'autre chose. Peux-tu poster un zip du projet ou d'un projet minimal reproduisant le bug ?
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
non c'est des SendMessage, donc la fonction est executée en ligne ...Apparemment c'est parce-que Windows gère les mises à jours sous forme de message. Le message est transmis à la fin de la fonction sur le clic du bouton, donc, l'effacement ne s'effectue qu'une fois la fonction exécutée
c'est un problème d'affichage. Ton Sleep(2000) fais que l'affichage n'est pas rafraichit immédiatement.
Un UpdateWindow() devrait faire l'affaire
les thread c'est à la mode en ce momentCa ne change rien, mon collègue m'a conseillé de passer par un thread
on met des threads partout ...
sérieusement, aucune utilité pour ton probleme, au contraire
tu figes la boucle à message c'est ça qui fait tes soucis
-->à cause du Sleep() ...puis au bout de 2s, m'efface 'Quatre'.
@+
Voici un exemple minimaliste : http://dl.free.fr/vxPIswYpb
Merci pour aide, je débute en MFC et ne suis pas encore à l'aise![]()
En fait c'est pour simuler l'exécution d'un programme.
Je travaille sur des lecteurs de cartes bancaires. Quand j'appuie sur le bouton, je procède à un prélèvement:
- Initialisation lecteur de carte
- Connexion
- Débit
- Déconnexion
...
J'affiche des messages dans mon CEdit, donc ça prend bien plus de 2s, c'était juste une manière simplifiée de représenter mon pb.
Ensuite, quand j'appuie à nouveau sur le bouton, je veux effacer mon CEdit pour afficher à nouveau les étapes de ma nouvelle transaction.
ok ben alors thread si c'est un traitement que tu ne peux pas segmenter (genre calcul et cie), ou sinon passer par un Timer ou un traitement dans OnIdle() si tu peux segmenter (s'il y a des attentes dans le traitement pour une lecture par exemple)J'affiche des messages dans mon CEdit, donc ça prend bien plus de 2s, c'était juste une manière simplifiée de représenter mon pb.
si tu as tout en ligne, ton IHM sera figé le temps du traitement, pas de réponse aux clics, au clavier, à l'affichage ...
si c'est juste l'affichage qui te gêne, un UpdateWindow() avant le Sleep()
tout dépend de ton traitement, mais si tu peux éviter de passer par un thread ça sera plus simple ...
@+
Tu dois avoir des acquittement sur les opérations de ton lecteur de cartes ? Fais comme dit stephdim : privilégie un automate qui met à jour ton édit sur ces évènements plutôt que d'essayer les threads. Le problème des threads c'est que ça créé de la complexité là où il n'y en a pas. Puis avec Visual 6, c'est un peu galère le debug.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Oui c'est juste l'affichage qui me gène
Je viens de retester UpdateWindow() et ça marche
Désolé 3DArchi, tu m'avais déjà donné la réponse, j'avais du appuyer avant les 2s, du coup la fonction n'avait pas du se terminer quand j'avais tester.
Merci pour votre aide et patience![]()
Partager