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) 的区别