На некоторых компьютерах (то есть большинство в порядке) при добавлении элемента в древовидную структуру по какой-то причине 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 ) );
}
Я не вижу ничего плохого в вашем коде, но это довольно странно. Прежде всего, почему вы называете устаревшим MakeModal()
вместо того, чтобы сделать свой класс wxDialog
и используя его ShowModal()
? Во-вторых, зачем ждать, пока wxEVT_SHOW
с заполнением элемента управления вместо того, чтобы делать это немедленно?
Я бы посоветовал упростить ваш код, как указано, и я думаю, что проблема исчезнет. Если вам любопытно, вы можете разделить свои изменения пополам, чтобы найти тот, который действительно за это отвечает.
Похоже, проблема была в том, что я звонил Populate()
из wxEVT_SHOW
событие.
Я обнаружил, что это должно быть известной проблемой, потому что wxDialog
имеет [wxEVT_INIT_DIALOG][1]
событие, именно для этого