[c++]variabele verliest waarde

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
Ik heb een probleem en dat is dat de waarde lParam van mijn listview items verdwijnt. Bij het aanmaken van de listview items zet ik de waarde van de lParam op 2:
C++:
1
2
3
4
5
6
7
8
9
10
    LV_ITEM lvItem;
    lvItem.mask = LVIF_TEXT |LVIF_IMAGE |LVIF_STATE | LVIF_PARAM;
    lvItem.state = 0;
    lvItem.stateMask = 0;
    lvItem.iImage = 2;
    lvItem.lParam = 2;
    lvItem.iItem = iProgram;
    lvItem.iSubItem = 0;
    lvItem.pszText = psList[iProgram].strname;
    GetListCtrl().InsertItem(&lvItem);

En bij het dubbelklikken op een listview item, wil ik aan de hand van de lParam waarde kijken wat voor actie deze moet uitvoeren. Maar hier is deze nooit meer 2... Dit probeer ik op deze manier:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    LV_ITEM lvItem;
    char buffer[20];
    lvItem.pszText = buffer;
    lvItem.cchTextMax = sizeof(buffer);

    POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
    int iItem = GetListCtrl().GetNextSelectedItem(pos);

    lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
    lvItem.iItem = iItem;
    lvItem.iSubItem = 0;
    int iTmp = GetListCtrl().GetItem(&lvItem);

    if (lvItem.lParam == 2){
        AfxMessageBox("goed");
    }else{
        AfxMessageBox("fout");
    }

Jammer genoeg komt er alleen nooit een 'goed' op het scherm, maar altijd fout. Als ik kijk naar de lvItem.pszText, heeft deze wel de juiste waarde.

Als ik bij het toevoegen in de laatste regel de waarde lvItem.lParam opvraag, is die nog steeds 2, maar op het volgende punt waar ik hem kan controleren heeft ie een waarde van boven 1 mln.

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


Verwijderd

Wat gebeurd er als je bij het ophalen de lParam var op 0 initialiseert? (Je weet trouwens toch ook dat CListCtrl ook een methode GetItemData heeft? Dat werkt over het algemeen makkelijker dan met die LVITEM struct)

[ Voor 51% gewijzigd door Verwijderd op 19-06-2003 13:54 ]


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
Ook dan hetzelfde :(
GetItemData()? Levert die dezelfde waarde op als lvItem.lParam ?

[ Voor 63% gewijzigd door pinkwin|IA op 19-06-2003 14:01 ]

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Als je denkt dat Windows jouw struct letterlijk opslaat en weer terug geeft, dan vergis je je. Die struct bestaat uitsluitend als vergaarbak van diverse argumenten voor de InsertItem-functie. Die inhoud wordt gebruikt voor het aanmaken van een nieuw item, maar er is absoluut geen garantie dat je dezelfde letterlijke inhoud weer terug krijgt met getItem (de string die de naam van het item aangeeft, bijvoorbeeld, zal hoogstwaarschijnlijk ook op een ander adres staan, ook al is de inhoud hetzelfde). Je moet je function call dus zien als een variant op een 'gewone' function call zonder struct maar met een stuk of acht argumenten (die nu dus in je struct verstopt zitten).

De juiste methode om je probleem op te lossen is inderdaad het gebruik van GetItemData, in combinatie met SetItemData. Met de laatste methode kun je een willekeurige long value (en daarmee dus ook een pointer, als je meer ruimte nodig hebt) associëren met een list item. Zie de documentatie voor details.

edit:
Ik geloof trouwens dat LV_ITEM deprecated is ten gunste van LVITEM (zonder underscore), maar dat moet je maar even in de handleiding opzoeken.

[ Voor 9% gewijzigd door Soultaker op 19-06-2003 14:28 ]


Verwijderd

Get/SetItemData is inderdaad the way to go, maarum als je dit zo wil gebruiken is hier een magisch regeltje voor je.

ZeroMemory(&lvItem,sizeof(LV_ITEM));

Zet deze direct na je declaratie van je LV_ITEM, in de functie waar je je LV_ITEM gaat ophalen dan he.

  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
Ik heb de fout gevonden :)
Op een andere plaats gebruikte ik SetItemData(..). Deze gooide overschreef dus de waarde van lParam.
ZeroMemory (eigenlijk: memset(lvItem, 0, sizeof(lvItem))) had ik in de code staan maar dat maakte niets uit... Maar het probleem is nu dus gelukkig opgelost :)

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 19 June 2003 @ 14:34:
Get/SetItemData is inderdaad the way to go, maarum als je dit zo wil gebruiken is hier een magisch regeltje voor je.

ZeroMemory(&lvItem,sizeof(LV_ITEM));

Zet deze direct na je declaratie van je LV_ITEM, in de functie waar je je LV_ITEM gaat ophalen dan he.
gebruik dan
C++:
1
LV_ITEM lvItem = { };


Dan heb je tenminste een portable manier van op-nul-initializeren

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1