尝试通过单击按钮使Editbox上下移动

时间:2012-03-20 22:40:00

标签: delphi delphi-7

我正在尝试使编辑框在单击按钮时从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,但它们在表格上的位置会发生变化。

3 个答案:

答案 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会使Edit150上下移动到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;