8

我被一个表现出一些奇怪行为的 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,我可以在评估器中看到所有页面及其属性,包括第 0 页的 TabVisible

我在 Windows 7 机器上使用 Delphi XE.. 有人知道发生了什么吗?我不知所措。

4

1 回答 1

8

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

这里有一个很好的解释(由 Greg Chapman 撰写):TabSheet 上的 TabVisible 和索引错误
对于未来的 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

于 2015-07-21T07:49:12.453 回答