Windows Form中事件的激發順序

來源:互聯網
上載者:User

前幾天看周愛民先生的《大道至簡--軟體工程實踐者的思想》(http://www.doany.net/)時看到書中談到Windows的事件激發順序,以及對其他過程的影響的問題,今天就不期然遇到一個大概類似的問題。

這些天寫的一個系統,晚上發現偶爾會有不期然的事情發生:在執行一個資料庫查詢後返回的結果不一致,很是奇怪。初始代碼是VB6,流程很簡單,一個表單有一個查詢的方法,大概如下的代碼:

Public Sub RefreshDb(strSQL As String)
    '記錄結果的集合
    Set c = New Collection
DBQuery:  
    '查詢代碼
    ...
End Sub

方法查詢的時候將結果的一部分寫入集合c,供後續其他動作使用,並同時填充查詢結果到一個Grid介面。在表單的Load方法裡也調用了這個方法,得到預設的結果。

在VB6下,如果表單沒有初始化,調用順序是:
(1)執行RefreshDb在“DBQuery:”之前的代碼;
(2)調用Form的Load事件;
(3)等Load事件中的代碼執行完畢後返回來執行“DBQuery:”之後的代碼。

因此由於集合c沒有New,調用RefreshDb的過程中中斷了執行,調用了Load事件(其中又調用了RefreshDb),然後再回來,導致了結果不一致。

按照想法,要麼是先執行Load事件,要麼是先執行RefreshDb這個方法,然後調用Load事件(在VB.net 2005下是這樣),但VB 6下,Load事件應該是在表單顯示或者表單的某個變數第一次初始化時調用,上面代碼中因為調用了對集合的初始化,因此執行了Load事件。VB 6的Load事件有建構函式的一些含義,而VB.net則完全是物件導向,New為建構函式,Load是表單顯示前的一個事件。對於VB 6程式員,這些差別應該注意。反過來,對於這個問題,如果是.net下的順序,那麼問題也很容易發現 :)。

正確的方法是先初始化表單,例如調用Show或者Activate(.net,VB下為Show和SetFoucs)方法,然後調用RefreshDb,或者啟動後就將該表單初始化。因此開發中,表單的事件激發順序必須明確,否則會造成不必要的麻煩;第二,個人覺得,除非必要,例如項目要求或者平台的一些限制(包括硬體),VB 6程式員是拋棄老平台的時間了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.