При работе с компонентом TPageControl в Delphi XE на машине с Windows 7 пользователи могут столкнуться с непредвиденным поведением. В частности, при попытке скрыть вкладки в цикле происходит ошибка "List index out of bounds (3)", хотя ожидается, что у компонента три вкладки.
Описание проблемы
Рассмотрим код, который приводит к ошибке:
for I:=0 to PageControl.PageCount-1 do begin
PageControl.Pages[I].TabVisible := False;
PageControl.Pages[I].Visible := Ord(iColorScale.GenerationMode) = I;
end;
Ошибка возникает на первой итерации цикла при попытке установить свойство TabVisible для первой вкладки:
PageControl.Pages[0].TabVisible := False;
При этом в отладчике все параметры компонента TPageControl отображаются корректно, и количество страниц равно трем.
Причины возникновения ошибки
Ошибка может возникать из-за того, что компонент TPageControl сохраняет видимые вкладки в TStringList (свойство FSaveTabs). Если происходит уничтожение хэндла TPageControl (например, при изменении некоторых свойств или родительских окон, что приводит к вызову RecreateWnd), то при попытке установить свойство TabVisible возникает путаница в логике восстановления видимых вкладок, что и приводит к индексной ошибке.
Решение проблемы
Для устранения ошибки необходимо вызвать метод HandleNeeded у TPageControl перед изменением свойства TabVisible. Это позволит компоненту пересоздать свой хэндл, если это необходимо, и избежать ошибки.
PageControl.HandleNeeded;
for I:=0 to PageControl.PageCount-1 do begin
PageControl.Pages[I].TabVisible := False;
PageControl.Pages[I].Visible := Ord(iColorScale.GenerationMode) = I;
end;
Подтвержденный ответ
Кратко: перед изменением свойства TabVisible вызовите PageControl.HandleNeeded.
Альтернативный ответ
Попытка выполнения аналогичного кода вне цикла также приводит к ошибке, что подтверждает наличие проблемы с хэндлом TPageControl.
Заключение
При работе с TPageControl в Delphi XE важно помнить о правильном управлении хэндлами компонентов. Вызов метода HandleNeeded перед изменением свойств, связанных с отображением вкладок, поможет избежать "List index out of bounds" ошибок.
Эта информация может быть полезна разработчикам, сталкивающимся с подобными проблемами в Delphi, и поможет быстро найти и решить их, не тратя время на отладку.
Пользователь столкнулся с ошибкой 'List index out of bounds' при работе с компонентом TPageControl в Delphi XE на Windows 7, связанной с попыткой скрыть вкладки, и ищет решение проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS