2016-05-20 2 views
1

Прежде всего позвольте мне сказать, что я искал решение в течение пары дней теперь ...MFC C++ CListBox выбран пункт

Я пытаюсь получить выбранный элемент для ListBox. Это мой код:

CListBox * pList1 = (CListBox *)GetDlgItem(IDC_LIST1); 
CString ItemSelected; 
// Get the name of the item selected in the Sample Tables list box 
// and store it in the CString variable declared above 
pList1->GetText(pList1->GetCurSel(), ItemSelected); 
MessageBox(ItemSelected, "TEST", MB_OK); 

Теперь, когда я пытаюсь это я получаю сообщение об ошибке, говорящее «Параметр является incorect»

+0

'pList1-> GetCurSel()' не гарантируется успех (список не может иметь никакого выбора вообще). В этом случае он возвращает 'LB_ERR'. Это недействительный индекс для перехода в 'CListBox :: GetText'. – IInspectable

+1

но есть выбор ... есть ли другой способ сделать это? –

+0

Сначала попробуйте выполнить полную компиляцию. Затем попробуйте отладить его. Кроме того, для тестирования присвойте значение «GetCurSel» переменной, чтобы вы могли подтвердить это. Наконец, по какой-либо причине, почему вы не напрямую сопоставляете «CListBox» с переменной «CString» и просто вызываете «UpdateData (TRUE)» и используете значение переменной? –

ответ

3

Ваш код выглядит нормально, за исключением обработки ошибок. Также параметры MessageBox выглядят некорректно. Первый параметр должен иметь тип HWND. Я считаю, что это основная причина ваших проблем. Использование MFC стандарт AfxMessageBox вместо:

CListBox * pList1 = (CListBox *)GetDlgItem(IDC_LIST1); 

int nSel = pList1->GetCurSel(); 
if (nSel != LB_ERR) 
{ 
    CString ItemSelected; 
    pList1->GetText(nSel, ItemSelected); 
    AfxMessageBox(ItemSelected); 
} 
+0

Ах да, 'MessageBox' нуждается в параметре HWND. Тем не менее, отладка кода должна изолировать его проблему и в какой строке запускается ошибка. –

3

Если CListBox находится в режиме выбора единственного CListBox :: GetCurSel возвращает выбранный индекс.

Если CListBox находится в режиме множественного выбора, вы должны использовать CListBox :: GetSelItems, который вернет список индексов.

Вы не можете смешивать функции с функциями.

И всегда проверяйте коды возврата (как уже писали другие).

0

Если Вы уже имеете член данных MyList (из classCListBox):

int nSel = MyList.GetCurSel(); 
    CString ItemSelected; 
    if (nSel != LB_ERR) 
    { 
     MyList.GetText(nSel, ItemSelected); 
    } 
0

CWnd class has a MessageBox функцию, которая не нуждается параметр HWND. Но да, AfxMessageBox несколько проще в использовании и может быть назван в любом месте кода MFC без объекта CWnd. И примечание: если вызов Функция WinAPI внутри Код MFC (не обязательно здесь, но возможно в других случаях) полезно добавить его с оператором разрешения области видимости во избежание путаницы, ошибки и/или конфликта имен (например, :: MessageBox ...).

Одна из возможных причин ошибки «недопустимого параметра» в OP-коде заключается в том, что он использует строковый литерал ANSI («TEST») в конфигурации сборки UNICODE. Этот случай должен использовать строковый литерал UNICODE (L "TEST") или немного лучше, используйте макрос _T (_T («TEST»)), который позволяет строить как конфигурации ANSI, так и UNICODE.