Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
想請教大家一個 Delphi 的問題,我做了一個 MDI FORM,當MDI Form 出現以後,如果判斷出某些資料未設定,要再出現一個Form2.ShowModal 設定資料的對話盒,應該寫在那兒呢?我試過的 OnActivate ,OnShow ,但MDI Form 皆未出現就去執行這部份程式,就出現錯誤了。
要解決您的問題, 首先要了解從 Form 產生的整個過程中, 各事件發生與執行的次序
![]() |
如果是一般的 SDI Form, 各事件的發生次序如下:
|
![]() |
如果是 MDI 視窗, 而 MdiChild 的第一個子視窗是在程式啟動時, 就出現在MdiForm
中的話, 那麼,各事件的次序是
|
ok, 您發現了嗎? OnShow 是在視窗被看到之前的事, 而 OnActivate 並沒有發生, 因此, 您的問題中所採用的 '我試過的 OnActivate ,OnShow ....', 當然不能在視窗於'被看到後'才出現設定資料的對話盒
因此, 以您的狀況, 檢查與設定的程式可以寫在主視窗的 OnPaint 中, 不過, OnPaint 是一個常發生的事件, 所以應該要在主視窗的類別定義中額外加上一個 private 的邏輯成員資料變數, 以控制不要每次視窗重畫時都檢查設定.
另外, 有一個方法您可以參考看看:
![]() |
1. 利甪 Options | Project , 將子視窗從 Auto-Create forms 移到 Available forms, 不要讓 Delphi 在程式啟動時就產生 MdiChild 子視窗 |
![]() |
2. 此時, 雖然是 MDI 架構, 但是 MDI 主視窗產生時的各事件次序與一般視窗相同, 您的檢查與呼叫設定視窗的程式可以寫在 OnActivate 中 |
![]() |
3. 各子視窗的產生, 以Application.CreateForm 方法,寫在您的應用程式主選單的 File | New Click 事件中, 以手動的方式讓子視窗出現在主視窗中 |
最後, 視窗內部的資料起始與設定, 我一般是寫在 Form 的OnCreate 事件中.
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |