Ошибка "Index limit out of bounds" в Delphi при работе с TStringList
При работе с объектами TStringList в Delphi, разработчики могут столкнуться с различными проблемами, одной из которых является ошибка "Index limit out of bounds". Это происходит, когда индекс, используемый для доступа к элементам строки, выходит за пределы допустимых значений. В данной статье мы рассмотрим пример кода, который приводит к такой ошибке, и предложим исправленный вариант.
Пример кода, вызывающего ошибку
Вот пример кода, который приводит к ошибке "Index limit out of bounds":
var
sl, new : TStringList;
lscount, index : Integer;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\Folder\test.txt');
new := TStringList.Create;
lscount := sl.Count; // Здесь ошибка, так как мы не учитываем, что индексация начинается с 0, а не с 1
for index := 0 to lscount do // Цикл должен идти до lscount-1
begin
sl.Delimiter := '|';
sl.StrictDelimiter := True;
sl.DelimitedText := sl.Strings[index]; // Здесь происходит попытка модификации списка во время его обхода
if sl.Strings[1] = '3M' then // Доступ к элементам с использованием 1-базной индексации
new.Add(sl.Strings[1] + sl.Strings[3] + sl.Strings[6]); // Ошибка, так как TStringList использует 0-базную индексацию
end;
new.SaveToFile('C:\Folder\new.txt');
finally
sl.Free;
new.Free;
end;
end;
Исправленный вариант
Давайте разберемся, что именно нужно исправить в коде:
Цикл должен идти до lscount - 1, так как счет начинается с нуля.
Необходимо создавать отдельный экземпляр TStringList для разбора каждой строки.
Использовать 0-базную индексацию, так как это стандарт для TStringList.
Исправленный код будет выглядеть следующим образом:
var
sl, parse, new : TStringList;
index : Integer;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\Folder\test.txt');
new := TStringList.Create;
try
parse := TStringList.Create;
try
parse.Delimiter := '|';
parse.StrictDelimiter := True;
for index := 0 to sl.Count - 1 do
begin
parse.DelimitedText := sl.Strings[index];
if (parse.Count > 5) and (parse.Strings[0] = '3M') then // Учитываем 0-базную индексацию
new.Add(parse.Strings[0] + ' ' + parse.Strings[2] + ' ' + parse.Strings[5]); // Исправляем индексы
end;
finally
parse.Free;
end;
finally
new.SaveToFile('C:\Folder\new.txt');
new.Free;
end;
finally
sl.Free;
end;
end;
Заключение
В данной статье мы рассмотрели типичную ошибку, с которой сталкиваются разработчики при работе с TStringList в Delphi, и предложили исправленный вариант кода. Важно помнить о том, что индексация в TStringList начинается с нуля и избегать модификации объекта во время его обхода. Следуя этим простым правилам, можно избежать многих ошибок при работе с коллекциями строк в Delphi.
В контексте обсуждается проблема 'Index limit out of bounds' при работе с компонентом `TStringList` в Delphi, включая примеры кода, вызывающего ошибку, и исправленного варианта, с соблюдением правил индексации и избеганием модификации
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.