2015-07-20 19 views
7

mi sono bloccato con un TPageControl che espone alcuni comportamenti strani ..Lista fuori dai limiti in TPageControl

Il controllo dispone di 3 pagine, ma quando lo faccio

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

ho un 'indice di lista fuori limite (3)' errore durante l'esecuzione della prima riga della prima iterazione del ciclo equivalente a

PageControl.Pages[0].TabVisible := False; 

Ora, quando visualizzare le proprietà PageControl nel debugger, tutto sembra essere in ordine. Il PageCount è previsto 3, e posso vedere tutte le pagine e le loro proprietà, incluso TabVisible della pagina 0, nel valutatore

Sto usando Delphi XE su una macchina Windows 7. Qualcuno ha un'idea di cosa sia sta succedendo? Sono in perdita.

+0

Cosa succede se si tenta di eseguire 'PageControl.Pages [0] .TabVisible: = False;' al di fuori di un ciclo? – Fenistil

+2

Prova a impostare 'PageControl.HandleNeeded' prima di impostare' TabVisible' su false. (http://www.delphigroups.info/2/d7/305018.html) – kobik

+0

@Fenistil Ottengo lo stesso indice di lista fuori dai limiti di errore durante l'esecuzione di PageControl.Pages [0] .TabVisible: = False; fuori dal ciclo –

risposta

7

tldr: impostare PageControl.HandleNeeded prima di impostare TabVisible.

C'è una buona spiegazione qui (da Greg Chapman): TabVisible on TabSheet and index error
Per futuro SO di riferimento (copia/incolla):

Se la maniglia della PageControl è stata distrutta (che può accadere se l'impostazione alcune proprietà nel PageControl o una delle sue finestre parent causa una chiamata a RecreateWnd), PageControl salva le schede visibili in un TStringList (FSaveTabs). Impostazione TabVisible risultati in una chiamata a questa 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; 

Durante la chiamata al FPageControl.DeleteTab, il PageControl ricreerà il manico, se necessario. In tal modo, tenta di ripristinare le schede visibili utilizzando FSaveTabs. Tuttavia, può essere confuso perché una delle schede che ha aggiunto a FSaveTabs è ora invisibile (TabSheet.FTabShowing = false). Ciò causa l'errore IndexError. Pertanto, la correzione consiste nell'assicurarsi che l'handle venga ricreato prima di impostare TabVisible.