2011-12-26 34 views
5

我有一个TStatusBar形式,并且底部对齐TPanel,底部对齐TSplitter和客户端对齐TPanel,如图以下截图:TStatusBar与底部对齐面板

Screen Shot 1 - Before - Good

(分离器是染成红色,以使其更有点明显)

Button1的只是由20增加Panel1的高度:

Panel1.Height := Panel1.Height + 20; 

但是当点击时,控件的顺序会改变,Panel1正在吹动状态栏,分离器现在正在调整状态栏的大小。

Screen Shot 2 - After - Bad

这仅当Panel1的的高度超过StatusBar1中的高度(19)增加了发生。

我认为这是由两个底部对齐的控件造成的,但我对这个问题的确切原因以及如何解决这个问题感到不知所措。

我目前正在使用XE2,但我与D2010有同样的问题。

在这种情况下,有没有办法将Panel1的高度设置为任意值,同时确保控件保持其预期位置?

+0

我希望在十四年后,Bo ... Impr ... Code G ... Embarcadero会修正这个问题。 – 2014-12-18 21:39:26

回答

5

在更改面板高度后,通过设置控件的Top属性解决该问题。

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

狡猾的简单解决方案。优秀!谢谢。 – davea 2011-12-27 18:03:20

3

尝试这(对我工作的罚款):

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

也是一个很好的解决方案。谢谢。 – davea 2011-12-27 18:03:40

2

另外,如果你不想跟踪控制在你改变位置/大小的,

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

一个绝妙的想法,但我只在一个地方设置面板高度,所以我可以更简单一些。如果事情发生变化,我会记住它... – davea 2011-12-27 18:04:30