Kontrol Cedit – kesalahan pelanggaran akses

pemrograman


Halo! Butuh bantuan – Saya punya proyek MS VC++ 6; jadi saya hanya mencoba menambahkan kontrol EDIT ke salah satu jendela modal saya (IDC_EDIT1), variabel m_Edit1 (CEdit) dan bahkan setelah itu tidak mungkin untuk membuka jendela tersebut. Aplikasi mogok dengan kesalahan “Pelanggaran akses” – NTDLL.DLL (0xC0000005). Jika saya menghapus variabel ini melalui Class Wizard – semuanya baik-baik saja lagi. Dan saya menemukan masalah ini di setiap jendela – bahkan di formulir utama. Apa artinya? Terima kasih atas dukungannya.

Apa yang saya coba:

berkas tajuk:

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

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

Solusi 1

Anda perlu menelepon m_Edit.create( style, rect, parent, ID) sebelum Anda dapat menggunakan objek CEdit.

Solusi 2

Ada tiga langkah untuk membuat kontrol dalam dialog berfungsi dengan program MFC. Anda melakukan dua di antaranya dan menghilangkan yang ketiga akan menghasilkan perilaku yang Anda amati. Langkah ketiga adalah menambahkan kontrol edit ke IDD_NOTEBOOKS_DIALOG dengan pengenalnya IDC_EDIT1 dalam file sumber daya. Hal ini biasanya dilakukan dengan editor sumber daya tetapi dapat dilakukan secara manual jika Anda mau.

FWIW, saya sudah lama bekerja dengan MFC dan akhirnya saya terbiasa tidak pernah meletakkan deklarasi kelas dialog di file header karena itu tidak diperlukan. Dengan antarmuka yang tepat, tidak ada hal lain yang perlu mengetahui detail implementasi dialog kecuali dialog itu sendiri. Kuncinya adalah antarmuka. Antarmuka tipikal yang akan saya tulis akan seperti ini:

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

Implementasi fungsi tersebut akan dilakukan dengan kode dialog dan akan menginisialisasi kontrol dengan data dan kemudian, jika OK diklik, ia mengekstrak data dari dialog dan mengembalikan nilai true. Biasanya saya akan memiliki Edit metode di NotebookData kelas dan implementasinya akan memanggil fungsi yang ditampilkan. Saya telah menemukan ini sebagai praktik yang sangat bersih dan mudah digunakan. Satu-satunya peringatan adalah kode dialog harus mengetahui data yang ditampilkannya, tetapi saya menganggap itu sebagai trade-off yang adil dan pantas.

コメント

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