列表索引超出TPageControl

时间:2015-07-20 12:16:46

标签: delphi delphi-xe 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 out of bounds(3)'错误
PageControl.Pages[0].TabVisible := False;

现在,当我在调试器中查看PageControl属性时,一切似乎都是有序的。 PageCount预计为3,我可以在评估器中看到所有页面及其属性,包括第0页的TabVisible

我在Windows 7机器上使用Delphi XE ..有没有人知道发生了什么?我很茫然。

1 个答案:

答案 0 :(得分:7)

tldr:在设置PageControl.HandleNeeded之前设置TabVisible

这里有一个很好的解释(格雷格查普曼):TabVisible on TabSheet and index error
对于将来的SO参考(复制/粘贴):

如果PageControl的句柄被破坏(可以 如果在PageControl或其任何父窗口中设置某个属性导致调用RecreateWnd),则会发生,PageControl会将可见选项卡保存在TStringListFSaveTabs)中。设置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之前重新创建句柄。