2012-09-19 2 views
0

몇 대의 컴퓨터 컴퓨터에서 (대부분의 경우 괜찮음) 트리 컨트롤에 항목을 추가 할 때 어떤 이유로 TreeView_InsertItemNULL (Indicating something went wrong)을 반환합니다. . 불행하게도 MSDN 사이트 GetLastError를 호출 단순히 나를 알 수없는 오류 코드가 참으로 설정 (그리고되도록 지정하지 않습니다. 0 = The operation completed successfully 나도이 일을 처리 할 수있는 고장이나 방법을 일으킬 수 지정할 않습니다 그래서TreeView_InsertItem이 실패하게되는 원인은 무엇입니까?

. '사람이 전에이 발생하거나 문제를 디버깅하는 방법에 관한 어떤 제안을 가지고있는 경우 기계가 모두 면책 조항 윈도우 7

을 실행하는 궁금

을 M : 실제로 wxWidgets을 통해 갈거야,하지만 우리는 코드를 파헤 치고 창문에 문제가있는 것 같습니다. api 수준이 아니며 wx 그 자체가 아닙니다.

업데이트 : 기본적 아이디어는, 당신은이 클래스에서 상속 한 다음 단순히 AddItem()를 호출 채우기를 구현합니다. 또한 루트 항목을 지정하기위한 AddItem()의 버전이 있지만 처음 전화가 Append()에 연결되지 않아 그 존재가 도움이되지 않습니다. 나무는 다음과 같은 플래그와 wxFormBuilder에서 생성됩니다 wxTR_DEFAULT_STYLE, wxTR_HAS_BUTTONS, wxTR_HIDE_ROOT, wxTR_LINES_AT_ROOT, wxTR_SINGLE

이것은 또한 내 자신의 PC

ItemSelector::ItemSelector(wxWindow* parent) 
: m_tree(NULL), 
    m_initialised(false) 
{ 
    wxXmlResource::Get()->LoadFrame(this, parent, wxT("ItemSelector")); 

    m_tree = XRCCTRL(*this, "itemTree", wxTreeCtrl); 

    m_rootItem = m_tree->AddRoot(wxT("ROOT")); 

    Bind(wxEVT_SHOW, &ItemSelector::OnShow, this); 

    MakeModal(true); 
} 

void ItemSelector::OnShow(wxShowEvent& event) 
{ 
    if(event.IsShown()) 
    { 
     if(!m_initialised) 
     { 
      Populate(); 
      m_initialised = true; 
     } 

     m_tree->SetFocus(); 
     Layout(); 
    } 
} 

void ItemSelector::AddItem(const wxString& name, void* someData) 
{ 
    //Also tried m_tree->AppendItem(m_rootItem, wxT("Test")) - same problem 
    wxTreeItemId newItem = m_tree->AppendItem(m_rootItem, name, -1, -1, new TreeDataClass(someData)); 
} 
+2

에 대해 정확하게하는 [wxEVT_INIT_DIALOG][1] 이벤트를 가지고 있기 때문에

난 당신이 코드를 표시 할 수 있습니다,이 알려진 문제가 될 수 있어야한다는 것을 발견했다? –

+0

모든 TreeView_InsertItem은 (실제로, 통해) 컨트롤에 메시지를 보냅니다. 컨트롤을 나타내는 창 핸들을 중심으로 대부분 상태가 잘못 될 수있는 많은 것들이 있습니다. 코드 = 불가사의. 보여주십시오. – WhozCraig

+0

코드 –

답변

0

Populate()wxEVT_SHOW 이벤트에서 호출했기 때문에 문제가 발생한 것 같습니다. wxDialog이 목적

0

난 당신의 코드에서 정말 아무 잘못 표시되지 않습니다하지만 그것은 아주 이상한에서 완벽하게 작동합니다. 무엇보다 먼저 클래스를 wxDialog으로 만들고 대신 ShowModal()을 사용하는 대신 사용 중지 된 MakeModal()을 사용 하시겠습니까? 둘째, 즉시 수행하는 대신 컨트롤을 채우면서 wxEVT_SHOW까지 기다리는 이유는 무엇입니까?

표시된대로 코드를 단순화하고 문제가 사라질 것이라고 생각합니다. 궁금한 점이 있다면 변경 사항을 양분하여 실제로 책임이있는 것을 찾아 낼 수 있습니다.

+0

으로 원래 게시물을 편집했습니다. Populate()는 순수 가상 함수이므로 생성자에서 호출 할 수 없습니다. 나는 wxEVT_SHOW가 아마도 그 문제에 대한 가장 단순한 해결책이라고 생각했다. MakeModal()에 대한 정보를 주셔서 감사합니다. 나는 그 문제를 해결할 것입니다. –

+0

Thanks VZ, wxEVT_SHOW가 결국 문제였던 것 같습니다. –

관련 문제