Problém s indexy v uspořádaném listboxu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s indexy v uspořádaném listboxu – C / C++ – Fórum – Programujte.comProblém s indexy v uspořádaném listboxu – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
4. 7. 2015   #1
-
0
-

Visual Studio C++ 2010

Proč funkce LinkListBox_Add vrací indexy které nejsou unikátní? Ukládám to do pole které má obsahovat unikátní indexy, ale oni se opakují.

int terrainIndecies[MAX_TERRAINS]; // needed to select item in sorted list/combo
int * pTerrainIndecies = terrainIndecies;
LinkListBox_Fill_keepAssociations(GetDlgItem(dialog, IDC_TR_ID),
    esdata.terrains.head(), pTerrainIndecies);
int LinkListBox_Fill_keepAssociations(HWND listbox, Link *list, int * associations)
{
    int index;
    for (; list; list = list->next()){
        index = LinkListBox_Add(listbox, list);
        associations[list->id()] = index; // save for purposes of ordered list to select correct item
        }
return *associations;
}

LRESULT LinkListBox_Add(HWND listbox, const Link *link)
{
    WPARAM index = List_AddStringW(listbox, link->name());
    LPCWSTR name = link->name();
    int ID = link->id();
    List_SetItemData(listbox, index, link);
    return index;
}

cycle 1:

ID: 0
index: 0
name: Grass 1

cycle 2:
index: 1
ID: 1
name: Water, Shallow

cycle 3:
index: 0 (WHY???)
ID: 2
name: Beach

cycle 4:
index: 1 (WHY???)
ID: 3
name: Dirt 3

cycle 5:
index: 3 (WHY???)
ID: 4
name: Shallows

cycle 6
index: 3 (WHY???)
ID: 5
name: Leaves


List_AddStringW vrací index z SendMessageW: 


inline LRESULT List_AddStringW(HWND control, LPCWSTR string)
{
    return SendMessageW(control, LB_ADDSTRING, 0, (LPARAM)string);
}
Nahlásit jako SPAM
IP: 78.45.87.–
KIIV
~ Moderátor
+43
God of flame
4. 7. 2015   #2
-
0
-

ja v tom vidim jisty vzorec:

Beach            0 0 0 0
Dirt               1 1 1
Grass 1        0 1 2 2 2
Leaves                 3
Shallows             3 4
Water, Shallow 1 2 3 4 5
Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
4. 7. 2015   #3
-
0
-

Nic mi to neříká. Zřejmě to vrací pokaždé jiný index, protože jak přidávám nové položky do seznamu tak se ty staré položky musí přečíslovat. Ale mým hlavním problémem je že nechápu jak mám z hotového seznamu vybrat tu správnou položku. Třeba "Leaves" , id 5. Měla by tam být vytvořena asociace mezi indexem a linkem protože:

List_SetItemData(listbox, index, link);

jenže nemohu přijít na to jak teda vybrat tu položku. Příkaz na vybrání

SendDlgItemMessage(dialog, IDC_TR_ID, LB_SETCURSEL, tn->cnst, 0);

nefunguje (tn->cnst obsahuje id hodnotu 5). Umím vrátit odkaz na první link ale neumím najít ten správný link odpovídající id 5.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
4. 7. 2015   #4
-
0
-

Chci říct že neznám index, ale znám id, jak teda na základě toho vybrat položku ze seznamu?

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
4. 7. 2015   #5
-
0
-

Oprava: už jsem přišel na to jak vrátit link na položku:

const ColorLink *link;

if ( tn->cnst != 0xff )
   link = esdata.terrains.getById(tn->cnst);

ale co stále nevím jak vrátit ten index. Jestliže byla vytvořená asociace mezi indexem položky a link(em) tak to přece nějak musí jít?

Sice jsem to zvládl pomocí LB_SELECTSTRING, ale co když by položky nebyly unikátní?

    const ColorLink *link;
    const wchar_t * name;
    if ( tn->cnst != 0xff ){
        link = esdata.terrains.getById(tn->cnst);
        // LPCWSTR
        name = link->name();
        SendDlgItemMessageW(dialog, IDC_TR_ID, LB_SELECTSTRING, -1, (LPARAM) name );
    }
Nahlásit jako SPAM
IP: 78.45.87.–
KIIV
~ Moderátor
+43
God of flame
4. 7. 2015   #6
-
0
-

Vzdy ti to vrati index na jakou pozici to vlozilo!!! Proste je to poskladany po sobe tak jak jsem to poslal.. po tech insertech.. a zaroven tam i odpovidaji ty indexy, co si se tak divil, proc jsou takovy

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
4. 7. 2015   #7
-
0
-

Vzdy ti to vrati index na jakou pozici to vlozilo!!!

Jenže k čemu mi to je že mi to vrátilo index, když ten index se pak změní? Když bych si např. vytvořil pole do kterého bych ukládal ID a tomu bych přiřadil ten tehdejší index, tak ta hodnota už nebude v dalších kolech aktuální. Nejdříve přece volám jistou funkci, která mi vytvoří seznam položek. Indexy, které se zpracovávali, k těm už teď nemám přístup protože znám pouze hodnotu posledního indexu. Takže když potom zadám že chci najít určitou konstantu/id tak neznám jeho index. Jediná cesta mě napadá to vyhledávání stringu, jenže to se zdá být pomalé (možná to jen tak vypadá, možná je to něčím jiným, ale je mi divné že když tam vkládám link tak čemu ho tam teda vlastně vkládám, když ho potom nevyužiju)... Logické by bylo vkložit třeba pointer na položku a ten pak zpřístupnit, ale k tomu bych musel vědět ke kterému id je přiřazen jaký pointer. Ty funkce na výběr ale nefungují na pointer, ale na index.

Nahlásit jako SPAM
IP: 78.45.87.–
KIIV
~ Moderátor
+43
God of flame
4. 7. 2015   #8
-
0
-

To je uz nevyhoda SERAZENEHO seznamu. Prekvapive se to vlozi na pozici kam to patri, ne na konec, kam bys to evidentne rad dal. Kdyztak budes mit jeste vektor indexu a vsechny stejne a vetsi po vlozeni pak inkrementujes. Nebo najit neco, co to zvladne udelat tak jak to chces ty...

Predpokladam, ze se mozna budes muset zbavit atributu:

LB_ADDSTRING message

Adds a string to a list box. If the list box does not have the LBS_SORT style, the string is added to the end of the list. Otherwise, the string is inserted into the list and the list is sorted.

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
4. 7. 2015   #9
-
0
-

Je to na mě moc složité. Asi to nechám tak jak to je a budu rád že to jede. Trvalo tři dny než jsem dosáhl jakž takž nějakého výsledku. Kdyby sem někdo dal funkční kód to by bylo něco jiného.

Nahlásit jako SPAM
IP: 78.45.87.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Podobná vlákna

MySQL a indexy — založil fnenks

Vymena 2 prvku pole i s indexy — založil sh00ter

Vkládání do listboxu — založil wickzig

C# Diakritika v listboxu — založil krpik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý