什么会导致TreeView_InsertItem失败?

时间:2012-09-19 14:12:56

标签: c++ windows treeview wxwidgets

在一些计算机上(意味着大多数都很好),在向树控件添加项时,由于某种原因,TreeView_InsertItem会返回NULLIndicating something went wrong)。 不幸的是,MSDN网站没有指定设置错误代码(实际上,调用GetLastError只是告诉我:0 = The operation completed successfully。 它也没有说明可能导致失败的原因或如何处理失败。

所以我想知道是否有人之前遇到过此问题,或者对如何调试问题有任何建议。

这些机器都运行Windows 7。

免责声明:我实际上正在浏览wxWidgets,但我们已经挖掘了代码,问题似乎在于api级别,而不是wx本身。

更新 基本上,这个想法是,你从这个类继承,然后实现populate,它只调用AddItem()。还有一个AddItem()版本用于指定根项目,但由于我在第一次调用Append()时失败,因此它的存在无效。 树在wxFormBuilder中创建,并带有以下标志:wxTR_DEFAULT_STYLE, wxTR_HAS_BUTTONS, wxTR_HIDE_ROOT, wxTR_LINES_AT_ROOT, wxTR_SINGLE

这也可以在我自己的电脑上完美运行

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 个答案:

答案 0 :(得分:0)

我的代码中没有看到任何错误,但这很奇怪。首先,为什么要调用已弃用的MakeModal()而不是让您的课程成为wxDialog并使用其ShowModal()?其次,为什么要等到wxEVT_SHOW填充控件而不是立即执行它?

我建议按照指示简化您的代码,我认为问题会消失。如果您很好奇,那么您可以将您的更改分成两部分,找到真正对其负责的更改。

答案 1 :(得分:0)

问题似乎是由于我从Populate()事件中调用wxEVT_SHOW这一事实。

我发现这必须是一个已知问题,因为wxDialog有一个[wxEVT_INIT_DIALOG][1]事件,正是为此目的