2009-08-17 12 views
14

Me preguntaba por qué Delphi (2007) proporciona tres widgets que parecen hacer lo mismo, y cuáles son las ventajas/desventajas para cada uno.TTabSet vs. TTabControl vs. TPageCtrl/TTabSheet?

Sobre el mismo tema, si quiero mostrar diferentes conjuntos de controles, ¿por qué debería preferir, por ejemplo? PageControl + TabSheets + Frames, en lugar de simplemente mostrar diferentes marcos directamente en el formulario principal?

Gracias.

Respuesta

23

Desde el archivo de ayuda en TTabSet:

controles de juego de separadores se utilizan comúnmente para pantalla con pestañas páginas dentro de un cuadro de diálogo . TTabSet se proporciona para la compatibilidad con versiones anteriores . Utilice el componente TTabControl en aplicaciones de Windows de 32 bits.

Entonces, la verdadera pregunta es, ¿cuál es la diferencia entre TTabControl y TPageControl? La diferencia es que TTabControl solo tiene una "página", mientras que TPageControl tiene una página para cada pestaña. Esto los hace útiles en diferentes situaciones.

TPageControl es útil para los cuadros de diálogo en los que desea colocar más IU en la pantalla de lo que tiene espacio de pantalla para encajar. Organice su UI en categorías y coloque cada categoría en una página. Ve este patrón mucho en los cuadros de diálogo Opciones, por ejemplo.

TTabControl, por otro lado, funciona bien para trabajar en una matriz/lista de objetos. Cree una interfaz de usuario para visualizar y editar las propiedades de un solo objeto y colóquela en un TTabControl, luego cree una pestaña para cada objeto y configure los controladores de eventos para que cargue un nuevo objeto de la matriz en los controles siempre que cambiar pestañas.

En cuanto a la pregunta de marcos, la razón principal para utilizar un TPageControl junto con marcos es porque proporciona una forma preconstruida para decidir qué marco mostrar. De esa manera no tienes que reinventar un mecanismo para ello.

+0

Gracias Jim. Entonces, ¿TTabControl es una solución preferida cuando se llena una pestaña con objetos en tiempo de ejecución, mientras que un PageControl + TabSheets + Frames es una mejor opción cuando se configura la UI en el momento del diseño? – Gulbahar

+2

No. A TTabControl es la solución preferida al editar las propiedades de una lista de objetos del mismo tipo, ya que cambiar las pestañas no cambia los controles que ve, solo el índice de pestañas. Un control de página es para poner más de una página en diferentes controles en un formulario a la vez. (Y Jim no escribió esa respuesta; lo hice. Le hizo una edición.) –

+0

Gracias Mason, tiene sentido. Para mi uso, parece un PageControl + algunas hojas de pestañas, cada una con un marco es la solución preferida para lo que tengo que hacer. – Gulbahar

5

Un método que he utilizado con gran éxito es utilizar marcos con un TPageControl y vincular tarde mis marcos a tPageControl la primera vez que se selecciona la página. Esto mantiene el tiempo de carga de formulario bajo, al no crear marcos que nunca se visualizan, pero aún así permite la flexibilidad de crearse, el estado se mantiene al cambiar entre pestañas. Recientemente cambié a usar formularios e incrustarlos en lugar de marcos ... pero el concepto es el mismo.

Lo mismo se puede hacer utilizando un solo "punto de montaje" en un TTabControl y cambiándolo a medida que se cambia la pestaña, pero luego surge el problema de cómo lidiar con el estado de las pestañas cuando se cambian las pestañas.

[EDIT] Surge la pregunta de cómo manejar la comunicación entre el marco y el formulario principal. Esto en realidad es muy fácil de hacer usando interfaces. Basta con crear una nueva unidad que será compartido por la forma y el marco y añadir dos interfaces:

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

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

tienen la forma implementar el IFormInterface, y el marco de la implementación del IFrameInterface.Al hacer clic en una pestaña y mostrar un marco, a continuación, ejecutar código como el siguiente:

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

su puesta en práctica del marco del método SetFormController entonces retener la referencia pasado, lo que le permitiría a llamar hacia arriba en la 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

Gracias por la sugerencia. Cuando utilizó un PageControl y varios marcos, ¿cómo verificó desde el formulario principal en qué botón se hizo clic en qué marco? – Gulbahar

Cuestiones relacionadas