1. 程式人生 > >時間限制關閉窗體的幾點體會

時間限制關閉窗體的幾點體會

繼承 message 窗體顯示 取出 模態 重新 pos 定時器 非模態

一個單據自助錄入小項目,界面上的窗體顯示有時間限制,一種是強制時間限制關閉,一種是空閑多少時間後關閉。(有點類似ATM機界面,ATM機一般只有一種強制改變的)

關閉後返回的窗體也有2種,一種是上一級窗體,另一種是主窗體。一般強制時間關閉的是返回上一級窗體,空閑時間關閉的窗體關閉後直接返回主窗體(返回窗體可以設置)。

一開始用幾個定時器,但是因為又要計時顯示,又要中斷計時(空閑檢測),又要處理自動關閉和手工關閉區別,搞的邏輯好混亂,效果不理想。後來又用線程,消息等等,還是不理想。

經過2天的修修改改,總算達到了比較滿意的效果。

註意幾點:

1,循環檢測狀態轉移處理的過程,不能在窗體事件中進行,而是要在計時器中處理。比如不能在窗體的OnActivate中或OnShow中處理,而是要通過一個定時器來進行。OnActivate中或OnShow中只是觸發定時器運行,這樣才能跳出窗體事件(不然手工不能關閉)。

2,空閑檢測到後再延時計時改變處理,(比如:檢測鍵盤鼠標空閑30秒後,然後計時顯示15秒準備關閉,如果15秒內還是空閑,則關閉窗體;如果15秒內有鍵盤鼠標動作了,則重新進行30秒的鍵盤鼠標檢測),開始是與2個定時器來檢測,一個是30秒的空閑檢測,一個是15秒內的鍵盤鼠標動作檢測,總是不行,15秒的準備關閉時間中斷不了,原來是不能用2個計算器,只能用一個30秒的檢測定時器,15秒的檢測處理要放在30秒的檢測定時器的循環過程中進行處理,這樣才能中斷準備關閉狀態。

3,不要用線程處理,用線程搞的邏輯很復雜,除非只有一種強制關閉的類型。也不要用消息,MessageManager的機制就是回調,是同步的而不是異步的,和WINDOWS的SendMessage()一樣的同步處理,而不是PostMessage()的異步處理,在這種情況下同步機制不好處理,要異步才行。(MessageManager只有SendMessage(),沒有PostMessage())

4,還是有不方便的地方,因為是在祖宗窗體中處理這些過程,用到了一個手動關閉的標誌,所以繼承的子窗體的手動關閉動作中,要設置這個手動關閉標誌,目前還沒有想到什麽好辦法來省略設置這個手動關閉標誌。

5,目前的窗體只適用於模態窗體,還沒有可考慮非模態窗體(項目中使用模態窗體實現)。

註:代碼混合了其它的東西,這部分的代碼沒有抽取出來,以後抽出來了再放上來。

時間限制關閉窗體的幾點體會