?? 在程序執(zhí)行期間讓其他控件能響應(yīng)消息 (2000年12月.txt
字號(hào):
在程序執(zhí)行期間讓其他控件能響應(yīng)消息 (2000年12月10日)
本站更新 分類: 作者:srw 推薦: 閱讀次數(shù):562
(http://www.codesky.net)
--------------------------------------------------------------------------------
當(dāng)一段程序代碼在執(zhí)行一個(gè)很費(fèi)時(shí)的操作(例如對(duì)軟盤進(jìn)行讀寫操作)時(shí),其他控件將無法得到Windows的消息,換句話說,將一個(gè)過程被執(zhí)行時(shí),在該過程結(jié)束之前,應(yīng)用程序的回調(diào)函數(shù)不會(huì)被Windows調(diào)用,也就無法響應(yīng)系統(tǒng)消息。
舉例來說,如果在一個(gè)過程中改變了一個(gè)TLabel控件的Caption屬性值,僅當(dāng)該過程結(jié)束后用戶才會(huì)在屏幕上看到TLabel控件被重畫,如果你設(shè)計(jì)了一個(gè)拷貝文件的過程,并想在拷貝過程中不斷地顯示已拷貝的字節(jié)數(shù),如果直接在拷貝操作的循環(huán)中改變要顯示的字節(jié)數(shù)是不行的,用戶實(shí)際上看不到這個(gè)不斷變化的數(shù)字,因?yàn)楫?dāng)拷貝操作的過程未結(jié)束之前,其它控件根本未接收到重畫消息。
另一個(gè)極端的例子,如果你的程序要進(jìn)行一個(gè)死循環(huán),退出該死循環(huán)的條件是用戶單擊按鈕Button2,那么你會(huì)發(fā)現(xiàn)在死循環(huán)執(zhí)行期間,所有的控件都失效了,你的程序也就變成了一個(gè)大BUG。下面的代碼示例顯示了如何避免這一問題,該段程序的含義是當(dāng)用戶單擊按鈕Button1時(shí)開始執(zhí)行死循環(huán),單擊Button2時(shí)退出這個(gè)死循環(huán)。
var
ExitFlag: Boolean = false;
procedure TForm1.Button1Click(Sender: TObject);
const
Busy: Boolean=false;
begin
if Busy then Exit; // 若已進(jìn)入本過程則退出
Busy := true; //設(shè)立已進(jìn)入本過程標(biāo)志,這一句很重要
while true do begin
Application.ProcessMessages; // 讓其他控件能獲取消息
if ExitFlag then Break; // 若標(biāo)志為真退出死循環(huán)
end;
Busy := false; // 清除已進(jìn)入本過程標(biāo)志
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ExitFlag := true;
end;
上例中有兩點(diǎn)很重要,其一是死循環(huán)中的Application.ProcessMessage,這句代碼使程序的其他控件也能獲取消息,如果沒有這一句則程序會(huì)陷入死循環(huán)中;另一個(gè)重要的代碼是在Button1Click過程開始處判斷是否正在執(zhí)行死循環(huán),若是則直接退出,如果沒有這個(gè)判斷,則當(dāng)用戶重復(fù)單擊Button1時(shí)可能導(dǎo)致代碼重入,因?yàn)樵谶^程中調(diào)用了ProcessMessage方法。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -