gpt4 book ai didi

delphi - TPageControl 中的列表索引越界

转载 作者:行者123 更新时间:2023-12-03 14:52:57 24 4
gpt4 key购买 nike

我被一个表现出一些奇怪行为的 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。有人知道发生了什么吗?我很茫然。

最佳答案

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

这里有一个很好的解释(Greg Chapman):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)。这会导致索引错误。因此,修复方法是确保在设置 TabVisible 之前重新创建句柄。

关于delphi - TPageControl 中的列表索引越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com