2010-12-16 8 views
0

對於Delphi中的編程練習,我想每次在屏幕上滾動一個像素1個像素,並在每次移動它時重新繪製它,因此它看起來像實際上正在移動。目前德爾福只是在開始和結束時繪製它,所以它不光滑。我嘗試重繪並且刷新,但都沒有工作。我也試着讓它看得見,看不見它會起作用,但沒有運氣。德爾福 - 如何移動控件並刷新它

image1.Visible := true; 
for i := 0 to 50 do 
begin 
    image1.Visible := false; 
    image1.Left := image1.Left + 1; 
    image1.Repaint(); // this doesn't work... 
    for j := 0 to 1000000 do 
    begin 
     k := i + j; // do nothing code 
    end; 
    image1.Visible := true; 
end; 

有誰知道我錯過了什麼?謝謝。

+0

說到醜陋:繁忙循環不會丟失。 – 2010-12-17 01:49:15

回答

4
procedure TForm1.FormClick(Sender: TObject); 
var 
    i: integer; 
begin 
    for i := 0 to 50 do 
    begin 
    image1.Left := image1.Left + 1; 
    Application.ProcessMessages; 
    sleep(100); 
    end; 
end; 

你也可以做Image1.Update代替Application.ProcessMessages但隨後的應用程序將停止響應Windows消息;因此,它會「凍結」。無論如何,這是一個非常醜陋的做動畫(非常醜陋!),但如果它只是一個練習,然後...

+0

謝謝。這工作。我知道它會閃爍,看起來很醜,但那是Windows。 – 2010-12-16 14:46:54

+5

@Thomas O:不,那不是Windows。這只是糟糕的編程......(對不起)如果你真的想做動畫,你應該手動(使用GDI)做所有的繪圖,而不是移動一個可視化的VCL控件!另外,你應該使用雙緩衝。如果你需要更高級的渲染,你可以使用OpenGL。我在Delphi中做了很多3D圖形和動畫。有關幾個示例,請參閱www.algosim.se。另外,動畫中的觸發事件應該是定時器消息的一部分,而不是for循環。這會以某種方式凍結應用程序。 (嘗試在圖像移動時關閉窗口。) – 2010-12-16 14:49:33

+0

@Thomas O:不,那不是「那是Windows」。這是你做錯事。只是你知道,可以正確地做到這一點,以便圖像不閃爍。 GDI圖形雖然沒有硬件加速那麼快,但仍然是繪製東西的可行方法。 – himself 2010-12-16 14:50:44

5

一個更好的方法來做到這一點是使用一個計時器。在Delphi中,這意味着類TTimer的對象。每次定時器啓動時,您只需增加Left屬性。您可能需要一個計時器,一旦它啓動了多次,您就可以禁用計時器。

+1

+1我剛剛添加到我的評論上面。而且,最重要的是,您不應該通過移動視覺控件來做動畫! – 2010-12-16 14:52:49