我有一个列表框或带有项目的列表视图。我有一个字符串列表与列表框/列表视图相同的项目(字符串)。我想从字符串列表中删除列表框/列表视图中的所有选定项目。
怎么办?
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
答案 0 :(得分:20)
for i := ListBox.Count - 1 downto 0 do
if ListBox.Selected[i] then
StringList1.Delete(i);
答案 1 :(得分:16)
诀窍是以相反的顺序运行循环:
for i := ListBox.Count-1 downto 0 do
if ListBox.Selected[i] then
StringList1.Delete(i);
这样,删除项目的行为只会更改列表中稍后的元素索引,并且这些元素已经处理完毕。
答案 2 :(得分:9)
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;
答案 3 :(得分:4)
如何以相反的方式进行(添加而不是删除)?
StringList1.Clear;
for i:=0 to ListBox.Count-1 do
if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i));