Исправление ошибки "Index out of range (-1)" при клике по элементу TListBox в приложениях на Delphi
При работе с компонентами TListBox в среде разработки Delphi occasionally может возникать ошибка "Index out of range (-1)", когда вы пытаетесь обратиться к индексу, который не существует. В данном случае, при клике по элементу в TListBox, приложение выдает ошибку, несмотря на то, что список не пуст. Эта проблема обычно связана с некорректным управлением индексами элементов списка или неправильной логикой обработки событий.
Описание проблемы
Разработчик столкнулся с ошибкой "Index out of range (-1)", когда пытался кликом по элементу TListBox с именем lboMtrlList, который заполняется данными из базы данных. Данные отображаются корректно, но при клике по любому элементу списка возникает указанная ошибка.
Контекст проблемы
Код для заполнения lboMtrlList выглядит следующим образом:
procedure TfrmMakeQuote.FormCreate(Sender: TObject);
begin
// ...
query.SQL.Text := 'SELECT [Material Description] FROM MtrlDatabase ORDER BY MtrlID';
try
query.Open;
lboMtrlList.Items.Clear;
while not query.EOF do
begin
lboMtrlList.Items.Add(query.Fields[0].AsString);
query.Next;
end;
finally
query.Close;
end;
// ...
end;
Также имеется код для обработки двойного клика по элементу списка:
procedure TfrmMakeQuote.lboMtrlListDblClick(Sender: TObject);
begin
lboMtrlList.Items.Add(lboSelectedMtrl.Items.Strings[lboSelectedMtrl.ItemIndex]);
end;
Анализ и решение проблемы
Проблема в том, что в обработчике двойного клика происходит добавление элемента из lboSelectedMtrl в lboMtrlList, что является неверной логикой, так как изначально предполагалось обратное действие. Кроме того, в коде отсутствует проверка на валидность индекса выбранного элемента. В результате, когда пытаемся получить элемент из пустого списка lboSelectedMtrl, возникает ошибка "Index out of range (-1)".
Подтвержденное решение заключается в исправлении логики обработчика событий двойного клика:
procedure TfrmMakeQuote.lboMtrlListDblClick(Sender: TObject);
var
Idx: Integer;
begin
Idx := lboMtrlList.ItemIndex;
if Idx <> -1 then
lboSelectedMtrl.Items.Add(lboMtrlList.Items.Strings[Idx]);
end;
Важно заметить, что свойство Strings не требуется, достаточно использовать Items[ItemIndex]. Также необходимо добавить проверку на валидность индекса перед выполнением операции.
Альтернативные подходы и дополнительные рекомендации
Убедитесь, что на TListBox не назначено других событий, которые могут вызывать аналогичные ошибки.
Проверьте, что ваш запрос к базе данных возвращает данные, и список не оказывается пустым.
Создайте тестовое приложение, которое не использует базу данных для заполнения списка, чтобы исключить связанные с ней проблемы.
Проверьте, что событие двойного клика действительно срабатывает при двойном клике, а не при одиночном.
Заключение
Исправление ошибки "Index out of range (-1)" в приложениях на Delphi требует внимательного анализа кода и логики работы с событиями TListBox. Ошибка, описанная в этом вопросе, была вызвана неправильным направлением переноса элементов между списками и отсутствием проверки на валидность индекса. Исправление этих моментов позволит избежать ошибки и обеспечить корректное функционирование приложения.
Проблема связана с обработкой событий в компоненте `TListBox` в приложении на Delphi, где при попытке обратиться к элементу списка возникает ошибка 'Index out of range (-1)' из-за неправильной логики и отсутствия проверки валидности индекса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.