2012-01-17 3 views
4
내가의 CEdit에 대한 컨트롤의 변수를 생성

:C++/MFC 오류 접근 제어의 변수

class CGateDlg : public CDialog 
{ 
    ... 
    public: 
     // here is my control's variable 
     CEdit m_edit_a; 
     // here I map variable to control 
     virtual void DoDataExchange(CDataExchange* pDX); 
} 

을 그리고 이것은 내가 컨트롤에 내 변수를 매핑하는 방법입니다 :

void CGateDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_EDIT_A, m_edit_a); 
} 

이 작동하는 방법이다 : 사용자가 입력란에 텍스트를 입력합니다. 그런 다음 그는 "재설정"버튼을 눌러 편집 상자를 지 웁니다.

void CGateDlg::OnBnClickedReset() 
{ 
    // clear edit box 
    m_edit_a.SetWindowTextW(L""); 
} 

응용 프로그램이 오류없이 시작 :이 리셋 버튼을 클릭 한 후 편집의 선택을 취소 할 책임이 코드 조각입니다. EditBox에 텍스트를 입력하고 "Reset"버튼을 누릅니다. 그럼 난() (이 있는지 확인) 나 winocc.cpp에 이르게 오류, 라인 (245)을 얻을 :

void CWnd::SetWindowText(LPCTSTR lpszString) 
{ 
    ENSURE(this); 
    ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); 

    if (m_pCtrlSite == NULL) 
      ::SetWindowText(m_hWnd, lpszString); 
    else 
      m_pCtrlSite->SetWindowText(lpszString); 
} 

나는 문제가 HWND로 생각 :

this 0x0030fa54 {CEdit hWnd=0x00000000} CWnd * const 

하지만 그것을 해결하는 방법 ?

CEdit *m_edit_a; 
m_edit_a = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT_A)); 
m_edit_a->SetWindowTextW(L""); 

내가 잘못 뭐하는 거지 :이를 사용하여 내 컨트롤의 값을 액세스 할 때

모든 것이 잘 작동?

+0

전체 수업 코드를 게시 할 수 있습니까? –

+0

어떻게'CGateDlg'를 만드나요? 만약 당신이 리소스 ID에서 그것을 생성하지 않는다면'DDX_Control'은 당신을 위해 작동하지 않을 수도 있고'CEdit '을 사용하기 전에'CGateDlg'에 대한'OnCreate' 오버로드에서'm_edit_a.Create'를 명시 적으로 호출해야 할 수도 있습니다 ' – AJG85

+0

"자원 ID에서 생성"이란 정확히 무엇을 의미합니까? 어떻게 보일지 볼 수있는 링크 나 샘플을 게시 해주십시오. 나는 지금 일하고 있지만 집에 돌아와 필요할 때 전체 머리글과 수업을 붙여 넣으면 모든 아이디어를 시험해 볼 것입니다. –

답변

8

나는 두 가지 가능성을 볼 수

  1. 제어 때 대화 시작 존재하지 않습니다. CDialog :: OnInitDialog가 할 첫 번째 일은 DoDataExchange를 호출하는 것입니다. 따라서 나중에 초기화 프로세스에서 컨트롤을 만드는 경우 너무 늦습니다.

  2. 자신의 OnInitDialog가 CDialog :: OnInitDialog를 호출하지 않아 DoDataExchange가 호출되지 않습니다.

+0

솔루션이 예상했던 것보다 덜 복잡해 보입니다. 내 CGateDlg :: OnInitDialog CDialog :: OnInitDialog 호출하지 않았다. 하지만 나는 여전히 마법사에서 벗어나려고하므로 MFC를 올바르게 배울 수 있습니다. :) –

0

잘못된 것이 없습니다. VC6.0을 사용하여 새 프로젝트를 만들고 편집에 변수를 연결하면됩니다. exe는 정상적으로 작동합니다.

class CEditTestDlg : public CDialog 
{ 
// Construction 
public: 
CEditTestDlg(CWnd* pParent = NULL); // standard constructor 

// Dialog Data 
//{{AFX_DATA(CEditTestDlg) 
enum { IDD = IDD_EDITTEST_DIALOG }; 
CEdit m_Edit; 
//}}AFX_DATA 

// ClassWizard generated virtual function overrides 
//{{AFX_VIRTUAL(CEditTestDlg) 
protected: 
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 
//}}AFX_VIRTUAL 

......

통화 당

void CEditTestDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    //{{AFX_DATA_MAP(CEditTestDlg) 
    DDX_Control(pDX, IDC_EDIT1, m_Edit); 
    //}}AFX_DATA_MAP 
} 
void CEditTestDlg::OnBnClickedReset() 
{ 
    // TODO: Add your control notification handler code here 
    m_Edit.SetWindowText("tttt"); 
} 

그래서, 나는 그것이 problem.You 다시 시도 나은 가진 코드가 아닙니다 생각합니다.

1

내가 생각하는 당신이해야없이 직접 사용 (이 경우 m_edit_a에서) 컨트롤의 meber. 다음과 같은 코드를 사용한다 업데이트 할 컨트롤을

DDX_Text(pDX, IDC_EDIT_A, m_edit_data); // as you did it in DDC_Cotrol 

은 이제 변수를 directy 사용할 수 있지만, 순서 대신 당신은, 이제 CStrimg m_edit_data 말을하자 일원이 변수를 사용해야합니다 그리고 당신은 제어에 연결한다 사용하기 전에 :

UpdateData(true); // unlocks the control in a sense 
m_edit_data = "this is my test"; 
UpdateData(false); // locks the control again (in a sense) 

이 MFC : 정상적인 절차입니다, 내가 도움이 희망 ...

오 ... 당신은 또한 문자열 테이블에 컨트롤을 추가해야합니다 ... 당신의 대화가 오프가 CDialog ::의 OnInitDialog을 (호출 시작하면

0

을 (당신이 모르는 경우 알려 주시기))하고있는 DoDataExchange 시작 끄기 CDialog :: DoDataExchange하지만 여전히 null 포인터가 있고 CNotSupportedException, 리소스 (rc) 파일 대화 상자 서식 파일을 모든 컨트롤 (IDC_) 및 DoDataExchange있는 포함되어 있는지 확인하십시오.

리소스를 제공하는 DLL을 사용하는 경우 재정의 정의를 확인하십시오.