Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么会导致TreeView_插入项失败?_C++_Windows_Treeview_Wxwidgets - Fatal编程技术网

C++ 什么会导致TreeView_插入项失败?

C++ 什么会导致TreeView_插入项失败?,c++,windows,treeview,wxwidgets,C++,Windows,Treeview,Wxwidgets,在一些计算机上(意味着大多数计算机都可以),当向树控件添加项时,出于某种原因TreeView\u InsertItem返回NULL()。 不幸的是,MSDN站点没有指定设置了错误代码(事实上,调用只会告诉我:0=操作已成功完成)。 它也没有具体说明什么可能导致失败或如何处理失败 所以我想知道是否有人以前遇到过这种情况,或者对如何调试这个问题有什么建议 这些机器都运行Windows 7 免责声明:我实际上正在浏览wxWidgets,但我们已经深入研究了代码,问题似乎在于windowsapi级别,而

在一些计算机上(意味着大多数计算机都可以),当向树控件添加项时,出于某种原因
TreeView\u InsertItem
返回
NULL
()。 不幸的是,MSDN站点没有指定设置了错误代码(事实上,调用只会告诉我:
0=操作已成功完成
)。 它也没有具体说明什么可能导致失败或如何处理失败

所以我想知道是否有人以前遇到过这种情况,或者对如何调试这个问题有什么建议

这些机器都运行Windows 7

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

更新: 基本上,这个想法是,您从这个类继承,然后实现populate,它只调用
AddItem()
。还有一个版本的
AddItem()
用于指定根项,但是由于我第一次调用
Append()
失败,它的存在没有帮助。 树是在
wxFormBuilder
中创建的,带有以下标志:
wxTR\u默认\u样式,wxTR\u有\u按钮,wxTR\u隐藏\u根,wxTR\u根上的行,wxTR\u单

这在我自己的电脑上也能很好地工作

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 ) );
}

我看不出你的代码中有什么真正的错误,但这很奇怪。首先,为什么你调用弃用的
MakeModal()
,而不是将你的类设为
wxDialog
,并使用它的
ShowModal()
?其次,为什么要等到
wxEVT\u SHOW
来填充控件,而不是立即执行


我建议您按照指示简化代码,我认为问题会消失。如果您感到好奇,您可以将您的更改一分为二,以找到真正的原因。

问题似乎是由于我在
wxEVT\u SHOW
事件中调用了
Populate()


我发现这一定是一个已知的问题,因为
wxDialog
有一个
[wxEVT\u INIT\u DIALOG][1]
事件,正是出于这个目的

TreeView\u InsertItem所做的就是向控件发送消息(实际上是通过)这可能会导致很多问题,主要是基于表示控件的窗口句柄的状态;Code=doeswoods.Show please是一个纯虚拟函数,因此无法从构造函数调用。我认为wxEVT_-SHOW可能是解决该问题的最简单的解决方案。感谢MakeModel()上的信息,我将确保修复该问题。感谢VZ,看起来wxEVT_-SHOW毕竟是个问题