2009-08-17 6 views
14

Mi chiedevo perché Delphi (2007) fornisce tre widget che sembrano fare la stessa cosa e quali sono i vantaggi/svantaggi per ciascuno.TTabSet vs. TTabControl vs. TPageCtrl/TTabSheet?

Nello stesso argomento, se voglio visualizzare diversi gruppi di controlli, perché dovrei preferire ad esempio. PageControl + TabSheets + Frames, invece di visualizzare solo fotogrammi diversi direttamente sul modulo padre?

Grazie.

risposta

23

Dal Helpfile TTabSet:

controlli impostati Tab sono comunemente usati per visualizzazione a schede pagine all'interno di una finestra di dialogo. TTabSet è fornito per compatibilità con le versioni precedenti . Utilizzare il componente TTabControl nelle applicazioni Windows a 32 bit .

Quindi la vera domanda è, qual è la differenza tra TTabControl e TPageControl? La differenza è che TTabControl ha solo una "pagina", mentre TPageControl ha una pagina per ogni scheda. Questo li rende utili in diverse situazioni.

TPageControl è utile per le finestre di dialogo in cui si desidera inserire più UI sullo schermo rispetto a uno spazio sullo schermo per adattarlo. Organizzare l'interfaccia utente in categorie e inserire ciascuna categoria in un'unica pagina. Ad esempio, si vede molto questo schema nelle finestre di dialogo Opzioni.

TTabControl, d'altra parte, funziona bene per lavorare su un array/elenco di oggetti. Crea un'interfaccia per visualizzare e modificare le proprietà di un singolo oggetto e posizionarlo su un TTabControl, quindi creare una scheda per ciascun oggetto e impostare i gestori di eventi in modo che carichi un nuovo oggetto dall'array nei controlli ogni volta che cambia le schede.

Per quanto riguarda la domanda di frame, il motivo principale per utilizzare un TPageControl in combinazione con i frame è perché fornisce un modo predefinito per decidere quale frame visualizzare. In questo modo non devi reinventare un meccanismo per questo.

+0

Grazie Jim. Quindi TTabControl è una soluzione preferita quando si riempie una scheda con oggetti in fase di esecuzione, mentre un PageControl + TabSheets + Frame è un'opzione migliore quando si imposta l'interfaccia in fase di progettazione? – Gulbahar

+2

No. A TTabControl è la soluzione preferita quando si modificano le proprietà di un elenco di oggetti dello stesso tipo, poiché la modifica delle schede non modifica i controlli visualizzati, ma solo l'indice di tabulazione. Un controllo di pagina consente di inserire più di una pagina di controlli diversi su un modulo alla volta. (E Jim non ha scritto quella risposta, io l'ho fatto. Ne ha fatto una modifica.) –

+0

Grazie Mason, ha senso. Per il mio uso, sembra un PageControl + alcuni tabsheet, ognuno dei quali con una cornice è la soluzione preferita per quello che devo fare. – Gulbahar

5

Un metodo che ho utilizzato con grande successo è quello di utilizzare i frame con un TPageControl e di associare in ritardo i frame al tPageControl la prima volta che si seleziona la pagina. Ciò mantiene il tempo di caricamento del modulo verso il basso, non creando frame che non vengono mai visualizzati, ma consente comunque la flessibilità della creazione, lo stato viene mantenuto quando si passa da una scheda all'altra. Recentemente sono passato a utilizzare i moduli e incorporarli invece dei frame ... ma il concetto è lo stesso.

Lo stesso può essere fatto utilizzando un singolo "punto di montaggio" su un TTabControl e spegnendolo mentre la scheda viene cambiata, ma poi si presenta anche il problema di come gestire lo stato della scheda come le schede vengono rimandate indietro.

[EDIT] Viene fuori la domanda come gestisco la comunicazione tra il frame e il modulo padre. Questo in realtà è molto facile da fare usando le interfacce. Basta creare una nuova unità che sarà condiviso dal modulo e il telaio e aggiungere due interfacce:

type 
    IFormInterface = interface 
    [guid] 
    procedure FormProc; 
    end; 

    IFrameInterface = interface 
    [guid] 
    procedure SetFormController(Intf:IFormInterface); 
    end; 

hanno la forma implementare l'IFormInterface, e il telaio attuare l'IFrameInterface.Quando si fa clic su una scheda e mostrare una cornice, quindi eseguire codice simile al seguente:

var 
    FrameIntf : IFrameInterface; 
begin 
    if Supports(FrameObj,IFrameINterface,FrameIntf) then 
    FrameIntf.SetFormController(Self); 
end; 

l'implementazione cornice del metodo SetFormController sarebbe poi tenere sul riferimento passato, che le consentirebbe di chiamare verso l'alto nella forma .

procedure TFrame1.SetFormController(Intf:IFormInterface); 
begin 
    fFormController := Intf; 
end; 

Procedure TFrame1.Destroy; override; 
begin 
    fFormController := nil; // release the reference 
    inherited; 
end; 

Procedure TFrame1.Button1Click(Sender:tObject); 
begin 
    if fFormController <> nil then 
    fFormController.FormProc 
    else 
    Raise Exception.Create('Form controller not set'); 
end; 
+0

Grazie per il suggerimento. Quando hai utilizzato un PageControl e più fotogrammi, come hai controllato dal modulo padre su quale pulsante è stato fatto clic in quale frame? – Gulbahar

Problemi correlati