【问题标题】:Anchor does not work if set control position by code如果通过代码设置控制位置,则锚点不起作用
【发布时间】:2021-01-03 07:43:29
【问题描述】:

我正在使用 Delphi XE3。

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

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

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

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

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

但我希望看到的是:

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

更新

在我的理解中,anchor 是指控件边框和表单边框之间的距离是固定的,听起来像是一个锚点。所以右锚意味着edit2的右边框和form的右边框之间的距离是固定的。并且在修改edit2的左边框时,它的宽度也会自动改变,再次保持固定距离。

更新2

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

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

这和我理解的一样。

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

【问题讨论】:

  • 您已在“Update2”中回答了您的问题。您提到的两个句子都表明它必然会调整父级的大小。第一句不是“和你理解的一样”,也不是你写问题的时候理解的。

标签: delphi anchor


【解决方案1】:

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

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

只有当元素所在的容器(或组件)中任何与属性相关的位置被触发时,锚属性触发的操作才会发生。

您可以做的是在元素上方插入一个容器(布局)并将所有内容放入其中。当您需要更改时,您应该更改布局,而不是其中的元素。 Edit2 应该向左锚定,但 Edit1 不是。

【讨论】:

    【解决方案2】:

    锚点“右”对应于宽度(锚点“底部”对应于高度)。锚点通常需要父母。

    但是您没有更改父级的宽度,因此结果符合预期。如果您将锚点视为相对而非绝对,也许您会更好地理解它。

    【讨论】:

    • 如果“底部”对应高度,那么如果没有“顶部”锚点,会发生什么?我认为锚点意味着edit2边框和表单边框之间的距离是固定的。
    • 这并不矛盾:没有“左”锚意味着.Left 将在父级宽度更改时更改(前提是设置了“右”锚)。就像你不能自己设置“正确”一样(你只能设置.Left.Width)如果你触摸控件而不是它的父控件,锚点就没有效果。
    【解决方案3】:

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

    你可以通过写作得到你需要的东西:

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

    【讨论】:

    • 谢谢。我了解锚点与父表单有关。所以edit2的右边框应该锚定在窗体的右边框上,即使它的左边框改变了,它的右边框和窗体右边框的距离应该是不变的,即对应一个锚点。是这样吗?
    • @alancc 不,如果您在不更改宽度的情况下更改左侧位置,则情况并非如此,正如我在回答中显示的那样。有效的是,如果您更改表单的宽度,则锚点将起作用并相应地更改编辑的宽度:如果表单更改,右边框距离将保持不变。
    • @alancc 锚点仅在 parent 调整大小时适用。父级知道它的新尺寸,并将根据其锚点、边距、填充等调整其子级。因此,在这方面,您的编辑控件将按预期相应地拉伸。但是,如果您直接移动/调整子控件的大小,则该子控件的所有这些设置都将被忽略,它将被定位/调整到您告诉它的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2013-02-22
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多