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 :
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 ;
}
...
}
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
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 ) ; 
	}
}