簡體   English   中英

列表索引超出TPageControl的范圍

[英]List index out of bounds in 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 ..有誰知道發生了什么? 我不知所措。

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

這里有一個很好的解釋(由Greg Chapman提供): TabSheet上的TabVisible和索引錯誤
對於將來的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之前重新創建TabVisible

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM