問個小問題...如何讓form create後停留5秒再自動free |
答題得分者是:P.D.
|
melt
一般會員 發表:9 回覆:6 積分:3 註冊:2003-07-12 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
簡單、有效的延時
在程式程式碼中有時要用到延時,在要求不高的情況下,有一個簡單的API函數 Sleep() 可供使用,但問題是如果使用 Sleep(),則不僅你的程式,就連繫統也被掛起了。所以我們要另想辦法,這時想到了函數 GetTickCount() ,這個函數用於獲取自 windows 啟動以來經歷的時間長度(毫秒) ,在這裡我們變通一下就可以用了:
Procedure Delay (Msecs : Integer);
var
FirstTickCount : real;
begin
FirstTickCount := GetTickCount;
Repeat
Application.ProcessMessages;
Until ((GetTickCount - FirstTickCount) >= LongInt (Msecs));
end;
在你的程式中調用上面這個自定義程序,和 Sleep() 比較一下,那個更好呢? 網海無涯,學無止境!
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
melt
一般會員 發表:9 回覆:6 積分:3 註冊:2003-07-12 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
//承上例: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure Delay(ms : longint); public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Delay(ms : longint); var TheTime : LongInt; begin TheTime := GetTickCount ms; while GetTickCount < TheTime do Application.ProcessMessages; end; procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; Delay(5000); Form2.Free; end; end.網海無涯,學無止境! |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 大家好: 如題......如何讓form create後停留5秒再自動free 謝謝我把重點貼出來 1.在form1.create(...)的最後一行加入 Application.onIdle:= StartRun; 2.在 private 下面加入 procedure StartRun(Sender: Tobject; var Done: boolean); 3.在 {$R *.DFM} 下加入 procedure TForm1.StartRun(Sender: Tobject; var Done: boolean); var xhandle: longInt; btime, etime: loginint; begin xhandle:= FindWindow('TForm1',nil); if xhandle = 0 then exit; Application.ProcessMessages; Application.OnIdle:= nil; Done:= True; btime:= gettickCount; etime:= getTickCount; repeat Application.ProcessMessage; etime:= getTickCount; until etime-btime > 5000; Form1.Close; end;4.在 form1.close 加入 Action:= caFree; Form1:= nil; 原因: 在oncreate 未完成前如果執行任何close行為, 會導致Access的不可預期錯誤 所以加入 Application.onIdle:= StartRun, 指Form1 create完成, 會執行一個 onIdle事件, 這時我們指定onIdle去執行一個procedure, 在此做五杪的計數然 後關閉--OK! 另外, 使用 getTickCount 會比Timer來的方便, 而且至少我認為會比timer精準 提供你做建議~~ 發表人 - P.D. 於 2003/07/18 23:59:44 |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
|
melt
一般會員 發表:9 回覆:6 積分:3 註冊:2003-07-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |