【问题标题】:List index out of bounds in TPageControlTPageControl 中的列表索引超出范围
【发布时间】:2015-07-20 12:16:45
【问题描述】:

我被 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。有人知道发生了什么吗?我很茫然。

【问题讨论】:

  • 如果您尝试在循环外运行PageControl.Pages[0].TabVisible := False; 会发生什么?
  • 在将 TabVisible 设置为 false 之前尝试设置 PageControl.HandleNeeded。 (delphigroups.info/2/d7/305018.html)
  • @Fenistil 运行 PageControl.Pages[0].TabVisible 时出现相同的列表索引越界错误:= False;循环外
  • @kobik PageControl.HandleNeeded 解决了这个问题,非常感谢!
  • @kobik,您可以将该评论扩展为答案吗?

标签: delphi delphi-xe tpagecontrol


【解决方案1】:

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

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

如果 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 之前重新创建句柄。

【讨论】:

  • 非常好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2011-06-14
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多