2011-04-27 9 views
6

Tengo varios TPanel en mi formulario principal que muestro u oculto dependiendo de las opciones que el usuario seleccione. El problema es que en el momento del diseño tengo que moverlos constantemente para editarlos. ¿Hay alguna manera más fácil/mejor para que otros manejen esta situación?¿Cómo se manejan múltiples TPanel's en tiempo de diseño?

Respuesta

10

Si sólo hay un panel es visible a la vez, entonces podría querer usar un TPageControl para organizar cosas. Puede hacer clic en las pestañas para seleccionar cuál trabajar en el momento del diseño, y luego ocultar las pestañas en tiempo de ejecución u ocultar las pestañas todo el tiempo y seleccionar páginas configurando the ActivePage property.

+1

+1 segundo esto. Es, de lejos, una mejor forma de organizar los controles. Si no necesita los encabezados de las pestañas, puede crear su propia descendencia, o usar algunas ya desarrolladas y configurar el Tabheight = 0 en el tiempo de ejecución. – Simon

+0

Uso este método y funciona bien. –

+0

La desventaja de esto, si lo entiendo correctamente, es que habrá más espacio en el contenedor en tiempo de ejecución que en el momento del diseño. Entonces, si tienes un diseño de tamaño fijo, no funcionará bien. ¿O tengo el extremo equivocado del palo? –

3

Si los paneles están apilados, puede reordenarlos haciendo clic con el botón derecho en uno y seleccionando Control->Bring to Front o Control->Send to Back en el menú contextual.

4

Usa el Structure Pane para encontrar el que deseas, y luego llévalo al frente.

Structure pane http://edn.embarcadero.com/article/images/33289/8.png

(Pero no seguir el ejemplo de Embarcadero arriba; dar a sus controles nombres significativos por lo que sus controles son más fáciles de distinguir.)

+1

+1; Me gusta de esta manera principalmente con controles completamente superpuestos. Simplemente seleccione el elemento, haga clic con el botón derecho y presione las teclas O + F para llevar el control al frente. –

1

También he usado un TPageControl, y mantuve las pestañas visibles en designtime. Esto me dio una usabilidad de tiempo de diseño (haciendo clic en las pestañas que quiero). Luego, en tiempo de ejecución, oculto las pestañas de la página y cambio las páginas activas en el control de página usando el código, como una forma de cambiar qué panel es visible. Sin embargo, esto condujo a formas terriblemente enormes y complicadas, que a su vez causaron muchos problemas.

Para su caso, le sugiero que considere refactorizando cada panel en su propio formulario o marco. Mi preferencia sería usar Formularios, no marcos, y las razones para esto son bien conocidas y bien documentadas en el mundo Delphi.

En mis aplicaciones mejor estructuradas, cada "panel" (implementando utilizando TForm, sin embargo, no TFrame) se divide en unidades diferentes, lo que resuelve los problemas de control de tiempo de diseño y también da como resultado solución global estructurada.

Aunque creo que el Panel de Estructura (alguien más lo señaló) es de gran ayuda para usted, cuando desea trabajar con formularios que son tan complejos que las herramientas visuales de diseño regulares comienzan a ser más difíciles de usar, también es Es una buena idea considerar romper su forma, cuando llegue a este punto de "rendimientos decrecientes" al usar el Diseñador de formularios, en lo que se está convirtiendo en una forma súper súper complicada.

2

selecciono el marco o panel utilizando el inspector de objetos Combo continuación, en el menú principal, haga clic en Editar -> Traer al frente

(que es similar a la apertura de la vista de la estructura)

1

es mucho más fácil usar marcos para este propósito. Normalmente los creo en tiempo de ejecución y los agrego al formulario según sea necesario. También tiende a hacer que el código sea mucho más legible porque puedes usar los mismos nombres de componentes (por ejemplo, ed_Name o l_Welcome) en diferentes marcos sin tener conflictos de nombres en lugar de tener ed_NameForPanel1, ed_NameForPanel3 etc.

3

Una advertencia que he encontrado cuando haciendo Panel1.Visible: = false en tiempo de ejecución es que se equivoca con el diseño.
obras La solución que he encontrado es que hacer:

//Design time 
//----------- 
Panel1.BevelOuter:= bvNone; //Make the panel look flat. 

//Run time when hiding the panel 
//------------------------------ 
procedure HidePanel(APanel: TPanel); 
var 
    H,W: integer; 
begin 
    case APanel.Align of 
    alTop, alBottom: begin 
     APanel.Tag:= Max(APanel.Tag, APanel.Height); 
     APanel.Height:= 1; 
    end; {alTop, alBottom:} 
    alLeft, alRight: begin 
     APanel.Tag:= Max(APanel.Tag, APanel.Width); 
     Panel1.Width:= 1; 
    end; {alLeft, alRight:} 
    alNone: begin 
     H:= Max(APanel.Tag and $FFFF, APanel.Height); 
     W:= Max((APanel.Tag shl 16) and $FFFF0000, APanel.Width shl 16); 
     APanel.Tag:= (H or W); 
     APanel.Height:= 1; 
     APanel.Width:= 1; 
    end; {alNone} 
    //alClient: do nothing 
    end; 
end; 

//Run time when restoring the panel 
//--------------------------------- 
procedure UnhidePanel(APanel: TPanel); 
var 
    H,W: integer; 
begin 
    case APanel.Align of 
    alTop, alBottom: begin 
     APanel.Height:= APanel.Tag; 
     APanel.Tag:= 0; 
    end; {alTop, alBottom:} 
    alLeft, alRight: begin 
     APanel.Width:= APanel.Tag; 
     APanel.Tag:= 0; 
    end; {alLeft, alRight:} 
    alNone: begin 
     H:= APanel.Tag and $FFFF; 
     W:= APanel.Tag shr 16; 
     APanel.Height:= H; 
     APanel.Width:= W; 
     APanel.Tag:= 0; 
    end; {alNone} 
    //alClient: do nothing 
    end; {case} 
end; 

simplemente ocultar los paneles pueden echar a perder la alineación cuidadosa que ha construido en tiempo de diseño
(especialmente cuando se utiliza divisores.).
Este código impide que eso suceda.
Realmente solo funciona visualmente cuando el panel no tiene biseles configurados y el color del panel es igual al color del control sobre el que se encuentra.

Cuestiones relacionadas