Control de crédito: error de infracción de acceso

programación


¡Hola! Necesito ayuda. Tengo un proyecto MS VC++ 6; así que solo estoy tratando de agregar el control EDITAR al de mi ventana modal (IDC_EDIT1), variable m_Edit1 (CEdit) e incluso después de eso es imposible abrir dicha ventana. La aplicación falló con el error “Infracción de acceso”: NTDLL.DLL (0xC0000005). Si elimino esta variable a través del Asistente de clases, todo vuelve a estar bien. Y encontré este problema en todas las ventanas, incluso en el formulario principal. ¿Qué significa? Gracias por su apoyo.

Lo que he probado:

archivo de cabecera:

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

archivo 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);

Solución 1

necesitas llamar m_Edit.create( style, rect, parent, ID) antes de poder utilizar el objeto CEdit.

Solución 2

Hay tres pasos para hacer que un control en un diálogo funcione con un programa MFC. Hiciste dos de ellos y omitir el tercero dará como resultado el comportamiento que observaste. El tercer paso es agregar un control de edición a su IDD_NOTEBOOKS_DIALOG con el identificador IDC_EDIT1 en el archivo de recursos. Generalmente esto se hace con el editor de recursos, pero se puede hacer manualmente si lo prefiere.

FWIW, he trabajado con MFC durante mucho, mucho tiempo y eventualmente adquirí el hábito de nunca poner declaraciones de clases de diálogo en archivos de encabezado porque simplemente es innecesario. Con la interfaz adecuada, nada más necesita conocer los detalles de la implementación de un diálogo excepto el diálogo mismo. La clave para esto es la interfaz. Una interfaz típica que escribiría sería algo como esto:

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

La implementación de esa función sería con el código del diálogo e inicializaría los controles con los datos y luego, si OK Se hace clic en él, extrae los datos del cuadro de diálogo y devuelve verdadero. Normalmente tendría un Edit método en el NotebookData La clase y su implementación llamarían a la función que se muestra. He descubierto que esta es una práctica muy limpia y fácil de usar. La única advertencia es que el código de diálogo debe conocer los datos que muestra, pero considero que es una compensación justa y apropiada.

コメント

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