一个有趣的关于TListView删除节点的问题:(50分)

  • 主题发起人 主题发起人 xuepiaofei
  • 开始时间 开始时间
X

xuepiaofei

Unregistered / Unconfirmed
GUEST, unregistred user!
为了满足用户多选和一次性删除的要求,我把ListView1的属性设置如下:
……
MultiSelect = True;
ViewStyle = vsReport;
……

因此我想到了两种算法:

算法一:
var
Item:TListItem;
begin
Item:=ListView1.Selected;
while Item<>nil do begin
Item.Delete;
Item:=ListView1.GetNextItem(Item, sdAll, [isSelected]);
end; // while
end;

算法二:
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do begin // Iterate
if Listview1.Items.Selected then
Listview1.Items.Delete;
end; // for
end;

可是这两个算法有明显的漏洞,在用户删除最后一个节点的时候,这两个算法都有问题,
尤其是第二个算法,循环上限ListView1.Items.Count居然每次都在变,非常不合乎常规。

请教各位高手,如何来设计一个行之有效的算法来解决这个问题?
 
算法二:
var
I: Integer;
begin
for I := ListView1.Items.Count - 1 downto 0 do begin // Iterate
if Listview1.Items.Selected then
Listview1.Items.Delete;
end; // for
end;
 
对头,倒过来就没有事咧
 
//一次性删除所有
ListView1.Items.Clear;

//多选状态下删除所有

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to ListView1.SelCount - 1 do
ListView1.Selected.Delete;
end;
 
同意二三楼的说法
循环上限ListView1.Items.Count每次都在变的原因是你删除一个节点马上要产生一个change事件,并且先去响应那个事件
 
谢谢各位,问题解决了!
 
后退
顶部