Удалить строки из TStringList - PullRequest
5 голосов
/ 26 июля 2011

У меня есть список или просмотр списка с элементами.И у меня есть список строк с теми же элементами (строками), что и список / просмотр списка.Я хочу удалить все выбранные элементы в списке / представлении списка из списка строк.

Как это сделать?

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 ]

20 голосов
/ 26 июля 2011
for i := ListBox.Count - 1 downto 0 do
  if ListBox.Selected[i] then
    StringList1.Delete(i);
16 голосов
/ 26 июля 2011

Хитрость заключается в запуске цикла в обратном порядке:

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

Таким образом, действие по удалению элемента только изменяет индексы элементов позже в списке, и эти элементы уже обработаны.

9 голосов
/ 26 июля 2011

Решение, предоставленное Андреасом и Дэвидом, предполагает, что строки точно в одинаковом порядке как в ListBox, так и в StringList. Это хорошее предположение, так как вы не указываете иначе, но в случае, если это не так, вы можете использовать метод IndexOf StringList, чтобы найти индекс строки (если отсортирован 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;
4 голосов
/ 26 июля 2011

Как насчет сделать это наоборот (добавить вместо удаления)?

StringList1.Clear;
for i:=0 to ListBox.Count-1 do
  if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i));
...