Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как получить индекс строки, выбранной в Combobox


Автор: Alexander777 7.2.2007, 21:36
Я вывожу диалоговое окно с Combobox, чтобы пользователь сделал выбор из списка. Как получить индекс выбранной строки? В приведённом мной коде отладчик выдаёт сообщение Debug Assertion Failed!


Код

BOOL CTestComboDlg::OnInitDialog()
{
//....................
    // TODO: Add extra initialization here
    char buf[1000];
    for(int i=0; i<5; i++)
    m_ComboBox.InsertString(i, itoa(i, buf, 10));

return TRUE;  // return TRUE  unless you set the focus to a control
}


BOOL CTestComboApp::InitInstance()
{
//....................

    CTestComboDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        int response=dlg.m_ComboBox.GetCurSel();
    }
//....................

}

Автор: Anikmar 7.2.2007, 21:54
Предположение:

В дальнейшем коде используется response - область видимости исчезла
Цитата(Alexander777 @  7.2.2007,  21:36 Найти цитируемый пост)
    if (nResponse == IDOK)
    {
        int response=dlg.m_ComboBox.GetCurSel();
    }


Автор: Nuzur 8.2.2007, 12:40
Alexander777, в каком месте именно Debug Assertion Failed!?
При создании диолога при попытке получить выбранную строку?


Anikmar, возможно и так если дилог был уничтожен, или уничтожен его ComboBox. Но тогда должно было появиться access violation скорее чем Debug Assertion Failed.

Скорее всего проблема в диалоге который вы вызываете.

Автор: zkv 8.2.2007, 13:47
Цитата(Nuzur @  8.2.2007,  12:40 Найти цитируемый пост)
Anikmar, возможно и так если дилог был уничтожен, или уничтожен его ComboBox. Но тогда должно было появиться access violation скорее чем Debug Assertion Failed.

я думаю речь шла о таком случае 
Код

if (nResponse == IDOK)
{
    int response=dlg.m_ComboBox.GetCurSel();
}
int b = response;//время жизни и область видимости response истекли

но это просто не откомпилится smile

а по существу вопроса - надо запоминать выделенную строку в классе диалога, например в в какой нить мембер перед завершением диалога, а потом оттуда извлекать после завершения. 

Автор: Earnest 8.2.2007, 19:53
Безусловно, дело в этом:
Цитата(zkv @  8.2.2007,  14:47 Найти цитируемый пост)
int response=dlg.m_ComboBox.GetCurSel();

Комбобокс уже приказал долго жить, вместе с окном диалога. ASSERT идет из MFC, которая проверяет, что окно существует. Никакого Violation не будет, т.к. SendMessage просто посылает на деревню дедушке, и к падению это не приводит.

Как сказал zkv, нужно запоминать выбор в простой (не оконной) переменной перед закрытием диалога. Например, вставить DDX_CBIndex в DoDataExchange. 

Автор: Anikmar 8.2.2007, 19:57
Цитата(zkv @  8.2.2007,  13:47 Найти цитируемый пост)
я думаю речь шла о таком случае 

if (nResponse == IDOK)
{
    int response=dlg.m_ComboBox.GetCurSel();
}
int b = response;//время жизни и область видимости response истекли


Нет, я думал о таком случае (он бы скомпилился)
Код

int response; // Подразумевается использовать эту переменную
if (nResponse == IDOK)
{
    int response=dlg.m_ComboBox.GetCurSel(); // По запаре поставили int - появился дубликат
}

Но это было чисто предположение - уже вижу, что не то. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)