1. RE: setLVItemText Help Please
- Posted by Jonas Temple <jktemple at yhti.net> May 15, 2002
- 430 views
Tony, I think the docs for win32lib state that the id returned from addLVItem may not necessarily be the index of the same. So I'm assuming that you're saving the id returned from addLVItem and then trying to update the list view based on that id. Try changing your setLVItemText to: setLVItemText(KeyMainLV, KeyGroupSelected[i], 2, ComKeyData[1]) and see if that doesn't take care of it. Jonas
2. RE: setLVItemText Help Please
- Posted by Derek Parnell <ddparnell at bigpond.com> May 15, 2002
- 417 views
Tony Steward wrote: > Hi Derek or anyone who can help, > When I try to change the contents of part of my LV it just doesn't seem > to work. Hi Tony, there are a couple of things to note here. Firstly, getLVItemText() and setLVItemText() use the item's INDEX value. This is the row number where the item is CURRENTLY positioned in the listview. And getLVSelected() returns a list of item IDENTIFIERS, not INDEX values. Each item in a listview is given a unique IDENTIFIER. This is unique for the application, not just that particular listview. This means that no two listview items in your applicaiton have the same ID, even though they might have the same INDEX if they are in different listviews. I don't know why it was written this way, but I decided not to break existing code by changing this default behaviour. What I did do though was to allow you to return an expanded list from getLVSelected(). If you use the form getLVSelected( {KeyMainLV, 1}) you will get a list of items in the form of a 2-element sequence. The first element is the ID and the second is the INDEX. For example you might have row 4 and 6 selected, thus you would get back something like... { {27, 4}, {12, 6} } You can then use the INDEX values returned in getLVItemText and setLVItemText. The second thing to note is that you really should NOT use the value returned by addLVItem as a subscript value. addLVItem returns an item's ID value. An you CANNOT guarentee that these will be sequential or even that they will be > 0. So instead of ... id = KeyMainLVID[KeyGroupSelected[i]] you might use ... id = find(KeyGroupSelected[i], KeyMainLVID) if id != 0 then id = KeyMainLVID[id] else -- msg "Bad ID" end if But note that this doesn't really answer your initial problem. Here is the way to find an item's INDEX for the item's ID .. atom LV_FINDINFO LV_FINDINFO = struct_LVFINDINFO( LVFI_PARAM, "", itemID, 0, 0, 0) itemINDEX = sendMessage( myLV, LVM_FINDITEM, -1, LV_FINDINFO ) + 1 release_mem(LV_FINDINFO) Hopes this helps... ---------- Derek.
3. RE: setLVItemText Help Please
- Posted by Tony Steward <tony at locksdownunder.com> May 17, 2002
- 431 views
Derek Parnell wrote: > Tony Steward wrote: > > Hi Derek or anyone who can help, > > When I try to change the contents of part of my LV it just doesn't seem > > to work. > > Hi Tony, > there are a couple of things to note here. Firstly, getLVItemText() and > setLVItemText() use the item's INDEX value. This is the row number where > > the item is CURRENTLY positioned in the listview. And getLVSelected() > returns a list of item IDENTIFIERS, not INDEX values. Each item in a > listview is given a unique IDENTIFIER. This is unique for the > application, not just that particular listview. This means that no two > listview items in your applicaiton have the same ID, even though they > might have the same INDEX if they are in different listviews. > > I don't know why it was written this way, but I decided not to break > existing code by changing this default behaviour. What I did do though > was to allow you to return an expanded list from getLVSelected(). If you > > use the form getLVSelected( {KeyMainLV, 1}) you will get a list of > items in the form of a 2-element sequence. The first element is the ID > and the second is the INDEX. > > For example you might have row 4 and 6 selected, thus you would get back > > something like... > > { {27, 4}, {12, 6} } > > You can then use the INDEX values returned in getLVItemText and > setLVItemText. > > The second thing to note is that you really should NOT use the value > returned by addLVItem as a subscript value. addLVItem returns an item's > ID value. An you CANNOT guarentee that these will be sequential or even > that they will be > 0. So instead of ... > > id = KeyMainLVID[KeyGroupSelected[i]] > > you might use ... > > id = find(KeyGroupSelected[i], KeyMainLVID) > if id != 0 then > id = KeyMainLVID[id] > else > -- msg "Bad ID" > end if > > But note that this doesn't really answer your initial problem. > > Here is the way to find an item's INDEX for the item's ID .. > > atom LV_FINDINFO > LV_FINDINFO = struct_LVFINDINFO( LVFI_PARAM, "", itemID, 0, 0, 0) > itemINDEX = sendMessage( myLV, LVM_FINDITEM, -1, LV_FINDINFO ) + 1 > release_mem(LV_FINDINFO) > > Hopes this helps... > ---------- > Derek. > > Hi Derek, The first way you suggest seems to me to be the simplest method for me. That is getLVSelected({KeyMainLV, 1}). But I'm still not getting it working properly. It semes getLVItemText counts the 1st LV column as column 1 but I think setLVItemText counts column 1 as zero. Is this correct? My procedure as follows checks text in the first column and changes the text in the second column, but it doesnt change the correct row. This is using KeyGroupSelected - getLVSelected({KeyMainLV, 1}) for i = 1 to length(KeyGroupSelected) do id = (KeyGroupSelected[i][2]) if equal(ComKeyKey, getLVItemText(KeyMainLV, id, 1)) then setLVItemText(KeyMainLV, id, 1, ComKeyData[1]) trace(1) exit end if end for So I must still not understand something! Thanks Tony
4. RE: setLVItemText Help Please
- Posted by Tony Steward <tony at locksdownunder.com> May 19, 2002
- 417 views
Derek Parnell wrote: > ----- Original Message ----- > From: "Tony Steward" <tony at locksdownunder.com> > To: "EUforum" <EUforum at topica.com> > Sent: Friday, May 17, 2002 7:42 PM > Subject: RE: setLVItemText Help Please > > > > > > Derek Parnell wrote: > > > Tony Steward wrote: > > > > Hi Derek or anyone who can help, > > > > When I try to change the contents of part of my LV it just doesn't > seem > > > > to work. > > > > > > Hi Tony, > > > there are a couple of things to note here. Firstly, getLVItemText() and > > > setLVItemText() use the item's INDEX value. This is the row number where > > > > > > the item is CURRENTLY positioned in the listview. And getLVSelected() > > > returns a list of item IDENTIFIERS, not INDEX values. Each item in a > > > listview is given a unique IDENTIFIER. This is unique for the > > > application, not just that particular listview. This means that no two > > > listview items in your applicaiton have the same ID, even though they > > > might have the same INDEX if they are in different listviews. > > > > > > I don't know why it was written this way, but I decided not to break > > > existing code by changing this default behaviour. What I did do though > > > was to allow you to return an expanded list from getLVSelected(). If you > > > > > > use the form getLVSelected( {KeyMainLV, 1}) you will get a list of > > > items in the form of a 2-element sequence. The first element is the ID > > > and the second is the INDEX. > > > > > > For example you might have row 4 and 6 selected, thus you would get back > > > > > > something like... > > > > > > { {27, 4}, {12, 6} } > > > > > > You can then use the INDEX values returned in getLVItemText and > > > setLVItemText. > > > > > > The second thing to note is that you really should NOT use the value > > > returned by addLVItem as a subscript value. addLVItem returns an item's > > > ID value. An you CANNOT guarentee that these will be sequential or even > > > that they will be > 0. So instead of ... > > > > > > id = KeyMainLVID[KeyGroupSelected[i]] > > > > > > you might use ... > > > > > > id = find(KeyGroupSelected[i], KeyMainLVID) > > > if id != 0 then > > > id = KeyMainLVID[id] > > > else > > > -- msg "Bad ID" > > > end if > > > > > > But note that this doesn't really answer your initial problem. > > > > > > Here is the way to find an item's INDEX for the item's ID .. > > > > > > atom LV_FINDINFO > > > LV_FINDINFO = struct_LVFINDINFO( LVFI_PARAM, "", itemID, 0, 0, 0) > > > itemINDEX = sendMessage( myLV, LVM_FINDITEM, -1, LV_FINDINFO ) + 1 > > > release_mem(LV_FINDINFO) > > > > > > Hopes this helps... > > > ---------- > > > Derek. > > > > > > > > Hi Derek, > > The first way you suggest seems to me to be the simplest method for me. > > That is getLVSelected({KeyMainLV, 1}). > > But I'm still not getting it working properly. It semes getLVItemText > > counts the 1st LV column as column 1 but I think setLVItemText counts > > column 1 as zero. Is this correct? > > > > My procedure as follows checks text in the first column and changes the > > text in the second column, but it doesnt change the correct row. > > This is using KeyGroupSelected - getLVSelected({KeyMainLV, 1}) > > > > for i = 1 to length(KeyGroupSelected) do > > id = (KeyGroupSelected[i][2]) > > if equal(ComKeyKey, getLVItemText(KeyMainLV, id, 1)) then > > setLVItemText(KeyMainLV, id, 1, ComKeyData[1]) > > trace(1) > > exit > > end if > > end for > > > > So I must still not understand something! > > > No, I've got it wrong. The setLVItemText() should be counting from, but > it's > start at zero. I will examine all the LV routines tonight and make them > consistant. <snip> Making them consistant will be good, but that won't solve my problem. Using the routine above I still cant seem to set text to the correct part of the LV. Description of problem also above. Tony