Список индексов вне границ в TPageControl
Я застрял с TPageControl, который демонстрирует странное поведение..
Элемент управления имеет 3 страницы, но когда я делаю
for I:=0 to PageControl.PageCount-1 do begin
PageControl.Pages[I].TabVisible := False;
PageControl.Pages[I].Visible := Ord(iColorScale.GenerationMode) = I;
end;
Я получаю ошибку "List index of bounds (3)" при выполнении первой строки первой итерации цикла, эквивалентной
PageControl.Pages[0].TabVisible := False;
Теперь, когда я просматриваю свойства PageControl в отладчике, кажется, что все в порядке. Ожидается, что PageCount равен 3, и я могу видеть все страницы и их свойства, включая TabVisible страницы 0, в оценщике.
Я использую Delphi XE на машине с Windows 7. У кого-нибудь есть идеи, что происходит? Я в недоумении.
1 ответ
tldr: set PageControl.HandleNeeded
перед установкой TabVisible
,
Здесь есть хорошее объяснение (Грег Чепмен): TabVisible на TabSheet и ошибка индекса
Для использования в будущем (скопируйте / вставьте):
Если дескриптор PageControl был уничтожен (что может произойти, если установка какого-либо свойства в PageControl или в любом из его родительских окон вызывает вызов RecreateWnd
), PageControl сохраняет видимые вкладки в TStringList
(FSaveTabs
). настройка TabVisible
приводит к вызову этой процедуры:
procedure TTabSheet.SetTabShowing(Value: Boolean);
var
Index: Integer;
begin
if FTabShowing <> Value then
if Value then
begin
FTabShowing := True;
FPageControl.InsertTab(Self);
end else
begin
Index := TabIndex;
FTabShowing := False;
FPageControl.DeleteTab(Self, Index);
end;
end;
Во время звонка FPageControl.DeleteTab
, PageControl будет воссоздавать свой дескриптор при необходимости. При этом он пытается сбросить видимые вкладки, используя FSaveTabs
, Тем не менее, он может запутаться, потому что одна из вкладок, которые он добавил в FSaveTabs
теперь невидим (TabSheet.FTabShowing = false
). Это вызывает IndexError. Таким образом, исправление состоит в том, чтобы убедиться, что ручка воссоздана перед установкой TabVisible
,