(j'utilise VS ++ 2005)MFC OnEnChange fonction de gestionnaire - boucle infinie
je mets le contrôle de zone d'édition (avec ID - ID_edit_box
) sur ma boîte de dialogue, et associé (avec l'assistant de gestionnaire) deux varibles pour elle : contrôle (c_editbox
) et valeur (v_editbox
) variable. Aussi j'associe la fonction de gestionnaire OnEnChangeedit_box
avec ce contrôle de boîte d'édition. Supposons que nous puissions entrer seulement un chiffre dans la boîte d'édition, et ce chiffre peut être 0 ou 1. Si nous entrons une autre valeur - ce que je veux, c'est que le contenu de cette boîte d'édition est automatiquement effacé, tapez n'importe quoi (en d'autres termes, l'utilisateur ne peut rien entrer sauf 0/1 dans la zone d'édition). Je fais cette vérification dans la fonction onEnChangeedit_box
. Voici le code:
void CSDRDlg::OnEnChangeedit_box()
{
CWnd* pWnd;
CString edit_box_temp;
pWnd = GetDlgItem(ID_edit_box);
pWnd->GetWindowText(edit_box_temp);
if ((edit_box_temp == "0" || edit_box_temp == "1")
{...do something - i.e. setfocus on some other edit box }
else
{
pWnd->SetWindowText(""); // clear the content of edit box
//... any other statement below will not be executed because the
//above line cause again call of this function
}
}
debugger et découvrir cette ligne: pWnd->SetWindowText("");
provoque une boucle infinie parce que nous changeons le contenu du contrôle dans cette fonction qui déclenche à nouveau son appel.
Mais je change code ci-dessus comme ceci:
void CSDRDlg::OnEnChangeedit_box()
{
UpdateData(TRUE);
if ((v_editbox == "0" || v_editbox== "1")
{...do something - i.e. setfocus on some other edit box }
else
{
v_editbox = "";
UpdateData(FALSE);
}
}
et qui fonctionne ce que je veux, mais quelqu'un peut me expliquer pourquoi, lorsque nous appelons
v_editbox = "";
UpdateData(FALSE);
qui ne provoque pas une boucle infinie .