Что может вызвать сбой TreeView_InsertItem?

На некоторых компьютерах (то есть большинство в порядке) при добавлении элемента в древовидную структуру по какой-то причине TreeView_InsertItem возвращается NULL (Что-то пошло не так).
К сожалению, сайт MSDN не указывает, что установлен код ошибки (и, действительно, GetLastError просто говорит мне: 0 = The operation completed successfully,
Также не указывается, что может вызвать сбой или как с ним справиться.

Поэтому мне интересно, сталкивался ли кто-нибудь с этим раньше или есть какие-либо предложения по устранению проблемы.

Все машины работают под управлением Windows 7.

Отказ от ответственности: я на самом деле переживаю wxWidgets, но мы копались в коде, и проблема, кажется, лежит в окнах api уровень, а не с wx сам.

Обновить:
По сути, идея в том, что вы наследуете от этого класса, а затем реализуете заполнение, которое просто вызывает 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

Решение

Я не вижу ничего плохого в вашем коде, но это довольно странно. Прежде всего, почему вы называете устаревшим MakeModal() вместо того, чтобы сделать свой класс wxDialog и используя его ShowModal()? Во-вторых, зачем ждать, пока wxEVT_SHOW с заполнением элемента управления вместо того, чтобы делать это немедленно?

Я бы посоветовал упростить ваш код, как указано, и я думаю, что проблема исчезнет. Если вам любопытно, вы можете разделить свои изменения пополам, чтобы найти тот, который действительно за это отвечает.

0

Другие решения

Похоже, проблема была в том, что я звонил Populate() из wxEVT_SHOW событие.

Я обнаружил, что это должно быть известной проблемой, потому что wxDialog имеет [wxEVT_INIT_DIALOG][1] событие, именно для этого

0

По вопросам рекламы [email protected]