[C++ Win32] Listview kolommen bijhouden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
Heb een probleempje met het ophalen en opslaan van List View 'Item.subItem', de waardes in de kolommen dus. Ik gebruik hiervoor dit...

C++:
1
2
3
4
5
struct {
    char verhouding[32];
    char fouten[32];
    char cijfer[32];
} leerlingen[64];


Dus 64 blokken van drie char arrays. Elke struct stelt zoals te zien een leerling voor met zijn cijfer enzo. Dit komt dus neer op 64*(32+32+32) bytes aan opslag. Elke keer als er een item aan de lijst wordt toegevoegd, wordt de index meegegeven, en worden de waardes leerlingen[index] ingevuld. Die waardes worden dan opgehaald door WM_NOTIFY...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
case LVN_GETDISPINFO: {
    NMLVDISPINFO* plvdi;
    plvdi = (NMLVDISPINFO*) lParam;
    int count = SendMessage(hNote,LVM_GETITEMCOUNT,0,0);
    for(int a = 0;a < count;a++) {
        // Controle
        char buffertje[32];
        itoa(a,buffertje,10);
        MessageBox(hwnd,buffertje,"Index #",MB_OK);
        switch (plvdi->item.iSubItem) {
            case 1: {
                plvdi->item.pszText = leerlingen[a].verhouding;
                break;
            }
            case 2: {
                plvdi->item.pszText = leerlingen[a].fouten;
                break;
            }
            case 3: {
                plvdi->item.pszText = leerlingen[a].cijfer;
                break;
            }
        }
    }
    break;
}


Die bij het afhandelen van LVN_GETDISPINFO alle items langsgaat. Als item #1 wordt ingevuld, (dus a staat op 0, wordt nummertje 0 van alle leerlingen-objecten aangesproken en uitgelezen. Dit werkt tot nu toe perfect.

Maar als ik ga scrollen door de items van de listview, loopt alles in de soep. Items krijgen (zo lijkt het) random
subitems toegewezen. Er is één patroon te zien af en toe: alle items krijgen de nieuwste subitems te pakken, maar willen niet meer terug. Heb al op vele plekken met MessageBox geprobeerd waardes te tracken (zie code voor een voorbeeld), maar alles lijkt goed te gaan.

Voorbeeld:
Afbeeldingslocatie: http://img44.imageshack.us/img44/5755/addingitems.png
Items toevoegen, niet op listview zelf klikken.

Afbeeldingslocatie: http://img340.imageshack.us/img340/7466/scrolling.png
Sinterklaas' balkje aanklikken, en met toetsenbord/muis naar boven scrollen.

Iemand een idee wat ifk fout doe? Zijn er nog andere stukjes code nodig voor helderheid?

Edit: antwoord gevonden in msdn. Deze kan dicht.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Orwell schreef op zondag 06 juni 2010 @ 16:28:
Edit: antwoord gevonden in msdn. Deze kan dicht.
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde. Het zou ook fijn zijn als je de oplossing even zou posten voor diegenen die je topic later nog eens tegen komen in de search ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
RobIII schreef op zondag 06 juni 2010 @ 21:30:
[...]

Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde. Het zou ook fijn zijn als je de oplossing even zou posten voor diegenen die je topic later nog eens tegen komen in de search ;)
Hier komt ie dan.

Na wat eeuwig gezoek in de gedrochten van Win32 API (MFC, NET, Forms enzo nemen de tent over daarzo), kwam ik het pointer naar object-idee tegen.

Op deze msdn-pagina, onder 'Adding List-View Items and Subitems' wordt het idee van een array van structs (één struct per item) aanbevolen als dump voor alle .subItems. Dat idee had ik dus overgenomen (zie eerste codeblok startpost), en er 64 stuks van gereserveerd in het geheugen. Maar ik wist dus niet hoe ik ze netjes aan elk item moest toewijzen.

Wat ik dus had bekokstoofd was dat ik de index van elk item zou invullen tussen de '[]', om zo elk item een eigen struct te geven. Dat werkte niet. Elk item kreeg op volgorde elk item toegewezen t/m de laatste. Die laatste bleef steken. Vandaar dat effect dat de onderste overal overheen gaat.

Het ging wel goed als je nergens aan zat, want dan werd alleen het nieuwe item geëdit. Die kreeg ook alle items over zich heen t/m de laatste, maar dat was toevallig goed.

Oplossing: gebruik een pointer naar het object, de SubItem-dump, en gebruik members van dat object/pointer:

(*pointer).member / pointer->member.

Of in code (het ouwe stukje):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case LVN_GETDISPINFO: {
    NMLVDISPINFO* plvdi;
    plvdi = (NMLVDISPINFO*) lParam;
    // int count = SendMessage(hNote,LVM_GETITEMCOUNT,0,0);
    switch (plvdi->item.iSubItem) {
        case 1: {
            plvdi->item.pszText = leerlingen[plvdi->item.iItem].fouten;
            break;
        }
        case 2: {
            plvdi->item.pszText = leerlingen[plvdi->item.iItem].fouten;
            break;
        }
        case 3: {
            plvdi->item.pszText = leerlingen[plvdi->item.iItem].cijfer;
            break;
        }
    }
    break;
}


Ben helaas geen grootmeester in pointers, dus eh, 'correct me if I'm wrong.'

[ Voor 3% gewijzigd door Orwell op 06-06-2010 22:15 . Reden: wat meer verwijzen ]