【解決方法】Cedit コントロール – アクセス違反エラー

プログラミングQA


こんにちは! 助けが必要です – 私は MS VC++ 6 プロジェクトを持っています。 そのため、モーダルウィンドウ(IDC_EDIT1)の1つである変数m_Edit1(CEdit)にEDITコントロールを追加しようとしていますが、その後でもそのようなウィンドウを開くことは不可能です。 アプリケーションが「アクセス違反」エラーでクラッシュしました – NTDLL.DLL (0xC0000005)。 クラスウィザードを介してこの変数を削除すると、すべてが再びOKになります。 そして、メインフォームであっても、すべてのウィンドウでこの問題が見つかりました。 それはどういう意味ですか? サポートありがとうございます。

私が試したこと:

ヘッダーファイル:

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

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

解決策 1

電話する必要があります m_Edit.create( style, rect, parent, ID) CEdit オブジェクトを使用する前に。

解決策 2

ダイアログ内のコントロールを MFC プログラムで動作させるには、3 つの手順があります。 そのうち 2 つを実行し、3 つ目を省略すると、観察された動作が発生します。 3 番目のステップは、編集コントロールを IDD_NOTEBOOKS_DIALOG 識別子付き IDC_EDIT1 リソースファイル内。 これは通常、リソース エディターを使用して行われますが、必要に応じて手動で行うこともできます。

FWIW、私は長い間 MFC を使ってきましたが、最終的にはダイアログ クラス宣言をヘッダー ファイルに決して置かない習慣がつきました。それは単に不必要だからです。 適切なインターフェイスを使用すると、ダイアログ自体以外、ダイアログの実装の詳細を知る必要はありません。 その鍵となるのがインターフェースです。 私が書く典型的なインターフェースは次のようなものになります。

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

その関数の実装はダイアログのコードを使用して行われ、データを使用してコントロールを初期化します。 OK クリックすると、ダイアログからデータが抽出され、true が返されます。 通常、私は Edit のメソッド NotebookData クラスとその実装は、示されている関数を呼び出します。 これは非常にクリーンで使いやすい方法だと思います。 1 つの注意点は、ダイアログ コードが表示しているデータについて認識している必要があるということですが、それは公平かつ適切なトレードオフであると考えています。

コメント

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