Delphi 如果按代码设置控制位置,则锚不工作

Delphi 如果按代码设置控制位置,则锚不工作,delphi,anchor,Delphi,Anchor,我正在使用delphixe3 我在表单中添加了两个TEdit控件,如下所示: 它们的锚定设置为[akLeft,akTop,akRight],这样当我调整表单大小时,编辑也会放大它们的大小 但是,如果我在代码中更改Edit2的位置,如下所示: procedure TForm1.按钮1点击(发送方:TObject); 开始 Edit2.Left:=Edit1.Left-10; 结束; 然后单击按钮1,我将看到以下内容: 但我希望看到的是: 因为Edit2的右边框被锚定到表单的右边框。为什么它

我正在使用delphixe3

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

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

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

procedure TForm1.按钮1点击(发送方:TObject);
开始
Edit2.Left:=Edit1.Left-10;
结束;
然后单击
按钮1
,我将看到以下内容:

但我希望看到的是:

因为
Edit2
的右边框被锚定到表单的右边框。为什么它不能像预期的那样工作

更新

据我所知,锚意味着控件边框和表单边框之间的距离是固定的,听起来像锚。所以右锚意味着edit2的右边框和表单的右边框之间的距离是固定的。当更改edit2的左边框时,其宽度也将自动更改,以再次保持固定距离

更新2

我重新阅读了帮助文档,其解释如下:

使用定位可确保控件相对于其父控件的边保持其当前位置,即使父控件已调整大小

这和我的理解是一样的


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

这是预期的行为。锚定与宿主组件相关,而不是组件本身

您可以通过以下方式获得所需:

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

这是预期的行为。锚定与宿主组件相关,而不是组件本身

您可以通过以下方式获得所需:

TForm1.Button1Click(Sender: TObject); 
begin 
  Edit2.Left := Edit1.Left - 10; 
  Edit2.Width := Edit2.Width + 10;
end;
锚定“右”对应宽度(锚定“底部”对应高度)。锚通常需要一个父节点

但是您没有更改父对象的宽度,因此结果与预期一致。如果您将锚定视为相对的,而不是绝对的,您可能会更好地理解它。

锚定“右”对应宽度(锚定“底部”对应高度)。锚通常需要一个父节点


但是您没有更改父对象的宽度,因此结果与预期一致。如果您将锚点视为相对的,而不是绝对的,也许您可以更好地理解它。

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

锚属性仅在调整其容器大小时起作用。更改元素位置时,它不起作用。使用左、顶、高度、填充等所做的操作与设计时的操作完全相同

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


您可以做的是在元素上方插入一个容器(布局)并将所有元素放入其中。当需要更改时,应该更改布局,而不是其中的元素。Edit2应向左锚定,但Edit1不应。手动更改位置不会触发锚定。通过代码执行此操作的行为与设计时相同

锚属性仅在调整其容器大小时起作用。更改元素位置时,它不起作用。使用左、顶、高度、填充等所做的操作与设计时的操作完全相同

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


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

谢谢。我知道anchor与父窗体相关。因此edit2右边框应与窗体的右边框固定,即使其左侧已更改,其右边框与窗体右边框之间的距离也应保持不变,即与固定相对应的距离。是这样吗?@alancc不,如果你像我在回答中所说的那样改变左边的位置而不改变宽度,那就不是这样了。有效的方法是,如果更改窗体的宽度,则定位将起作用,并相应地更改编辑的宽度:如果窗体更改,右边框距离将保持不变。@ALINC定位仅在父级调整大小时适用。父对象知道其新尺寸,并将根据其定位、边距、填充等调整其子对象。因此,在这方面,您的编辑控件将按预期进行相应拉伸。但是,如果您直接移动/调整子控件的大小,则该子控件的所有设置都将被忽略,它将被定位/调整到您指定的位置。谢谢。我知道anchor与父窗体相关。因此edit2右边框应与窗体的右边框固定,即使其左侧已更改,其右边框与窗体右边框之间的距离也应保持不变,即与固定相对应的距离。是这样吗?@alancc不,如果你像我在回答中所说的那样改变左边的位置而不改变宽度,那就不是这样了。有效的方法是,如果更改窗体的宽度,则定位将起作用,并相应地更改编辑的宽度:如果窗体更改,右边框距离将保持不变。@ALINC定位仅在父级调整大小时适用。父对象知道其新尺寸,并将根据其定位、边距、填充等调整其子对象。因此,在这方面,您的编辑控件将按预期进行相应拉伸。但是,如果您直接移动/调整子控件的大小,则该子控件的所有设置都将被忽略,它将被定位/调整到您指定的位置