这个我真的不知道如何解决它......
如何重现问题:
运行代码,然后缩小窗口,直到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
答案 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;