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