shawn857
asked on
Moving TListView items loses "checked" setting in other items
Hello Experts... I'm working with a TListView that has checkboxes enabled and in "vsReport" style. My goal is to be able to double-click on any item and have that item "swap places" with whatever item is in the top of the ListView (ie. Item[0]). Googling around, I found some code on this website that I'm using:
http://stackoverflow.com/questions/6213945/delphi-listview-move-items-up-down-with-buttons
It outlines an "ExchangeItems" procedure that looked to be just what I needed. I added only a few lines to it for my specific needs . Normally it would swap Item(i) and Item[j]... I wanted it to swap Item[0] and Item[j]. And also to correctly swap the value of the "checked" property too. Here's my code:
Simple enough i thought... and seemed logically sound. I tried a small test - I added only 3 items to my ListView: Thing0, Thing1, and Thing2. I put a checkmark in the middle item Thing1. and left the other two unchecked. Then I double-clicked on the bottom Thing2 item. The procedure does indeed "swap" the two items and their corresponding "checked" values correctly, but it unexpectedly and unwantedly turns the Checked setting of item Thing1 (...which was TRUE) to FALSE. I put tracing statements after every line of the code in that procedure to find out where this was occurring, and it appears the culprit is this line:
tempLI.Assign(lv.Items.Ite m[0]);
Immediately after this line, the "checked" value of Thing1 got switched to FALSE, for some reason. This one is driving me bonkers trying to figure out. Does anyone have some insight please?
Thanks!
Shawn
http://stackoverflow.com/questions/6213945/delphi-listview-move-items-up-down-with-buttons
It outlines an "ExchangeItems" procedure that looked to be just what I needed. I added only a few lines to it for my specific needs . Normally it would swap Item(i) and Item[j]... I wanted it to swap Item[0] and Item[j]. And also to correctly swap the value of the "checked" property too. Here's my code:
procedure TForm1.ExchangeItems(lv: TListView; const j: Integer);
var
tempLI: TListItem;
Item0CheckedState, ItemJCheckedState : Boolean;
begin
lv.Items.BeginUpdate;
try
Item0CheckedState:= lv.Items.Item[0].Checked;
ItemJCheckedState:= lv.Items.Item[j].Checked;
tempLI := TListItem.Create(lv.Items);
tempLI.Assign(lv.Items.Item[0]);
lv.Items.Item[0].Assign(lv.Items.Item[j]);
lv.Items.Item[0].Checked:= ItemJCheckedState;
lv.Items.Item[j].Assign(tempLI);
lv.Items.Item[j].Checked:= Item0CheckedState;
tempLI.Free;
finally
lv.Items.EndUpdate
end;
end; // procedure ExchangeItems
Simple enough i thought... and seemed logically sound. I tried a small test - I added only 3 items to my ListView: Thing0, Thing1, and Thing2. I put a checkmark in the middle item Thing1. and left the other two unchecked. Then I double-clicked on the bottom Thing2 item. The procedure does indeed "swap" the two items and their corresponding "checked" values correctly, but it unexpectedly and unwantedly turns the Checked setting of item Thing1 (...which was TRUE) to FALSE. I put tracing statements after every line of the code in that procedure to find out where this was occurring, and it appears the culprit is this line:
tempLI.Assign(lv.Items.Ite
Immediately after this line, the "checked" value of Thing1 got switched to FALSE, for some reason. This one is driving me bonkers trying to figure out. Does anyone have some insight please?
Thanks!
Shawn
ASKER
Thanks Sinisa! Your ListView1DblClick procedure works perfectly, but your suggested code for procedure ExchangeItems does not work right. For my example of 3 items:
Thing0
Thing1 (this one is checked)
Thing2
It will result in:
Thing2
Thing0
Thing1 (this one remains checked... correct)
Instead of Thing2 and Thing0 swapping places (as I would like), Thing2 appears to have just "bumped down" Thing0 one notch below. Do you see?
Thanks!
Shawn
Thing0
Thing1 (this one is checked)
Thing2
It will result in:
Thing2
Thing0
Thing1 (this one remains checked... correct)
Instead of Thing2 and Thing0 swapping places (as I would like), Thing2 appears to have just "bumped down" Thing0 one notch below. Do you see?
Thanks!
Shawn
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Success!! Thank you Sinisa!
Cheers
Shawn
Cheers
Shawn
Open in new window