2015-07-20 22 views
7

ich mit einem TPageControl steckte, das ein seltsames Verhalten zeigt ..Listenindex außerhalb der Grenzen in TPageControl

Die Steuerung verfügt über 3 Seiten, aber wenn ich

for I:=0 to PageControl.PageCount-1 do begin 
    PageControl.Pages[I].TabVisible := False; 
    PageControl.Pages[I].Visible := Ord(iColorScale.GenerationMode) = I; 
end; 

erhalte ich einen ‚Liste Index aus die zulässigen Bereich (3)‘Fehler, wenn die erste Zeile der ersten Iteration der Schleife entspricht

Ausführung
PageControl.Pages[0].TabVisible := False; 

Nun, wenn ich die Pagecontrol Eigenschaften im Debugger anzuzeigen scheint alles in Ordnung zu sein. Die PageCount ist voraussichtlich 3, und ich kann alle Seiten und ihre Eigenschaften, einschließlich TabVisible von Seite 0, im Evaluator

Ich benutze Delphi XE auf einem Windows 7-Rechner .. Hat jemand eine Idee, was ist geht es weiter? Ich bin ratlos.

+0

Was passiert, wenn Sie versuchen, 'PageControl.Pages [0] .TabVisible: = False;' außerhalb einer Schleife auszuführen? – Fenistil

+2

Versuchen Sie, 'PageControl.HandleNeeded' zu setzen, bevor Sie' TabVisible' auf false setzen. (http://www.delphigroups.info/2/d7/305018.html) – kobik

+0

@Fenistil Ich bekomme den gleichen Listenindex außerhalb der Grenzen Fehler beim Ausführen PageControl.Pages [0] .TabVisible: = False; außerhalb der Schleife –

Antwort

7

tldr: set PageControl.HandleNeeded vor der Einstellung TabVisible.

Es gibt eine gute Erklärung hier (von Greg Chapman): TabVisible on TabSheet and index error
Für zukünftige SO Referenz (copy/paste):

Wenn das Handle des Pagecontrol zerstört wurde (was kann passieren, wenn eine Eigenschaft in der Einstellung PageControl oder eines seiner übergeordneten Fenster verursacht einen Aufruf an RecreateWnd), das PageControl speichert die sichtbaren Registerkarten in einem TStringList (FSaveTabs). Einstellen TabVisible Ergebnisse in einem Aufruf dieser Routine:

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; 

Während des Gesprächs zu FPageControl.DeleteTab wird die Pagecontrol neu am Griff, wenn nötig. Dabei versucht es die sichtbaren Tabs mit FSaveTabs zurückzusetzen. Es kann jedoch verwechselt werden, da eine der Registerkarten, die zu FSaveTabs hinzugefügt wurde, jetzt unsichtbar ist (TabSheet.FTabShowing = false). Dies verursacht den IndexError. Die Lösung besteht also darin, sicherzustellen, dass das Handle neu erstellt wird, bevor TabVisible festgelegt wird.

Verwandte Themen