我遇到了一个表现出一些奇怪行为的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 out of bounds(3)'错误PageControl.Pages[0].TabVisible := False;
现在,当我在调试器中查看PageControl属性时,一切似乎都是有序的。 PageCount预计为3,我可以在评估器中看到所有页面及其属性,包括第0页的TabVisible
我在Windows 7机器上使用Delphi XE ..有没有人知道发生了什么?我很茫然。
答案 0 :(得分:7)
tldr:在设置PageControl.HandleNeeded
之前设置TabVisible
。
这里有一个很好的解释(格雷格查普曼):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
之前重新创建句柄。