Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.147.56] |
|
Сообщ.
#1
,
|
|
|
Доброго всем.
Есть у меня ListControl я его при выборе объекта обновляю. В объекте находится еще несколько подобъектов которые могут отображаться, а могут и нет. Если в свойствах подобъекта стоит-отображайся то должна быть галка, если нет, галки быть не должно. Вот как я делаю: void MainDialog::UpdateNodesListControls(int selected) { if (selected < 0) { return; } SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0); Layer* layer = gSceneEditor->GetScene()->GetLayerHolder()->GetLayer(selected); if (layer) { int allLayerNodes = layer->GetSize(); for (int j = allLayerNodes - 1; j >= 0; --j) { math::Region* region = layer->GetRegion(j); if (region) { AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType()); if (region->IsShowEditorInfo()) { ListView_SetCheckState(hNodesList, j, true); //при дебаге все время попадаю сюда, а галок все равно нет... } else { ListView_SetCheckState(hNodesList, j, false); } } } } } Но почему-то галки ставятся строго через одну, почему так может быть? не подскажите? |
Сообщ.
#2
,
|
|
|
Какой-то странный цикл. Ты проходишься по всем пунктам с конца в начало, и при этом в цикле добавляешь новые пункты...
|
Сообщ.
#3
,
|
|
|
Цитата B.V. @ Какой-то странный цикл. Почему странный?, Вот что я делаю. У меня есть некое хранилище. std::vector<std::string> Items; во время работы я напихиваю в него строчки примерно таким образом: for (int i = 0; i < 10; ++i) { std::ostringstream ostr; ostr << "Item_" << i; Items.push_back(ostr.str()); } тогда если я буду выводить от 0 до Items.size() будет получаться: Item_9 Item_8 ... Item_0 Мне же нужно наоборот, потому вот так. А то что в цикле добавляю новые пункты, ну и что с того? Что в прямом проходе что в обратном - какая разница? |
Сообщ.
#4
,
|
|
|
покажи как выглядит AddItemToListCtrl
Цитата staer @ Почему странный? представь 1ю итерацию у тебя добавился один итем ( он есть 1й ), а чек выставляется на 10м....которого как бы еще и нет.... если хочешь чтоб устанавливалось на последнем, то вместо j поставь -1 |
Сообщ.
#5
,
|
|
|
ElcnU, вот:
void MainDialog::AddItemToListCtrl(HWND listCtrl, const std::wstring& name, const std::wstring& propery) { wchar_t temp[256] = {0}; ZeroMemory(&LvItem, sizeof(LvItem)); LvItem.mask = LVIF_TEXT; LvItem.cchTextMax = 256; LvItem.iItem = 0; LvItem.iSubItem = 0; LvItem.pszText = L""; SendMessage(listCtrl,LVM_INSERTITEM,0,(LPARAM)&LvItem); LvItem.iSubItem = 0; LvItem.pszText = const_cast<wchar_t*>(name.c_str()); SendMessage(listCtrl,LVM_SETITEM,0,(LPARAM)&LvItem); LvItem.iSubItem = 1; LvItem.pszText = const_cast<wchar_t*>(propery.c_str()); SendMessage(listCtrl,LVM_SETITEM,0,(LPARAM)&LvItem); // ListView_SetCheckState(listCtrl, 0, true); } И не совсем понял про первую итерацию. Вот у меня пустой вектор. Я его в него добавил объект - вывел один. Добавил еще один - вывел 2. |
Сообщ.
#6
,
|
|
|
Цитата staer @ тогда если я буду выводить от 0 до Items.size() будет получаться: Будет получаться с точностью до наоборот Цитата staer @ А то что в цикле добавляю новые пункты, ну и что с того? Что в прямом проходе что в обратном - какая разница? Принципиальная разница. Как можно работать с пунктами, которых нет? |
Сообщ.
#7
,
|
|
|
а, вот чего, я вспомнил, при добавлении в лист контрол - объект вставляется не в конец, а в начало списка, потому такой и изврат.
Цитата B.V. @ Принципиальная разница. Как можно работать с пунктами, которых нет? что значит работать с пунктами которых нет? вот есть у меня вектор объектов, я взял заполнил листконтрнол, после чего начинаю с ним работать. Не понимаю я что-то твоих вопросов, совсем. |
Сообщ.
#8
,
|
|
|
Цитата staer @ что значит работать с пунктами которых нет? Охх. Ты уничтожаешь все пункты строчкой Цитата staer @ SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0); Затем берешь количество пунктов в своем списке Цитата staer @ int allLayerNodes = layer->GetSize(); И при j, равном allLayerNodes -1 добавляешь первый пункт Цитата staer @ AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType()); И тут же вызываешь ListView_SetCheckState для несуществующего пункта allLayerNodes -1 |
Сообщ.
#9
,
|
|
|
B.V., ой!
сейчас попробую переделать. Окей, сделал вот так: void MainDialog::UpdateNodesListControls(int selected) { if (selected < 0) { return; } SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0); Layer* layer = gSceneEditor->GetScene()->GetLayerHolder()->GetLayer(selected); if (layer) { int allLayerNodes = layer->GetSize(); for (int j = allLayerNodes - 1, i = 0; j >= 0; --j, ++i) { math::Region* region = layer->GetRegion(j); if (region) { AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType()); if (region->IsShowEditorInfo()) { ListView_SetCheckState(hNodesList, i, true); } else { ListView_SetCheckState(hNodesList, i, false); } } } } } Поменялся порядок не отмеченных галок - если раньше не отмечались вторые, то теперь не отмечаются первые. ))) |
Сообщ.
#10
,
|
|
|
Цитата staer @ а, вот чего, я вспомнил, при добавлении в лист контрол - объект вставляется не в конец, а в начало списка, потому такой и изврат. вставил итем вначало, он имеет индекс 0, потом ты хочешь его изменить строчкой Цитата staer @ ListView_SetCheckState(hNodesList, i, true); ты указываешь i, хотя у тебя итем под номером 0, пока не вставился следующий... уловил? ListView_SetCheckState(hNodesList, 0, true); на всякий случай |
Сообщ.
#11
,
|
|
|
ElcnU, есть у меня дружбан, Саня Цукерман. Он темный(не тёмный) парень, много чему научил + не раз подгонял новые карточки(ну пишет для ATI тесты - они его любят), ну умный такой мужик, и вот мы с ним разбираемся что к чему. Он не знает, на форуме никто не знает, и тут находим решение - смотрим - и тут Саня говорит: "Вот к чему стремиться надо 100 решений и все не правильные. Накатить патчи, разобраться в конфигах - и все будет!".
Спасибо братан - все окей, помогло! |