TStatusBar с выровненной нижней панелью - PullRequest
5 голосов
/ 27 декабря 2011

У меня есть форма с TStatusBar и выравниванием снизу TPanel, выравниванием снизу TSplitter и выравниванием клиента TPanel, как показано на следующем снимке экрана:

Screen Shot 1 - Before - Good

(разделитель окрашен в красный цвет, чтобы сделать его немного более заметным)

Button1 просто увеличивает высоту Panel1 на 20:

Panel1.Height := Panel1.Height + 20;

Но при нажатии порядок элементов управления меняется, когда Panel1 уносит строку состояния, а сплиттер меняет ее размер.

Screen Shot 2 - After - Bad

Это происходит только тогда, когда высота Panel1 увеличивается больше, чем высота StatusBar1 (19).

Полагаю, это вызвано наличием двух выровненных элементов управления снизу, но я не знаю, как именно причина проблемы и как ее обойти.

В настоящее время я использую XE2, но у меня та же проблема с D2010.

В этой ситуации есть способ установить высоту Panel1 в произвольное значение, при этом гарантируя, что элементы управления сохранят свои ожидаемые позиции?

Ответы [ 3 ]

5 голосов
/ 27 декабря 2011

Обойдите проблему, установив свойство Top для элементов управления после изменения высоты панели.

StatusBar1.Top := Panel1.Top + Panel1.Height;
3 голосов
/ 27 декабря 2011

Попробуйте это (отлично сработало для меня):

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.SetBounds(Panel1.Left, Panel1.Top - 20,
                   Panel1.Width, Panel1.Height + 20);
end;
2 голосов
/ 27 декабря 2011

В качестве альтернативы, если вы не хотите отслеживать, где вы меняете положение / размер элементов управления,

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;
...