Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Удаление элементов из StringList во время цикла for в Delphi

Delphi , Синтаксис , Циклы

При работе с StringList в Delphi во время цикла for может возникнуть ошибка list index out of bounds, если вы удаляете элементы из StringList во время цикла. В этой статье мы рассмотрим, почему это происходит, и как этого избежать.

Причина ошибки

Когда вы используете цикл for для перебора элементов StringList, конечная точка цикла определяется только один раз при входе в цикл. Например, если у вас есть 100 элементов в StringList, конечная точка цикла будет равна 99. Если вы начнете удалять элементы из StringList во время цикла, количество элементов уменьшится, и попытка доступа к элементу с индексом, который больше текущего количества элементов, вызовет ошибку list index out of bounds.

Решение проблемы

Существует несколько способов решить эту проблему.

  1. Использование цикла for в обратном порядке

Вы можете использовать цикл for в обратном порядке, начиная с конца StringList и двигаясь к началу. В этом случае, когда вы удаляете элемент, количество элементов не меняется, и цикл продолжается нормально.

procedure remDate(emp: String);
var
  pos1, i: integer;
  dateList: TStringList;
begin
  dateList := TStringList.Create;
  dateList.LoadFromFile('Data\dates.dat');
  for i := dateList.Count - 1 downto 0 do
  begin
    pos1 := AnsiPos(emp, dateList[i]);
    if pos1 <> 0 then
    begin
      dateList.Delete(i);
      dateList.SaveToFile('Data\dates.dat');
    end;
  end;
  dateList.Free;
end; // eo remDate
  1. Использование оператора break для выхода из цикла

Если вы знаете, что каждый сотрудник встречается только один раз в файле, вы можете использовать оператор break для выхода из цикла, как только вы найдете и удалите сотрудника.

procedure remDate(emp: String);
var
  pos1, i: integer;
  dateList: TStringList;
begin
  dateList := TStringList.Create;
  dateList.LoadFromFile('Data\dates.dat');
  for i := 0 to dateList.Count - 1 do
  begin
    pos1 := AnsiPos(emp, dateList[i]);
    if pos1 <> 0 then
    begin
      dateList.Delete(i);
      dateList.SaveToFile('Data\dates.dat');
      Break; // <-- early exit
    end;
  end;
  dateList.Free;
end; // eo remDate
  1. Использование цикла while

Еще один вариант - использовать цикл while для перебора элементов StringList. В этом случае вы можете удалять элементы, не беспокоясь об ошибке list index out of bounds.

Вывод

При удалении элементов из StringList во время цикла for в Delphi важно учитывать, что конечная точка цикла определяется только один раз при входе в цикл. Чтобы избежать ошибки list index out of bounds, вы можете использовать цикл for в обратном порядке, использовать оператор break для выхода из цикла или использовать цикл while.

Создано по материалам из источника по ссылке.

Эта статья описывает проблему удаления элементов из StringList во время цикла for в Delphi и предлагает несколько способов решения этой проблемы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Циклы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 08:52:17/0.0058050155639648/0