본문 바로가기

이전글

dialog 에서 데이터 접근을 할때 발생하는 에러

Q : 다이얼로그에서의 ListBox의 내용을 View에 출력하는데 잘 안되네용 도와주세용  

void CMy1110View::OnDraw(CDC* pDC)
{
    CMy1110Doc* pDoc = GetDocument();
    CString tmpStr;
    int s_len;
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here

    if(excute==true)
    {

     pDC->TextOut(10,30,dlg.m_name01);
     pDC->TextOut(10,70,dlg.m_age01);
     pDC->TextOut(10,90,dlg.m_name02);
     pDC->TextOut(10,100,dlg.m_age02);
    }
    if(excute2==true)
    {

                      if(dlg2.m_ctrlright.GetCount()>=1)
      {
        for(int i=0;i<dlg2.m_ctrlright.GetCount();i++)
        {
            s_len=dlg2.m_ctrlright.GetTextLen(i);
            dlg2.m_ctrlright.GetText(i,tmpStr.GetBuffer(s_len));
            pDC->TextOut(200,200+i*10,tmpStr);
        } 
      }
       
    }
}
그쪽 소스 구여
View의 OnDraw()부분입니당
근데 문제는 dlg2의 m_ctrlright(CLISTBOX)인데 이부분에 접근할때
Debug Assertion이 일어나는군여 머가 잘ㄷ못된건지
참고로 dlg2는 Modal입니다.^^


A : m_ctrlright 의 접근이 잘못되었습니다.

if(dlg2.m_ctrlright.GetCount()>=1)
      {
        for(int i=0;i<dlg2.m_ctrlright.GetCount();i++)
        {
            s_len=dlg2.m_ctrlright.GetTextLen(i);
            dlg2.m_ctrlright.GetText(i,tmpStr.GetBuffer(s_len));
            pDC->TextOut(200,200+i*10,tmpStr);
        } 
      }

위의 부분이 잘못되었습니다.

m_ctrlright 는 사용할 수 없습니다. 이것은 control 인데..

control 이라는 것은 일종의 window 입니다. ( CWnd 에서 상속된것을 생각하면 쉽게 이해가실 겁니다. )

이러한 Window 는 HWND 라는 handle 이 제대로 주어져 있지 않다면 사용할 수 없답니다.

따라서, 위의 코드는 dlg2 라는 Dialog 내에 m_ctrlright 가 갖는 값들을 저장할 수 있는 변수를 잡아주시고,

그 안에 값들을 가지고 있게 변경해준뒤, 그 변수를 통해 접근해야 합니다

이와 관련된 Assertion 에러가 발생해서 찾아본 결과 combobox와 같은 control 은 변수가 아니라는 뜻이다. 결국 핸들이 사라지기때문에 Assertion 이 발생 된다. 한마디로 다이얼로그에 생성된 control 을 부모가 접근할 수 없기 때문에 임지 저장해 그 값을 가지고 써야 한다는 것이다.