2011-12-26 12 views
5

Tengo una forma con un TStatusBar, y la parte inferior alineado TPanel, una parte inferior alineado TSplitter y el cliente alineado TPanel, como se muestra en la siguiente captura de pantalla:TStatusBar con la parte inferior alineado panel de

Screen Shot 1 - Before - Good

(El divisor es de color rojo para que sea un poco más obvio)

Button1 simplemente aumenta la altura de Panel1 por 20:

Panel1.Height := Panel1.Height + 20; 

Pero cuando se hace clic en el orden de los controles cambia, con Panel1 soplar la barra de estado y el divisor ahora está cambiando el tamaño de la barra de estado.

Screen Shot 2 - After - Bad

Esto sólo ocurre cuando la altura de Panel1 se incrementa en más de la altura de StatusBar1 (19).

Supongo que esto se debe a tener dos controles alineados en la parte inferior, pero no sé cuál es la causa exacta del problema y cómo solucionarlo.

Actualmente estoy usando XE2, pero tengo el mismo problema con D2010.

En esta situación, ¿hay alguna manera de establecer la altura del Panel1 en un valor arbitrario, mientras se asegura de que los controles mantienen sus posiciones esperadas?

+0

Tenía la esperanza de que después de catorce años, Bo ... Impr ... Código G ... Embarcadero habría arreglado esto. –

Respuesta

5

Solucione el problema estableciendo la propiedad Superior para los controles después de cambiar la altura del panel.

StatusBar1.Top := Panel1.Top + Panel1.Height; 
+0

Una solución ingeniosamente simple. ¡Excelente! Gracias. – davea

3

probar este (funcionó bien para mí):

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Panel1.SetBounds(Panel1.Left, Panel1.Top - 20, 
        Panel1.Width, Panel1.Height + 20); 
end; 
+0

También una excelente solución. Gracias. – davea

2

Alternativamente, si no se desea realizar un seguimiento de dónde se está cambiando de posición/tamaño de los controles,

type 
    TForm1 = class(TForm) 
    .. 
    private 
    protected 
    procedure AlignControls(AControl: TControl; var Rect: TRect); override; 

.. 

procedure TForm1.AlignControls(AControl: TControl; var Rect: TRect); 
begin 
    inherited; 
    if AControl = Panel1 then 
    StatusBar1.Top := Panel1.Top + Panel1.Height; 
end; 
+0

Una excelente idea, pero solo estoy configurando la altura del panel en un solo lugar, así que puedo ir con algo más simple. Lo tendré en cuenta si las cosas cambian ... – davea

Cuestiones relacionadas