Delphi: Cómo ajustar mediante programación ordenamiento visual de componentes con align = alTop

StackOverflow https://stackoverflow.com/questions/1259849

  •  12-09-2019
  •  | 
  •  

Pregunta

Tengo un formulario con una serie de paneles, cada uno de los cuales tiene align = alTop, para que la pila hacia abajo muy bien desde la parte superior del formulario.

Sin embargo, quiero cambiar dinámicamente el orden de aparición de estos paneles - es decir, moverlos hacia arriba y hacia abajo. ¿Cuál es la mejor manera de hacer esto?

¿Fue útil?

Solución

Puede mover fácilmente un panel alineado arriba a la parte superior mediante el establecimiento de su Inicio propiedad a 0 . Para ello, a la inversa orden solicitada (panel inferior primero) y ya está.

Otros consejos

Moverlos la misma forma en que los mueve en tiempo de diseño con el ratón: Establecer propiedad Top del panel actual a uno menos que la propiedad Top del panel que desea estar por debajo del panel actual. La VCL se hará cargo del resto.

Si usted tiene que mover varios paneles, comenzar con BeginDeferWindowPos . Ajuste todos los paneles a lo coordenadas que desee con DeferWindowPos, y luego hacer que todos se mueven a la vez con EndDeferWindowPos.

Sugiero la construcción de un marco en el que se quita de forma dinámica / agrega las formas de / a su control de los padres. En general, el orden de la creación / adición es el orden visual, pero a partir de su pregunta entiendo que quiere que la orden cambia durante la vida útil de aplicación, por lo que sólo cambiando el orden de creación original no será suficiente.

Con el fin de cambiar el orden, trate de:

  1. ocultar los paneles
  2. Eliminar los paneles de su control de los padres
  3. Añadir los paneles de control a su padre en el nuevo orden que desee
  4. Mostrar los paneles

¿Qué tal probar un TGridPanel alineado arriba con una columna y n filas en lugar --- reordenar paneles con alineación superior es un poco de dolor, de verdad.

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

Si cambia la parte superior del panel del orden de cambio de panel de forma visual.

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

PANEL0
PANEL1
PANEL2
Panel3
PANEL4

OnClick caso de todos los paneles hacer esto:

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

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

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

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

El panel hasta 2 posiciones.

ha añadido: Si utiliza arrastrar y soltar, este tipo de eventos devuelven la posición (X e Y); Con la posición y la posición final original se puede calcular la parte superior de wew asign al panel.

excusa formulario de mi pobre Inglés. respecto

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

Sé que es una entrada antigua, pero básicamente me ayudó - la idea de establecer la propiedad superior a cero. No puedo utilizar la idea de establecer mediante programación la posición causa esto es hasta el usuario de la aplicación - que puede elegir para mostrar algunos gráficos en la aplicación y, a continuación, todos los paneles (padre) del los teecharts son alTop align. Me puse su propiedad superior a 0 en el orden inverso y después se acaba de establecer la verdadera visible o falsa según la entrada del usuario ...

Gracias.

panel3.Visible  := True;
panel3.Top      := 0;

panel2.Visible  := True;
panel2.Top      := 0;

panel1.Visible  := True;
panel1.Top      := 0;

Los últimos serán los primeros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top