問題:我做了一個 MDI FORM,當MDI Form出現以後,如果判斷出某些資料未設定,
要再出現一個Form2.ShowModal設定資料的對話盒,應該寫在那兒呢?我試過的
OnActivate ,OnShow ,但MDI Form皆未出現就去執行這部份程式,就出現錯誤了。
要解決這個問題, 首先要了解從 Form 產生的""個過程中, 各事件發生與執行的次序
如果是一般的 SDI Form, 各事件的發生次序如下:
OnCreate
OnShow
在螢幕上看到這個視窗
OnActivate
OnPaint
如果是 MDI 視窗, 而 MdiChild 的第一個子視窗是在程式啟動時, 就出現在MdiForm
中的話,
那麽,各事件的次序是
主視窗的 OnCreate
子視窗的 OnCreate
子視窗的 OnShow
子視窗的 OnActivate
主視窗的 OnShow
在螢幕上看到主視窗及第一個子視窗
主視窗的 OnPaint
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 事件中.