2013-04-17 42 views
-2

我为编写这样一个糟糕的标题而道歉,请问您能编辑它,以便其他人明白我的意思吗?我将解释:如何让形状在特定位置自动移动,坐标坐标

我想在特定位置移动一个形状,例如从x:= 1000到x:= 600。 但是,如果我写:

shape1.left:=600; 

将形状从1000(起始位置)移动到600,但我不希望它跳400毫米,而是先去992,然后184,然后176让人们可以看到它实际上正在移动。

我尝试使用命令(睡眠),但它没有工作,也许这还是跳400毫米:

Shape1.Left:=1000; 
sleep (50); 
shape1.Left:=992; 
sleep (50); 
... 
... 

感谢

+1

使用计时器。永远不要使用睡眠。 –

+0

我完全同意@TLama。有关示例重新设计,请参阅[此答案](http://stackoverflow.com/questions/7223678/delphi-moving-overlapping-tshapes)。 –

+1

它不起作用的原因是您的表单没有机会处理过程中的窗口消息。请改用计时器。 –

回答

5

永远不要使用Sleep在主线程。它阻止了你的应用程序GUI线程,这是一个严重的失礼。

而是在表单上放置一个计时器。然后写一个像这样的定时器处理程序:

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Shape1.Left := Shape1.Left - 5; 
end; 

定时器事件处理程序以固定间隔执行。每次计时器打勾您更新形状的位置。

您可能需要将计时器间隔设置得相当低,以便动画显示平滑。例如,尝试100ms。

而且当形状达到其目标时,您可能还想禁用定时器。

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Shape1.Left := Shape1.Left - 5; 
    if Shape1.Left<=ShapeTargetLeft then 
    Timer1.Enabled := False; 
end; 
+0

嗯,它仍然将形状移动到-5,跳过这么多的坐标,我如何让它减速,以便用户将能够看到它实际上正在移动? –

+0

您的意思是:Shape1.left:= -1 Shape1.left:= -2 Shape1.left:= -3 Shape1.left:= -4 ....如果您的意思是...这不起作用 –

+1

否I不是那个意思。我的意思是我写的。我添加了一个句子来解释更多。也许你可以阅读'TTimer'的文档来了解它们是如何工作的。 –