我正在尝试使编辑框在单击按钮时从300减去30,再次单击同一按钮时,使编辑框向上移动30到其原始位置。然而,当我点击按钮时,它每次向上移动30,我哪里出错了?这是我的代码,
procedure TfrmProject.Button3Click(Sender: TObject);
begin
if Edit1.Top = 300 then
Edit1.Top := Edit1.Top + 30 else
Edit1.Top := Edit1.Top - 30;
end;
编辑:我已经意识到由于我的表单很长而且有一个垂直滚动条,编辑框的顶部属性会响应我在表单上的位置而改变,即如果我在表单的顶部编辑框的顶级属性增加(编辑框靠近表单的底部),因此我的新问题是如何确保编辑框仅在2个固定点之间移动,如下面的编辑框在两点之间移动的最近建议它们之间的距离是30,但它们在表格上的位置会发生变化。
答案 0 :(得分:3)
这对我来说非常好。
创建一个新的Delphi VCL表单应用程序
在新表单上删除TEdit和TButton。设置Top' property of each to
50 using the
对象检查器。
双击Button1
,然后粘贴以下代码以替换新生成的TForm1.Button1Click
事件:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Top = 50 then
Edit1.Top := Edit1.Top + 30
else
Edit1.Top := 50;
end;
运行该应用程序。反复点击Button1
会使Edit1
从50
上下移动到80
。
这意味着您的比较是错误的。明确将Button1.Top
设置为原始坐标(代码中的300
),而不是缩小30
。
答案 1 :(得分:2)
然后Top
属性的原始设置不是300.或者由于编辑控件的约束,对齐或锚点设置或相邻控件的设置,不允许(完全)移动。
可能的解决方案:
当Top应该始终为300时:
将Edit1.Top
设置为300.并确保可以移动。
当299<顶部< 330:
将比较更改为:
if Edit1.Top < 330 then
当Top应该保持不动:
使用编辑控件的Tag
属性(或私有变量,或......)来记住它必须移动的方向:
procedure TForm1.Button1Click(Sender: TObject);
const
MoveNorth = 0;
MoveSouth = 1;
begin
if Edit1.Tag = MoveNorth then
Edit1.Top := Edit1.Top + 30 else
Edit1.Top := Edit1.Top - 30;
if Edit1.Tag = MoveNorth then
Edit1.Tag := MoveSouth else
Edit1.Tag := MoveNorth;
end;
使用Ken's solution 。
答案 2 :(得分:1)
这对你来说是一个小技巧。
在表单上放置一个没有标题的标签,Top属性设置为0,锚点设置为[akLeft,akTop]。使用该标签作为占位符,因此您始终可以知道表单顶部的位置。当它离开滚动顶部的屏幕时,Top属性实际上将变为负数。
现在,使用标签的Top属性作为起点,将编辑框放在距离顶部300像素处:
Edit1.Top := Label1.Top + 300;
这是简单的方法。我认为正确的方法是使用垂直滚动条的位置,如下所示:
Edit1.Top := 300 - Self.VertScrollBar.Position;