7

我有一个包含项目的列表框或列表视图。我有一个字符串列表,其中包含与列表框/列表视图相同的项目(字符串)。我想从字符串列表中删除列表框/列表视图中的所有选定项目。

怎么做?

for i:=0 to ListBox.Count-1 do
  if ListBox.Selected[i] then
    StringList1.Delete(i); // I cannot know exactly an index, other strings move up
4

4 回答 4

22
for i := ListBox.Count - 1 downto 0 do
  if ListBox.Selected[i] then
    StringList1.Delete(i);
于 2011-07-25T20:28:09.773 回答
18

诀窍是以相反的顺序运行循环:

for i := ListBox.Count-1 downto 0 do
  if ListBox.Selected[i] then 
    StringList1.Delete(i);

这样,删除项目的行为只会更改列表中后面元素的索引,并且这些元素已经被处理过。

于 2011-07-25T20:28:18.007 回答
10

Andreas 和 David 提供的解决方案假定字符串在 ListBox 和 StringList 中的顺序完全相同。这是一个很好的假设,因为您没有另外指出,但如果它不是真的,您可以使用 StringList 的IndexOf方法来查找字符串的索引(如果 StringList 已排序,请Find改用)。就像是

var x, Idx: Integer;
for x := ListBox.Count - 1 downto 0 do begin
   if ListBox.Selected[x] then begin
      idx := StringList.IndexOf(ListBox.Items[x]);
      if(idx <> -1)then StringList.Delete(idx);
   end;
end;
于 2011-07-25T20:40:09.690 回答
5

反过来如何(添加而不是删除)?

StringList1.Clear;
for i:=0 to ListBox.Count-1 do
  if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i));
于 2011-07-25T20:33:42.257 回答