В процессе разработки программного обеспечения на языке Object Pascal в среде Delphi разработчики могут столкнуться с различными ошибками, в том числе и с ошибкой "List index out of bounds" при работе с компонентом TListBox. В этой статье мы рассмотрим, как возникает данная ошибка и предложим способы её устранения.
Описание проблемы
Рассмотрим типичную ситуацию: у нас есть TListBox на форме, и элементы добавляются с помощью следующего кода:
где grp — это целочисленная переменная. TListBox установлен в режим lbOwnerDrawFixed. В обработчике события onDrawItem возникает исключение EStringListError на следующей строке:
grp := Integer((Control as TListBox).Items.Objects[index]);
Это происходит из-за попытки доступа к элементу, который не существует в списке объектов TListBox.
Пример кода, вызывающего ошибку
var
msg: string;
grp: Integer;
begin
grp := 123; // Пример значения
listbox1.ItemIndex := listbox1.Items.AddObject('msg', TObject(grp));
// В обработчике onDrawItem
msg := (Control as TListBox).Items.Strings[index]; // Эта строка работает
grp := Integer((Control as TListBox).Items.Objects[index]); // Здесь возникает исключение
end;
Решение проблемы
Использование метода AddObject для хранения целых чисел является неэффективным. Вместо этого следует использовать строковое представление числа:
При получении данных из TListBox следует использовать обратное преобразование:
grp := StrToInt((Control as TListBox).Items.Objects[index]);
Также важно помнить, что для доступа к объекту по индексу необходимо использовать индекс строки, под которой он был сохранён:
grp := Integer((Control as TListBox).Items.Objects[(Control as TListBox).Items.IndexOf(msg)]);
Подтверждённый ответ
Ошибка возникает из-за попытки использовать -1 как значение для AddObject или Objects[index], что некорректно. В Delphi TObject не может быть -1, так как это не валидное значение для типа TObject.
Заключение
При работе с TListBox и владельским рисованием важно правильно использовать методы для добавления и извлечения данных. Использование строковых представлений целых чисел и корректный доступ к объектам по их индексам позволит избежать ошибки "List index out of bounds". Следуя этим рекомендациям, разработчики смогут эффективно работать с TListBox в Delphi, минимизируя риск возникновения ошибок.
Устранение ошибки 'List index out of bounds' при использовании TListBox и владельского рисования в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.