2009-08-11 19 views

Respuesta

26

Es fácil mover un panel alineado arriba a la parte superior estableciendo su propiedad Top a . Haga esto en orden inverso solicitado (el panel inferior primero) y listo.

+1

A veces, si asigna un valor negativo, funcionará mejor. Me funcionó de esta manera. – HOPE

1

Sugiero crear un marco donde elimine/agregue dinámicamente los formularios desde/hasta su control principal. En general, el orden de creación/adición es el orden visual, pero entiendo por su pregunta que desea que la orden cambie durante la vida útil de la aplicación, por lo que no bastará con cambiar el orden de creación original.

Para cambiar el orden, tratar:

  1. Ocultar los paneles
  2. retirar los paneles de su control de los padres
  3. Añadir los paneles para su control de los padres en el nuevo orden que desee
  4. Mostrar los paneles
1

¿Qué tal probar un alineado arriba TGridPanel con una columna y n filas en su lugar --- reordenar paneles alineados en la parte superior es un poco molesto, de verdad.

(Nota: TGridPanel está disponible en Delphi 2007 y posteriores, si no recuerdo mal).

+0

Buena idea, pero mis paneles no son en realidad coloca directamente en un formulario - que está en otro componente tipo panel que da un efecto de fondo, y el TGridPanel lo oculta. para mantener la pregunta simple, no mencioné esta sutileza ... – Roddy

+0

¿No puedes establecer 'TGridPanel.ParentBackground' en' True'? Pensé que los descendientes de 'TPanel' podrían ser transparentes de esta manera ... – onnodb

1

Si cambia la parte superior del panel, cambia el orden del panel visual.

Prueba este (todos los paneles alineados alTop y con la misma altura):

PANEL0
PANEL1
PANEL2
Panel3
PANEL4

En OnClick caso de todos los paneles haga esto:

TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2; 

Si hace clic en un panel, se mueve hacia arriba en una posición.

Esa es la idea. Cambiar los X píxeles superiores.
Al mismo tiempo, si usted hace esto:

TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2; 

El panel de hasta 2 posiciones.

AGREGADO: Si usa Arrastrar & Descartar, este evento devuelve la posición (X e Y); Con la posición original y la posición final, puede calcular la parte superior para asignar al panel.

Disculpe de mi pobre inglés. respecto

6

los mueven de la misma manera que te mueves en tiempo de diseño con el ratón: conjunto de propiedades del panel actual Top a uno menos que la propiedad Top del panel que desea estar por debajo del panel actual. El VCL se encargará del resto.

Si tiene que mover varios paneles, comience con BeginDeferWindowPos. Ajuste todos los paneles a las coordenadas que desee con DeferWindowPos, y luego haga que todos se muevan a la vez con EndDeferWindowPos.

+0

Bien, no sabía acerca de' DeferWindowPos'. [¿Pero no es más fácil 'DisableAlign'/'EnableAlign' luego] (http://stackoverflow.com/a/15625706/757830)? – NGLN

+0

@Ngln, con 'DeferWindowPos', la ventana no se mueve en realidad hasta que se invoca' EndDeferWindowPos'. Si está moviendo muchas ventanas, eso ayuda a evitar el parpadeo ya que las posiciones de algunas ventanas se actualizan antes de que las demás se hayan movido. Por lo que puedo decir, 'DisableAlign' no evita que los controles se muevan a ninguna parte, solo la aplicación de alineación de los padres. No puedo juzgar cuál es mejor. –

0

Sé que es una publicación anterior, pero básicamente me ayudó - la idea de establecer la propiedad superior a cero. No puedo utilizar la idea de establecer programáticamente la posición porque esto depende del usuario de la aplicación; puede elegir mostrar algunos gráficos en la aplicación y luego, todos los paneles (padres) de los teecharts se alinean en la parte superior. Establecí su propiedad superior en 0 en el orden inverso y luego solo establecí la opción de verdad verdadera o falsa según la entrada del usuario ...

Gracias.

0

He utilizado el siguiente código:

procedure Show_Hide (Flag_Show : boolean); 
begin 
    if Flag_Show then 
    begin 
    with Panel_1 do begin Align := alTop; Visible := true; end; 
    with Panel_2 do begin Align := alTop; Visible := true; end; 
    with Panel_3 do begin Align := alTop; Visible := true; end; 
    with Panel_4 do begin Align := alTop; Visible := true; end; 
    end else 
    begin 
    with Panel_1 do begin Visible := false; Align := alNone; end; 
    with Panel_2 do begin Visible := false; Align := alNone; end; 
    with Panel_3 do begin Visible := false; Align := alNone; end; 
    with Panel_4 do begin Visible := false; Align := alNone; end; 
    end; 
end; 

según mi deseo Panel_1 Panel_2 Panel_3 Panel_4

Cuestiones relacionadas