2

好的,我需要根据布局尺寸调整控件的大小。当布局尺寸发生变化时,我还需要它来调整大小(例如,将设备从配置文件转到横向)

我的假设是您只需检查设备的尺寸并进行相应调整

例如

if ClientHeight > ClientWidth then
    fHeader.Height:= ClientHeight Div 6
   else
    fHeader.Height:= ClientHeight Div 8;

然而,把这个放在哪里最好呢?

在调整布局大小之前和调整布局大小之后,我已经在 Resize 方法中尝试过它。它似乎不起作用!

好吧,它适用于表单的初始激活,但是当表单调整大小时,它不会。在 IDE 中,我什至必须点击 RELOAD 按钮才能使其工作。

下面是表单上有两个组件的示例。一个 TW3HeaderControl 与表单顶部对齐,一个 TW3ListBox 与客户端对齐。我想根据它是在 Profile 还是 Landscape 中调整 TW3HeaderControl 的高度

例如

unit Form1;


interface


uses 
  SmartCL.System, SmartCL.Graphics, SmartCL.Components, SmartCL.Forms, 
  SmartCL.Fonts, SmartCL.Borders, SmartCL.Application, SmartCL.Layout,
  SmartCL.Controls;


type
  TForm1 = class(TW3Form)
  private
    {$I 'Form1:intf'}
    fLayout: TLayout;
    fHeader: TW3HeaderControl;
    fList: TW3ListBox;
  protected
    procedure InitializeForm; override;
    procedure InitializeObject; override;
    procedure Resize; override;
  end;


implementation


{ TForm1 }

procedure TForm1.InitializeForm;
begin
  inherited;
  // this is a good place to initialize components
  fLayout:= Layout.Client([Layout.Top(fHeader), Layout.Client(fList)]);
end;


procedure TForm1.InitializeObject;
begin
  inherited;
  {$I 'Form1:impl'}
  fHeader:= TW3HeaderControl.Create(self);
  fList:= TW3ListBox.Create(self);
end;


procedure TForm1.Resize;
begin
  inherited;
  if assigned(FLayout) then
  begin
   fLayout.Resize(self);
    if ClientHeight > ClientWidth then
    fHeader.Height:= ClientHeight Div 6
   else
    fHeader.Height:= ClientHeight Div 8;
  end;
end;


initialization
  Forms.RegisterForm({$I %FILE%}, TForm1);
end.

我什至尝试覆盖“FormActivated”并将其放在那里并调用 Resize。

是什么赋予了?

更新!!!!!

而不是在 InitializeForm 中分配布局

例如

procedure TForm1.InitializeForm;
begin
  inherited;
  // this is a good place to initialize components
  fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6),fHeader), Layout.Client(fList)]);
end;

而是在 Resize 方法中分配它??

例如

procedure TForm1.Resize;
begin
  inherited;
   if ClientWidth > ClientHeight then
    fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6),fHeader), Layout.Client(fList)])
   else
    fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 8),fHeader), Layout.Client(fList)]);
   fLayout.Resize(self);

end;

更新#2

而且,如果我在表单上添加另一个控件,那么还有另一个问题:(

如果我将大小设置为静态值,效果很好

procedure TForm1.InitializeObject;
begin
  inherited;
  {$I 'Form1:impl'}


  fHeader:= TW3HeaderControl.Create(self);
  fHeader.Height:= 50;  //******************************
  fHeader.BackButton.Visible:= False;
  fHeader.Title.Caption:= 'Menu';
  fHeader.Title.AlignText:= taCenter;


  fFooter:= TW3HeaderControl.Create(self);
  fFooter.Height:= 50; //******************************
  fFooter.BackButton.Visible:= False;
  fFooter.Title.Caption:= 'Copyright (C) 2016';
  fFooter.Title.AlignText:= taCenter;


  fList:= TW3ListBox.Create(self);
end;

这行得通

procedure TForm1.InitializeForm;
begin
  inherited;
  // this is a good place to initialize components
  fLayout:= Layout.Client([Layout.Top(fHeader),
                           Layout.Bottom(fFooter),
                           Layout.Client(fList)]);
end;

但是,如果我在运行时根据尺寸动态设置高度,那么它不会

procedure TForm1.InitializeForm;
begin
  inherited;
  // this is a good place to initialize components
  fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6), fHeader),
                           Layout.Bottom(Layout.Height(ClientHeight Div 6),fFooter),
                           Layout.Client(fList)]);
end;
4

2 回答 2

3

浏览器强加给我们的一些规则,从对象帕斯卡的角度来看,似乎很奇怪。InitializeForm 与 InitializeObject 之间的区别就是其中之一。“形式”的奇特之处也是如此。

正如 John 所指出的,InitializeForm 是一个好地方。在构造 JS 对象并将 DOM 元素注入对象模型后调用该方法。这两个不是一回事,这可能有点令人困惑。此外,如果在调用 createElement() 或构造函数完成后创建元素,则取决于浏览器。因此,我们必须引入几个新过程来处理这个问题。

您可能想更深入地研究 TApplication 。您将找到以下内容:TApplication -> Display -> View。表单是在“视图”容器内创建的。每当方向改变或表单大小发生变化时,最快的通知方式是通过 Application.Display.View.OnReSize() 事件。

于 2016-12-30T11:21:47.640 回答
3

这有效

procedure TForm1.InitializeForm;
begin
  inherited;
  // this is a good place to initialize components
  fLayout:= Layout.Client([Layout.Top(fHeader),
                           Layout.Bottom(fFooter),
                           Layout.Client(fList)]);
end;
于 2016-12-29T00:30:31.367 回答