Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CComboBox теряет ItemData 
V
    Опции темы
17dufa
Дата 7.8.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



доброго времени суток.
есть комбобокс, который заполняется в цикле:
Код

void f(CComboBox& list)
...
int i = 0;
for( Pos = map.GetStartPosition(); Pos != NULL; )
{
    map.GetNextAssoc( Pos, Key, data );      
    list.AddString(data.NAME);    
    int y = list.SetItemData(i,data.ID);
    if (y == CB_ERR)
   {
       int j = 0;
   }
   y = list.GetItemData(i);
   i++;
}

int yyyy = list.GetItemData(0);


в мапе есть элементы. внутри цикла все нормально. y != CB_ERR, при чтении y = list.GetItemData(i); возвращает то что надо. а вот yyyy уже равен 0.
У меня уже моск взрывается, готов поверить в чудо. где и как CComboBox может прохерить записанные данные? как вдарить ему посильнее, чтоб он этого не делал?

Это сообщение отредактировал(а) 17dufa - 7.8.2009, 17:59
PM MAIL   Вверх
Earnest
Дата 10.8.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, во первых ты делаешь не совсем корректно.
Совсем не факт, что AddString вставляет именно i-ю строку (например, если комбобокс сортированный).
Т.е. нужно делать так: iPos = list.AddString(), а потом этот iPos использовать в SetItemData.
Но проблема у тебя, похоже, не в этом. Ты весь код функции привел, буз купюр? Явно какая-то глупая ошибка, причем не здесь (здесь вроде все нормально, кроме вышеупомянутого момента). Не похоже, что комбобокс теряет даннные (с чего бы это). Больше похоже, что ты таки пишешь 0 в нулевой элемент в какой-то момент...


--------------------
...
PM   Вверх
17dufa
Дата 10.8.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest, благодарю. заменил 
Код

list.AddString(data.NAME);

на
Код

list.InsertString(i, data.NAME);

и все починилось. Похоже он и правда отсортированный и каким-то элементам SetData выполнялся несколько раз, а каким-то соответственно ни разу. Повезло, что нулевой попал в эти ни разу, а то я бы эту ошибку никогда не заметил.

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


Эксперт
****


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

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



Если тебе сортировака не нужна, ее можно отключить (в свойствах в редакторе ресурсов или просто стиль отшибить). В любом случае лучше пользоваться не InsertString, а AddString, но получать номер вставленной строки.
Код

for (Pos = map.GetStartPosition(); Pos != NULL; )
{
    map.GetNextAssoc( Pos, Key, data );      
    int pos = list.AddString(data.NAME);    
    list.SetItemData (pos, data.ID);
}

Этот код работает всегда, независимо от сортировки, а InsertString может испортить тебе сортировку в списке.


--------------------
...
PM   Вверх
17dufa
Дата 10.8.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


 




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


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

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