在一些计算机上(意味着大多数都很好),在向树控件添加项时,由于某种原因,TreeView_InsertItem
会返回NULL
(Indicating 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 ) );
}
答案 0 :(得分:0)
我的代码中没有看到任何错误,但这很奇怪。首先,为什么要调用已弃用的MakeModal()
而不是让您的课程成为wxDialog
并使用其ShowModal()
?其次,为什么要等到wxEVT_SHOW
填充控件而不是立即执行它?
我建议按照指示简化您的代码,我认为问题会消失。如果您很好奇,那么您可以将您的更改分成两部分,找到真正对其负责的更改。
答案 1 :(得分:0)
问题似乎是由于我从Populate()
事件中调用wxEVT_SHOW
这一事实。
我发现这必须是一个已知问题,因为wxDialog
有一个[wxEVT_INIT_DIALOG][1]
事件,正是为此目的