2013-04-17 97 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'的文檔來了解它們是如何工作的。 –