如果通过代码设置控制位置,则锚点不起作用
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 不应锚定。
我正在使用 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 不应锚定。