【问题标题】:How to remove duplicate items in a ListView?如何删除 ListView 中的重复项?
【发布时间】:2022-01-27 16:02:18
【问题描述】:

我有一个TListView,里面有一些东西:

item1
item1
item2

我想在单击按钮时删除重复项:

item1
item2

到目前为止,这是我的代码:

procedure TMainForm.Button3Click(Sender: TObject);
var i,j, k: integer;
begin
  I := 0;
  while I < ListView1.Items.Count  do
  begin
    for j := ListView1.Items.Count - 1 downto 0 do
    begin
      if ListView1.Items[I].SubItems[3] = ListView1.Items[j].SubItems[3] then
        ListView1.Items.Delete(J);
        Continue;
       end;
       Inc(I);
  end;
end;

它正在删除所有项目。我该如何解决这个问题?

【问题讨论】:

  • 您不应该使用Inc 方法而不是J 来增加I 的价值吗?在您的情况下,J 是您的for loo 的控制变量,它由for loop 机制管理。您的 while loop 依赖于 I 变量,因此您应该手动更新您的 I 变量。

标签: delphi duplicates tlistview


【解决方案1】:

当您拨打Delete() 时,这些项目不会立即删除。 ListView 必须返回到消息循环才能真正删除项目。因此,如果您有相同的物品,例如第 1 行和第 4 行,这两行都将被删除:

  • i=1j=4 时的第 4 行
  • i=4j=1 时的第 1 行

通过将 for j := ... 循环更改为:

for j := ListView1.Items.Count - 1 downto i+1 do // instead of downto 0

这确保了一对行只比较一次,并且两条相等的行中的后者被删除。

【讨论】:

  • 我明白了!
猜你喜欢
  • 2017-10-08
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
相关资源
最近更新 更多