如果通过代码设置控制位置,则锚点不起作用

Anchor does not work if set control position by code

我正在使用 Delphi XE3。

我在我的表单中添加了两个 TEdit 控件,如下所示:

它们的 Anchors 设置为 [akLeft, akTop, akRight],这样当我调整表单大小时,编辑也会放大它们的大小。

但是,如果我在代码中改变Edit2的位置,如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Left := Edit1.Left - 10;
end;

然后点击Button1后,我会看到这个:

但我希望看到的是:

因为 Edit2 的右边框锚定到表单的右边框。为什么它没有按预期工作?

更新

根据我的理解,锚点是指控件边框和窗体边框之间的距离是固定的,听起来像锚点。所以right anchor 意味着edit2 的右边界和form 的右边界之间的距离是固定的。并且改变edit2的左边框时,它的宽度也会自动改变,再次保持固定的距离。

更新2

我重新阅读了帮助文档,它对锚点的解释如下:

“使用锚点确保控件保持其相对于其父级边缘的当前位置,即使父级已调整大小。”

这和我理解的一样

但是,它强调“只有在调整父级大小时才会强制执行锚点”。这行似乎回答了我的问题,因为当我更改 Edit2.left 时,表格没有更改。所以此时锚点不起作用。

这是预期的行为。锚点与托管组件相关,而不是组件本身。

您可以通过以下方式获取您需要的内容:

TForm1.Button1Click(Sender: TObject); 
begin 
  Edit2.Left := Edit1.Left - 10; 
  Edit2.Width := Edit2.Width + 10;
end;

锚点“右”对应于宽度(锚点“底部”对应于高度)。锚一般需要 parent.

但是您没有更改 parent 的宽度,因此结果符合预期。如果你把锚点看成是相对的,而不是绝对的,也许你会更好地理解它。

手动更改位置不会触发锚点。通过代码执行此操作与设计时相同。

锚 属性 只在调整其容器大小时起作用。更改元素定位时不起作用。您对 left、top、height、padding 等所做的操作与设计时的行为完全相同。

锚 属性 触发的动作仅在元素所在的容器(或组件)中任何 属性 相关位置被触发时发生。

你可以做的就是在元素上面插入一个容器(布局),然后把所有的东西都放进去。当您需要更改时,您应该更改布局,而不是其中的元素。 Edit2 应锚定在左侧,但 Edit1 不应锚定。