Проблема управления виртуальным списком - PullRequest
0 голосов
/ 22 июля 2010

Я использую виртуальный светящийся элемент управления и получаю данные с карты.Моя проблема в том, что когда я запускаю код, он отображает список нормально, но когда курсор мыши перемещается к элементу управления списком или когда я пытаюсь прокрутить вниз, он выдает ошибку отладочного утверждения, говорящую, что итератор map / set не разыменовывается.Мой метод GetDispInfo () выглядит следующим образом:

void CListCtrlTestDlg::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
   LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
   LV_ITEM* pItem = &(pDispInfo)->item;

   map<int, Error_Struct>::iterator it  = Error_Map.find((pItem->iItem) + 1);
   int iErrCode = (*it).second.i_ErrorCode;
   CString cError = (*it).second.c_Error;


    switch(pItem->iSubItem)
    {
    case 0:
        sprintf_s(pItem->pszText, 10, "[ %d ]", iErrCode);
        break;
    case 1:
        sprintf_s(pItem->pszText, 100, "%s", cError);
        break;
    }


*pResult = 0;

}

Также, если, когда указатель мыши находится над элементом управления списком, программа снова вылетает, сообщая о нарушении доступа из показанной строкиниже в файле output.c:

#else  /* _UNICODE */
   if (_putc_nolock(ch, f) == EOF)

Кто-нибудь получил такой же опыт?Что я здесь не так делаю и как я могу решить эту проблему?

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Для начала, как вы узнаете, что ваши магические константы 10 и 100, которые вы передаете sprintf_s, на самом деле являются правильным количеством пространства в pItem-> pszText?Вы должны использовать pItem-> cchText.

Во-вторых, вам, вероятно, следует проверить, что итератор, возвращенный из std :: map :: find, действителен.

0 голосов
/ 23 июля 2010

Реальная проблема заключалась в том, что я пытался скопировать данные в небуферный элемент структуры LV_ITEM.Я пытался скопировать данные в простой указатель, это была проблема.Что я должен был сделать, так это присвоить значение этому указателю без копирования данных.

p = o_RBTree.FindByPosition((pItem->iItem) + 1);

char zKey[10];
zKey[0] = '\0';
sprintf_s(zKey, 10, "%d", p.first);

char zVal[100];
zVal[0] = '\0';
sprintf_s(zVal, 100, "%d", p.second);

if (pItem->mask && LVIF_TEXT) 
{
    switch(pItem->iSubItem)
    {
    case 0:
        pItem->pszText = zKey;
        break;
    case 1:
        pItem->pszText = zVal;
        break;
    }
}

Это прекрасно работает!Спасибо за помощь.

...