【问题标题】:How can I iterate through the pages of a wxNotebook?如何遍历 wxNotebook 的页面?
【发布时间】:2013-10-03 05:20:19
【问题描述】:
void Mainframe::OnClearNotebook( wxCommandEvent& e )
{
    int end = m_notebook->GetPageCount();
    for ( int i = 0; i < end; i++ )
    {
        if ( m_notebook->GetPageText( i ) != "Server Log" )
        {
            m_notebook->DeletePage(i);
        }
    }
}

此代码在此表单中崩溃,并显示消息“m_notebook->GetPageText() index out of range”;

如何正确遍历所有页面?

编辑,解决办法:

void Mainframe::OnClearNotebook( wxCommandEvent& e )
{   
    while ( m_notebook->GetPageCount() > 1 )
    {
        int end = m_notebook->GetPageCount() - 1;
        if ( m_notebook->GetPageText( end ) != "Server Log" )
        {
            m_notebook->DeletePage(end);
        }
        else
        {
            break;
        }
    }
}

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    GetPageCount() 将在您实际删除时更改,因此 end 将保留早期版本的值

    例如。

    你有 100 在 m_notebook->GetPageCount()

    所以结束 = 100

    在迭代 10 个项目后,您将删除 5 个项目,因此现在列表将有 95 个项目,但您正在迭代多达 100 个 - 这可能是个问题

    【讨论】:

    • 这是有道理的,是的,它解决了问题。谢谢你。基本上我把它改成了一个循环,我现在向后删除,检索每个循环的新计数。奇怪的是,当页面被删除时页面 id 会发生变化。应该有更多的一致性来识别标签。
    【解决方案2】:

    如果您想从非链表中删除项目,您将需要迭代列表,并在另一个新列表中收集您要删除的所有列表项的索引。完成迭代和收集索引后,使用您收集的每个索引在原始列表上调用 delete。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多