Visual Studio C++ 2010
Mám listbox s názvy térénu. Informace o druzích indexů a názvů jsou uloženy v objektu esdata.terrains a ve struktuře, která se zpřístupnňuje přes pointer tn. tn->cnst obsahuje index položky, která se zrovna zpracovává (index=id).
Problém je ten že funkce funguje jen když listbox není uspořádaný pomocí LBS_SORT.
Tyto funkce jsou v programu původní:
LinkListBox_Fill(GetDlgItem(dialog, IDC_TR_ID), esdata.terrains.head());
void LinkListBox_Fill(HWND listbox, Link *list)
{
for (; list; list = list->next())
LinkListBox_Add(listbox, list);
}
LRESULT LinkListBox_Add(HWND listbox, const Link *link)
{
// Fill value into the list box:
WPARAM index = List_AddStringW(listbox, link->name());
// With AOK link->id() returns result qual to index
// Associate index with the list box:
List_SetItemData(listbox, index, link);
return index;
}
Když položky nejsou uspořádané a jsou správně zobrazené, tak když změním hodnotu x,y v edit boxu, pak
správný terén je vybrán.
Kontroloval jsem to a dostal jsem tyto hodnoty:
Když je index 5 (tn->cnst == 5) je asociován s názvem "leaves" a index 10 je asociován s "forest". index 0 je "grass 1".
To je vše OK.
Problém nastává když se snažím položky uspořádak, pak se nevybere správná položka.
Vytvořil jsem novou funkci na kontrolu hodnot:
LRESULT LinkListBox_Add_ByID(HWND listbox, const Link *link)
{
WPARAM indexByID = (WPARAM) link->id();
LPCWSTR name = link->name();
WPARAM index = List_AddStringW(listbox, name);
List_SetItemData(listbox, indexByID, link);
return indexByID;
}
Do kukátka přidám name, index a indexByID a když to ladím tak dostanu nesprávný index, ale indexByID je správně.
takže když indexByID == 5 pak name == "leaves", když indexByID == 10 pak name == "forest" ...
A toto je vpořádku. Proto teď používám tu novější funkci, ale přesto se nevybere ta správná položka.
Pokračuji v ladění. Zobrazí se okno, položky už jsou v listboxu vytvořené a seřazené abecedně.
Do edit boxu musím zadat x,y ... 1 a 1. Pak se zpracuje příslušná zpráva a zavolá metoda co updatuje údaje. A má se vybrat ta správná položka v listboxu:
SendDlgItemMessage(dialog, IDC_TR_ID, LB_SETCURSEL, tn->cnst, 0);
V tomto momentu tn->cnst čili hodnota indexu je správně: unsigned char 0x05 . To odpovádá "leaves".
Toto volání bylo provedeno z LoadMap() poté co jsem volal Map_UpdateCoord(dialog, id).
Následně se zobrazí okno a vidím že se zobrazila nesprávná položka. Ne "leaves" ale "dirt 1" což je myslím index 3.
Nemohu tedy přijít na to jak je to možné že se zobrazuje nesprávná položka. Protože jak jsem to ladil při vytváření toho seznamu, tak všechny hodnoty s tou novou funkcí jsou správné, takže snad se měl ten listbox vytvořit správně. Napadá někoho z vás kde by mohl být zakopaný pes?