2015-03-22 4 views
0

GetText возвращает пустую строку для списка в программе MFC:GetText возвращает пустую строку для списка в программе MFC

void CMainDlg::OnLbnSelchangeLiPt() 
{ 
    CListBox* lb; 
    int idx, cnt; 
    char* cstr; 
    lb = (CListBox*)GetDlgItem(IDC_LI_PT); 
    idx = lb->GetCurSel(); 
    cnt = lb->GetCount(); 
    if ((idx != LB_ERR) && (cnt > 0)) 
    { 
     cstr = NULL; 
     lb->GetText(idx, cstr); 
... 

список имеет один выбранный элемент. Что не так с этим?

ответ

1

Не использовать такие вещи, как char a[32];

Вы должны использовать:

CString sData; 
int nSel = m_NameListBox.GetCurSel(); 
if (nSel != LB_ERR) 
{ 
    m_NameListBox.GetText(nSel, sData); 
} 

вы также можете позвонить по телефону m_NameListBox.GetWindowText(sData);

Пожалуйста, также используйте механизм DataExchange MFC для сопоставления вашего контроля с переменной класса:

void CSettingsGeneralPage::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_NAME_LISTBOX, m_NameListBox); 
} 
0

я узнал, что мне нужно, чтобы объявить массив символов с достаточным пространством для хранения строки:

void CMainDlg::OnLbnSelchangeLiPt() 
{ 
    CListBox* lb; 
    int idx, cnt; 
    char cstr[32]; 
    lb = (CListBox*)GetDlgItem(IDC_LI_PT); 
    idx = lb->GetCurSel(); 
    cnt = lb->GetCount(); 
    if ((idx != LB_ERR) && (cnt > 0)) 
    { 
     lb->GetText(idx, cstr); 
... 
+4

Гораздо проще сделать 'CString szText; lb-> GetText (idx, szText); ' –

+1

BTW: вы можете упростить тест с' if ((idx! = LB_ERR) && (cnt> 0)) 'to' if ((idx! = LB_ERR)) '. Если 'GetCount' возвращает 0, то' GetCurSel' возвращает 'LB_ERR' в любом случае. –

Смежные вопросы