Список индексов вне границ в 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,

Другие вопросы по тегам