[WinXP][VC++ 6 MFC] Récupération de la séléction d'un élément d'une liste ds combobox
Bonjour,
Je crée une application avec VC++ 6 SP6 qui gère des sessions utilisateurs. J'ai donc crée quelques boites de dialogues avec des champs. J'ai des problèmes en particulier avec la boite de dialogue qui supprime un utilisateur. J'ai crée la dialogue avec classwizard, elle est composée ainsi :
- Une combobox avec liste fermée qui liste les utilisateurs enregistrés
- Une CEdit en Read Only qui affiche le niveau d'utilisateur (opérateur, admin ...)
J'ai également dans les sources fait hériter la classe DlgDeleteLogin d'une classe qui m'est propre, qui gère une liste d'utilisateurs.
Lorsque dans le menu je demande la suppression d'un utilisateur, je crée dans le document une Dialog, je fai appel a DoModal et je récupère le résultat.
Lorsque l'utilisateur choisit le login du profil a supprimer je fais afficher automatiquement le niveau correspondant dans la CEdit (ON_CBN_SELENDOK).
C'est à ce moment-là que cela bug, le deboggeur m'indique que le handle sur la CDialog est nul, et toute action sur les éléments de la boite de dialogue tombe sur une assertion : ASSERT(::IsWindow(m_hWnd))
Voici le code de la classe de la dialogue :
Code:
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 35 36 37 38
|
class CDlgDeleteLogin : public CUserProfileMgt, public CDialog
{
// Construction
public:
CUserProfile m_DeletedUser;
CDlgDeleteLogin(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CDlgDeleteLogin)
enum { IDD = IDD_DLG_DELETE_LOGIN };
CStatic m_sUserLogin;
CStatic m_SUserLevel;
CEdit m_cUserLevel;
CComboBox m_cUserLogin;
CString m_szUserLevel;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDlgDeleteLogin)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CDlgDeleteLogin)
afx_msg void OnSelendokComboUserLogin();
virtual BOOL OnInitDialog();
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}; |
Ci-dessous l'implémentation :
Code:
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
// DlgDeleteLogin.cpp : implementation file
//
[...]
#include "DlgDeleteLogin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgDeleteLogin dialog
CDlgDeleteLogin::CDlgDeleteLogin(CWnd* pParent /*=NULL*/)
: CDialog(CDlgDeleteLogin::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgDeleteLogin)
m_szUserLevel = _T("");
//}}AFX_DATA_INIT
}
void CDlgDeleteLogin::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgDeleteLogin)
DDX_Control(pDX, IDC_STATIC_USER_LOGIN, m_sUserLogin);
DDX_Control(pDX, IDC_STATIC_USER_LEVEL, m_SUserLevel);
DDX_Control(pDX, IDC_EDIT_USER_LEVEL, m_cUserLevel);
DDX_Control(pDX, IDC_COMBO_USER_LOGIN, m_cUserLogin);
DDX_Text(pDX, IDC_EDIT_USER_LEVEL, m_szUserLevel);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgDeleteLogin, CDialog)
//{{AFX_MSG_MAP(CDlgDeleteLogin)
ON_CBN_SELENDOK(IDC_COMBO_USER_LOGIN, OnSelendokComboUserLogin)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgDeleteLogin message handlers
void CDlgDeleteLogin::OnSelendokComboUserLogin()
{
// TODO: Add your control notification handler code here
// Declaration
ENUM_USER_LEVEL nUserLevel ;
int iCurSel = -1 ;
// Program starts here
// C EST ICI QUE CELA BUG
iCurSel = m_cUserLogin.GetCurSel();
nUserLevel = (ENUM_USER_LEVEL)m_cUserLogin.GetItemData(iCurSel) ;
switch(nUserLevel)
{
case USER_LEVEL_ADMINISTRATOR:
m_szUserLevel = "Administrateur" ;
break;
case USER_LEVEL_CHIEF:
m_szUserLevel = "Chef d'équipe" ;
break;
case USER_LEVEL_OPERATOR:
m_szUserLevel = "Opérateur" ;
break;
/* case USER_LEVEL_GUEST:
// This level must not appear
*/
default:
break;
}
}
//==========================================================================
// OnInitDialog
// -----------------
// Initialisation des levels disponibles
// Initialisation de la liste des utilisateurs avec la liste en cours
//==========================================================================
BOOL CDlgDeleteLogin::OnInitDialog()
{
ENUM_USER_LEVEL nUserLevel = USER_LEVEL_ADMINISTRATOR ;
int i, iMax, idx ;
CString szStr ;
CUserProfile UserProfile ;
CDialog::OnInitDialog() ;
// Initialize available Logins
m_cUserLogin.ResetContent() ;
iMax = m_UserArray.GetSize();
for (i=0 ; i<iMax ; i++)
{
UserProfile = m_UserArray.GetAt(i);
// Do not list the temporary Logins
if (UserProfile.GetLevel() != USER_LEVEL_GUEST)
{
idx = m_cUserLogin.AddString(UserProfile.GetLogin());
// Comme la liste dans la combobox est triée il est préférable d'associer à l'item
// l'indice du profils ds la liste d'utilisateurs pour récupérer le profil sans avoir
// faire de recherche dans la liste
m_cUserLogin.SetItemData(idx, UserProfile.GetLevel()) ;
}
}
return TRUE ;
}
...
} |
Dans le document j'ai le code suivant :
Code:
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
|
void CIHMMicroVuDoc::DeleteUser()
{
// Declaration
CDlgDeleteLogin DlgDeleteLogin ;
CString szStr ;
CDlgConfirm DlgConfirm ;
BOOL bRet ;
// User login and password
DlgDeleteLogin.SetUserList(GetUserList()) ;
DlgDeleteLogin.SetCurrentUser(GetCurrentUser() ) ;
if (DlgDeleteLogin.DoModal() != IDOK)
{
return ;
}
// Ask For Confirmation.
szStr.Format( "Etes vous sur de vouloir supprimer le compte MicroVu : %s ?", DlgDeleteLogin.m_DeletedUser.GetLogin() ) ;
DlgConfirm.SetText ( szStr ) ;
DlgConfirm.SetTextFont( m_TextLogFont ) ;
if(DlgConfirm.DoModal() == IDOK)
{
RemoveUser(DlgDeleteLogin.m_DeletedUser.GetLogin()) ;
bRet = RegRemoveProfile( DlgDeleteLogin.m_DeletedUser.GetLogin() ) ;
ASSERT( bRet == TRUE ) ;
}
} |