在FireMonkey中锚定GUI组件

7

我刚开始测试FireMonkey,但找不到一种方法来制作动态大小/定位的组件。

VCL有锚点属性,FM没有。

有人看到我错过了什么吗?

更新:

在FM中没有简单的锚定功能。您必须创建TLayouts并对齐它们,然后将控件放置在面板内使其“固定”。如果您使用较旧版本的Builder或Delphi,则这与我们以前必须使用TPanels的方式相同。


FMX.Types.TControl.Anchors,但它是私有的,因此不可用。 - David Heffernan
你可能想看一下 TLayout 组件。看起来你需要将它拖放到窗体上,进行配置,然后再将一些组件拖放到其中...只是猜测而已。 - Bob A
@Bob:对齐不等同于锚定。 - Gregor Brandt
@Gregor:没错。对于大多数用途来说,锚定都是很有意义的。可以进行动画等操作也没问题,但并不总是需要或想要这样做。锚点会很好。 - Rudy Velthuis
5个回答

11
这是你问题的答案。在VCL中,锚点属性显然已被Margins和Padding取代(由于性能考虑),我在XE2 wiki上找到了一些文档 (http://docwiki.embarcadero.com/RADStudio/en/FireMonkey_Application_Design)。我怀疑锚点是否会在以后被添加进来。要在窗体底部右侧锚定两个按钮(Ok和Cancel),请执行以下操作。请参见下面的图像以获取Ok和取消按钮。

enter image description here

在表单上放置一个与底部对齐的小面板,高度约为40。设置底部面板上的'边距'以创建一个更小的空间,使按钮可以生存,并确保将按钮对齐至右侧。例如,表单右边缘与最右边的按钮之间的间隙具有15个边距。顶部和底部的边距设为12。这锚定了最右边的按钮。

'内边距'是外边距的相反,内边距将空间放置在控件外。对于最右边的按钮,我在左侧添加了20个填充,这将是两个按钮之间的空间。对于第二个按钮,在第一个按钮左侧,我们只需要将其对齐属性设置为alRight,无需调整填充或边距。


我很想看这张图片,但它太小了,能否发布一个更大的版本? - Johan
1
我在想它是否太小了,所以我刚刚换成了一个更大的版本。 - rhody

8

在窗体上拖放多个TLayout组件,并按需配置它们的对齐属性。将其他组件拖放到这些布局中,并将它们的对齐属性相对于所包含的TLayout进行设置。这对我来说似乎很有效...


这是关于组件对齐而非组件锚定的。例如,如果我需要一个“确定”按钮保持相同的大小但随着窗口调整而向右下方移动,那么对齐并不能实现这一点。 - Gregor Brandt
@Gregor 或许我只是不理解... 如果我在窗体上放置一个 TLayout 并将其对齐方式设置为 alBottom,然后在 TLayout 上放置一个 TButton 并将其对齐方式设置为 alRight,它会很好地跟随窗体的调整大小。 - Bob A
这似乎可以工作,但会让GUI设计变得很麻烦。简单的锚定已不再可用,现在我必须创建TLAyouts。这就像旧日子里使用TPanels来让物品停留在你想要的位置。欢迎来到1990年代。 - Gregor Brandt
4
@Gregor- 简单的定位可能无法与新的FireMonkey框架的缩放、动画和3D特性兼容,需要进行改进。 - Bob A
@Bob A:为什么不呢?很明显有些效果不应该结合使用,因此固定应该不与动画效果结合使用。在我看来这是常识。 - Rudy Velthuis
@Rudy - 我只是凭我的猜测...我今天下午只有4个小时的时间来玩FireMonkey。但我可以告诉你,我被它的潜力震撼了。我认为每个参与其中的人都在这个Delphi版本的发布中做得非常出色。 :) - Bob A

5
这里是您要找的答案:FMX控件没有锚点。
我想这将成为“下一个版本”的功能。

2
这有点让Firemonkey变得无用了。不,我得换一种说法,它让Firemonkey变得无用了。 - Gregor Brandt
他们在所谓的“猴子生意 - FireMonkey”中。 - user497849
1
这是不正确的,使用边距和填充,它在维基文档中有解释。虽然不像锚点那样显而易见,但它们确实起作用。请参阅下面的答案。 - rhody
正确,不是无用的,只是更难。 - Gregor Brandt

1
快速查看 align 属性会发现在前几个 Delphi 版本中我们有更多的选择。

enter image description here

这不是部分地解决了你的问题吗?
我记得很长一段时间内,仅使用嵌套的 panelalign 来布局就可以满足我的需求。


这不是一个巨大的倒退吗?我必须嵌套TLayouts来获取锚定。如果我回忆起我的Builder 5时代,那真是一件非常痛苦的事情。 - Gregor Brandt
1
是的,但至少这并不意味着Firemonkey没有用处,它只意味着有改进的空间。每个人都在喊着立即发布所有承诺的功能。它甚至在文件中(请参见http://docwiki.embarcadero.com/VCL/XE2/en/FMX.Types.TControl.Anchors),但我想他们还没有解决所有错误,所以他们将这些锚点设为私有。时间会证明一切都是对的。就我而言,我很高兴有机会为iOS编写代码(在那里没有调整大小的情况下:-)。 - Johan
“这不是一个巨大的倒退吗”……噢,别这样——如果你还没有准备好尝试新东西,那就继续使用VCL吧。Firemonkey有很多优秀的功能,而且这是它的第一个版本……当然还存在一些问题……但在我看来远非无用。 - jpfollenius

0

你可以使用LiveBindings和表达式来根据父控件设置控件的属性,但这需要很多工作。

否则,使用边距和填充(就像HTML/CSS一样)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接