在我的控制高度自动调整后,如何使主窗体正确对齐,然后我最大化窗体?

时间:2015-06-09 14:45:54

标签: delphi alignment delphi-2009

这个我真的不知道如何解决它......

如何重现问题:

运行代码,然后缩小窗口,直到DriveBar的高度增加,然后最大化窗口。然后您可以注意到Panel1不再是顶部对齐的,并且这两个面板之间是空的空间。我试着打电话给Parent.Realign,但没有成功。你能帮我吗?

UnitMain.pas

unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ExtCtrls;

type

  TDriveBar = class(TCustomPanel)
  private
   procedure AutoHeight;
   procedure OnBarResize(Sender:TObject);
  public
   constructor Create(AOwner: TComponent); override;
   property Caption;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;
  Drives: TDriveBar;
  Panel1: TPanel;

implementation

{$R *.dfm}

//---------- TDriveBar --------------------------------

constructor TDriveBar.Create(AOwner: TComponent);
begin
 inherited;
 OnResize:=OnBarResize;
end;

procedure TDriveBar.OnBarResize(Sender: TObject);
begin
 AutoHeight;
 Parent.Realign;
end;

procedure TDriveBar.AutoHeight;
begin
 if Width<400 then Height:=100 else Height:=50;
end;

//---------- TForm1 -----------------------------------

procedure TForm1.FormCreate(Sender: TObject);
begin
  Drives:=TDriveBar.Create(Form1);
  Drives.Parent:=Form1;
  Drives.Caption:='DriveBar';
  Panel1:=TPanel.Create(Form1);
  Panel1.Parent:=Form1;
  Panel1.Caption:='Panel1';

  Panel1.Align:=alTop;
  Drives.Align:=alTop;
end;

end.

UnitMain.dfm

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 334
  ClientWidth = 618
  Color = clBtnFace
  DoubleBuffered = True
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
end

1 个答案:

答案 0 :(得分:4)

首先,永远不要让控件处理自己的事件属性。事件属性适用于组件的使用者,而不适用于开发人员。组件开发人员对OnResize事件的挂钩是受保护的Resize方法。如果您想了解OnResize相关事件,请重写。

我怀疑是您问题的根源,但是,您要在通知尺寸发生变化的事件中更改组件的大小。很可能是从表单的当前移动和大小控件尝试中调用它,并且表单尽其所能避免递归重新排列请求。

而是覆盖CanResize方法。它被称为控件的新尺寸。您可以通过返回False来调整维度或完全拒绝调整大小。一定要调用继承的方法。

function TDriveBar.CanResize(var NewWidth, NewHeight: Integer): Boolean;
begin
  if NewWidth < 400 then NewHeight := 100 else NewHeight := 50;
  Result := inherited CanResize(NewWidth, NewHeight);
end;