TForm 上的 Align 和 Anchor 属性有啥用?

Posted

技术标签:

【中文标题】TForm 上的 Align 和 Anchor 属性有啥用?【英文标题】:What use are the Align and Anchor properties on TForm?TForm 上的 Align 和 Anchor 属性有什么用? 【发布时间】:2012-09-30 11:16:12 【问题描述】:

可以在 TForm 上设置对齐方式,例如将一个表单设置为 alTop,将另一个表单设置为 alClient - 这两种表单以明显的方式占据了整个屏幕区域。在应用程序中这样做是否明智?

我还注意到锚点暴露在表单上 - 但我想不出它们有什么用处(分辨率更改?MDI 应用程序?)有什么想法吗?

编辑: 我创建了一个video about this post 以使事情更清楚。

【问题讨论】:

你可以模仿桌面边缘的任务栏,通过将Align 设置为,比如说,`alTop' 【参考方案1】:

您可以通过设置Parent 属性来像普通控件一样使用TForm

procedure TForm1.Button1Click(Sender: TObject);
begin
  frmEmbed:= TForm.Create(Self);
  frmEmbed.Parent:= Self;
  frmEmbed.Width:= 50;
  frmEmbed.Height:= 50;
  frmEmbed.Align:= alRight;
  frmEmbed.Anchors:= [akLeft, akBottom];
  frmEmbed.Visible:= True;
end;

您应该评论frmEmbed.Align:= alRight; 行以了解Anchors 属性的工作原理。


如果您对以上内容的使用感兴趣:没有标题栏的父表单是TFrame 的替代方案;框架在早期的 Delphi 版本中不可用,因此使用了父窗体。您可以在遗留代码中找到它们。

【讨论】:

我仍然在当前代码中使用嵌入式表单。是否有任何理由将重新育儿表格仅限于遗留代码?我发现将复杂的表单(通常是不同的标签页)拆分为多个表单而不是框架更容易。它帮助我保持逻辑拆分并限制我在任何一种表单上的控件数量。通常我将父级设置为选项卡并设置 Align := alClient.【参考方案2】:

您可以将一个表单放置在另一个表单中。不知道这会有多好。在 Delphi1 时代,有特殊的 3rd-party 控件来路由事件。今天,除了模式对话框之外,它似乎或多或少是开箱即用的。试试这样:

procedure TMainForm.Button1Click(...);
begin
  with TForm.Create(Self) do begin
       Caption := 'Internal one';
       Parent := Self;
       Visible := True;
  end;    
end;    

也许锚点和对齐在这个设置中是有意义的。 毕竟这似乎是如何实现新的“单窗口”IDE 布局的。

【讨论】:

【参考方案3】:

一个简单的例子是无标题的表单(例如 win-8 Metropolis 风格),您可以将退出按钮锚定在右上角。

但最好的用途是简化响应大小变化的复杂表单... 使用 akLeft 和 akRight,您可以使水平控件水平填充空间。使用所有 4 个锚点类似于将客户端设置为 alclient,只是不需要用其他面板包围它。

您可以使用锚点执行的大部分操作也可以使用多个面板来完成,但是随着表单变得越来越复杂,有时需要面板上的多个级别的面板会变得混乱。

当然,使用面板和锚点的组合通常是最好的答案。

【讨论】:

我想你可能对这个问题有些误解。我真的很喜欢 TForm 类上 Anchors / Alignment 属性的用处,即将表单定位在屏幕上 - 而不是使用它来定位表单上的控件。 你可能想撤回答案。【参考方案4】:

您可以将表单放置在任何其他容器组件中。

这对于对接很有用,f.i.您可以将表单停靠在页面控制选项卡中,或者任何地方。

这对于 TFrame 的替代方案也很有用:如果您将框架设计为 TForm 而不是 TFrame,则它在设计时不可嵌入,因此无法在设计时进行编辑/破坏编辑。

嵌入的 TFrame 可以在嵌入的形式中重新定义其属性或事件,这并不总是理想或实用的,尤其是当您希望框架易于升级或重构时。更改的嵌入框架属性最终会出现在 DFM 中,而不是 PAS 中,因此在编译时看不到,并且重构/重命名/等并不简单。

【讨论】:

以上是关于TForm 上的 Align 和 Anchor 属性有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

单击 TreeView 上的 ListView(在 TForm 上)会触发 TreeView OnChange 事件

[原创] Delphi Create(Application) 和 Create(nil) 的区别

vertical-align详解

将 TForm 分配给一个变量 Delphi 以在其他单元中使用

Delphi_子窗体继承父窗体后如何显示父窗体上的控件

Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP CVPR 2019