Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить индекс строки, выбранной в Combobox 
:(
    Опции темы
Alexander777
Дата 7.2.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 31.12.2006

Репутация: нет
Всего: нет



Я вывожу диалоговое окно с 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();
    }
//....................

}

PM MAIL   Вверх
Anikmar
Дата 7.2.2007, 21:54 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Предположение:

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


PM MAIL ICQ   Вверх
Nuzur
Дата 8.2.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



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


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

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


--------------------
Never again...
PM MAIL   Вверх
zkv
Дата 8.2.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(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

а по существу вопроса - надо запоминать выделенную строку в классе диалога, например в в какой нить мембер перед завершением диалога, а потом оттуда извлекать после завершения. 
PM MAIL   Вверх
Earnest
Дата 8.2.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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

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


--------------------
...
PM   Вверх
Anikmar
Дата 8.2.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(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 - появился дубликат
}

Но это было чисто предположение - уже вижу, что не то. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.