Contrôle des crédits – erreur de violation d’accès

la programmation


Bonjour! Besoin d’aide – j’ai un projet MS VC++ 6 ; donc j’essaie juste d’ajouter le contrôle EDIT à celui de ma fenêtre modale (IDC_EDIT1), variable m_Edit1 (CEdit) et même après cela, il est impossible d’ouvrir une telle fenêtre. L’application est tombée en panne avec l’erreur “Violation d’accès” – NTDLL.DLL (0xC0000005). Si je supprime cette variable via Class Wizard, tout va à nouveau bien. Et j’ai trouvé ce problème dans chaque fenêtre, même dans le formulaire principal. Qu’est-ce que ça veut dire? Merci pour le soutien.

Ce que j’ai essayé :

En tête de fichier:

// Dialog Data
	//{{AFX_DATA(CNotebooksDlg)
	enum { IDD = IDD_NOTEBOOKS_DIALOG };
	CEdit	m_Edit1;
	CComboBox	m_ComboSerial;
	CComboBox	m_ComboDeviceType;
	CSortListCtrl	m_ctrlListHistory;

fichier cpp :

//{{AFX_DATA_MAP(CNotebooksDlg)
DDX_Control(pDX, IDC_EDIT1, m_Edit1);
DDX_Control(pDX, IDC_COMBO_SERIAL_NUMBER, m_ComboSerial);
DDX_Control(pDX, IDC_COMBO_DEVICE_TYPE, m_ComboDeviceType);
DDX_Control(pDX, IDC_LIST_HISTORY, m_ctrlListHistory);

Solution 1

Tu dois appeler m_Edit.create( style, rect, parent, ID) avant de pouvoir utiliser l’objet CEdit.

Solution 2

Il existe trois étapes pour faire fonctionner un contrôle dans une boîte de dialogue avec un programme MFC. Vous en avez fait deux et omettre la troisième entraînera le comportement que vous avez observé. La troisième étape consiste à ajouter un contrôle d’édition à votre IDD_NOTEBOOKS_DIALOG avec l’identifiant IDC_EDIT1 dans le fichier de ressources. Cela se fait généralement avec l’éditeur de ressources, mais cela peut être fait manuellement si vous préférez.

FWIW, je travaille avec MFC depuis très, très longtemps et j’ai finalement pris l’habitude de ne jamais mettre de déclarations de classe de dialogue dans les fichiers d’en-tête parce que c’est tout simplement inutile. Avec l’interface appropriée, rien d’autre n’a besoin de connaître les détails de l’implémentation d’un dialogue, à l’exception du dialogue lui-même. La clé est l’interface. Une interface typique que j’écrirais voudrait quelque chose comme ceci :

C++
bool OpenNotebookDlg( CWnd * pparent, NotebookData & data );

L’implémentation de cette fonction se ferait avec le code de la boîte de dialogue et initialiserait les contrôles avec les données puis, si OK est cliqué, il extrait les données de la boîte de dialogue et renvoie vrai. Habituellement, j’aurais un Edit méthode dans le NotebookData la classe et son implémentation appelleraient la fonction affichée. J’ai trouvé que c’était une pratique très propre et facile à utiliser. Le seul inconvénient est que le code de dialogue doit connaître les données qu’il affiche, mais je considère que c’est un compromis juste et approprié.

コメント

タイトルとURLをコピーしました