2015-07-20 10 views
7

Я застрял с 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; 

я получаю «индекс списка из из оценки (3)»ошибка при выполнении первой строки первой итерации, эквивалентного петлевой

PageControl.Pages[0].TabVisible := False; 

Теперь, когда я осматриваю свойства PageControl в отладчик, кажется, что все в порядке. PageCount ожидается 3, и я могу видеть все страницы и их свойства, в том числе TabVisible страницы 0, в оценке

Я использую Delphi XE на компьютере с Windows 7. Кто-нибудь есть идея, что такое продолжается? Я в недоумении.

+0

Что произойдет, если вы попытаетесь запустить 'PageControl.Pages [0] .TabVisible: = False;' вне цикла? – Fenistil

+2

Попробуйте установить 'PageControl.HandleNeeded' перед установкой' TabVisible' в false. (http://www.delphigroups.info/2/d7/305018.html) – kobik

+0

@Fenistil Я получаю тот же индекс индекса за пределами ошибки при запуске PageControl.Pages [0] .TabVisible: = False; вне петли –

ответ

7

tldr: комплект PageControl.HandleNeeded перед тем установка TabVisible.

Существует хорошее объяснение здесь (Грег Chapman): TabVisible on TabSheet and index error
Для будущего SO ссылки (копировать/вставить):

Если ручка в 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.