2010-12-12 64 views
0

我使用此代碼顯示形式的使者般彈出:爲什麼表單移動效果不是第一次發生?

TimeSleep := 5; 

    for i := 1 to FormHeight do 
    begin 
    Form.Top := Form.Top - 1; 

    Sleep(TimeSleep); 
    end 

它從第二次工作順利,但只。我的意思是我的窗體上有一個按鈕,調用該循環,並且第一次單擊窗體時突然沒有滑動效果。如果我再次點擊,效果起作用。

我如何從第一次開始工作?

謝謝。

+0

當你進行分配,以TimeSleep? – frogb 2010-12-12 11:45:16

回答

2

您沒有發佈足夠的代碼以確保它是正確的,但我認爲您的窗體在第一次單擊按鈕之前不可見或甚至沒有窗口句柄,因此窗體的移動不可見。如果你插入

Form.Show; 
Form.Update; 

之前循環的東西也應該第一次工作了。請注意0​​的呼叫,需要真正顯示上一行顯示的表單。

類似地,在循環內改變Top屬性之後,您應該插入一個對Update()的調用 - 它也可以調用Application.ProcessMessages(),但不會是這樣的大錘。每當有更好的方法時,儘量不要Application.ProcessMessages(),搜索堆棧溢出進行討論。建議

兩個多件關於你的循環:

  • 運動不會一帆風順如果有什麼使你Sleep()比你所要求的5毫秒以上 - 這是更好的計算量遞減從上次移動以來經過的時間的形式的頂部座標。

  • 任何人都無法看到你的表單以1個像素的增量移動 - 人眼和大腦速度不夠快,無法以這樣的速度收集和處理信息,甚至房間裏的貓和昆蟲也只會看到60左右更新你的顯示器在每秒鐘做。因此,參數爲Sleep()爲20或甚至50比5更明智。相應地調整窗體移動。

編輯:

下面是創建形式的不斷運動,即使不同的延遲一些示例代碼:

uses 
    MMSystem; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Frm: TForm; 
    TicksStart, TicksNow: Longword; 
    Progress: Single; 
begin 
    Frm := TForm.CreateNew(Self); 
    try 
    // slide a form of 600 by 500 pixel into view over a period of 100 millis 
    Frm.SetBounds((Screen.Width - 600) div 2, -500, 600, 500); 
    Frm.Show; 

    TicksStart := timeGetTime; 
    while True do begin 
     Sleep(15); 
     TicksNow := timeGetTime; 
     if TicksNow - TicksStart >= 1000 then 
     break; 
     Progress := (TicksNow - TicksStart)/1000; 
     Frm.Top := - Round((1.0 - Progress) * 500); 
    end; 
    Frm.Top := 0; 

    Sleep(500); 
    finally 
    Frm.Free; 
    end; 
end; 
+0

感謝您的提示。你說「計算從上一次移動以來經過的時間減少表格頂部座標的數量要好得多。」你能提供給我更正的代碼嗎?你是否認爲「相應地調整窗體移動」?我是Delphi的絕對初學者。 – emurad 2010-12-12 20:23:39

+0

@emurad:你的意思是你是*編程*中的絕對初學者? – 2010-12-12 21:07:21

+0

@emurad:我發佈了一些示例代碼,但考慮到你對安德烈亞斯的態度,我很想不這樣做。他的評論可能沒有幫助,但你的無禮仍然是完全不可接受的。 – mghie 2010-12-12 21:48:15

2

嘗試添加「Application.ProcessMessages;」睡覺前。

+0

非常感謝。它工作正常,但爲什麼在第一次調用時不自動處理消息? – emurad 2010-12-12 14:15:12

+0

@emurad:當然不是。正在線程中執行的代碼是您編寫的代碼。所以在你的程序循環中,如果你想處理消息,你必須自己做。 (提示:買一本關於Win32編程的書。) – 2010-12-12 14:50:42

相關問題