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 : 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
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 :
Dans le document j'ai le code suivant :
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
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 ; } ... }
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
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 ) ; } }
Partager