2010-01-14 62 views
5

一些數據庫應用程序開發人員更喜歡通過編輯這樣DataModule的主要形式

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TDM, DM); 
    Application.CreateForm(TMainForm, MainForm); 
{...} 
    Application.Run; 
end. 

的問題是項目源文件創建主窗體前一個數據模塊之前產生的?什麼是優點和反對?

+1

沒有OnCreate處理程序或其他。 MainForm可能會引用在datamodule中聲明的數據源,但是它們可以在不更改創建順序的情況下成功解析。 – kludg 2010-01-14 16:09:13

+2

這並不意味着您必須編輯項目源。數據模塊和表單的創建順序可以在項目選項對話框中更改。創建的第一個表單將成爲主表單,但在此之前可以創建數據模塊。 你也可以看看我對這個問題的回答:http:// stackoverflow。com/questions/382527/delphi-app-initialization-best-practices-approach/383197#383197 – 2010-01-14 16:30:17

+0

給Uwe Raabe - 我知道有很多選擇。我自己有時編譯沒有任何形式的GUI單元測試項目。 – kludg 2010-01-14 16:46:54

回答

15

顯而易見的原因是,如果主窗體需要數據模塊進行設置。例如,如果在那裏有主表單在其OnCreate中引用主表單,那麼當然數據模塊必須先準備好。

否則,它並不重要。

+0

我同意,也看到動態生成菜單。 – Eduardo 2010-01-14 16:55:41

6

我同意梅森的答案,因爲它解釋了爲什麼人們可以這樣做。但是,我認爲這是一種糟糕的方法,因爲它隱藏了IDE所維護的代碼中的依賴關係。在我看來,數據模塊應該從自動創建列表中刪除,並且應該在主窗體的OnCreate方法中創建它。

+0

我不同意應該由MainForm的OnCreate方法創建數據模塊,並認爲這是不好的風格。相反,我會首先創建主窗體,然後創建數據模塊,並且在創建或銷燬期間,我不會將任何代碼置於依賴於任何其他窗體的主窗體中。相反,我會編寫獨立的初始化函數,並通過我編寫的代碼調用它們以在某個時間發生。我不喜歡FormCreate事件,除了在表單中創建私有/受保護字段的本地對象之外,它的功能非常強大。其他任何東西都不應該在FormCreate中。 – 2010-01-14 20:36:29

0

僅僅因爲這是確保DataModule內容可用於MainForm的最懶惰的方式。 如果你只有一個DataModule,那就沒有問題了。

5

這個真的有兩個陣營,都是正確的。

第一個讓應用程序管理每個表單/數據模塊的生命週期。在這種情況下,如果主窗體使用數據模塊,則必須先創建才能使用它。這適用於小型應用程序,但是在使用多種形式的大型應用程序時會產生加載開銷......但是一旦加載應用程序,則顯示錶單幾乎是即時的,因爲它已經在內存中創建。因爲每個表單/資源都已經創建,所以在運行應用程序時也會遇到很大的內存空間。這種方法是Delphi向您「引導」您的默認方法,因爲您將新的表單/數據模塊添加到應用程序中。如果不在mainform的OnCreate中使用datamodule,那麼它可以在創建順序中較低,因爲它在啓動Application.Run之後纔會被調用。

第二陣營想要處理每個表單/數據模塊本身(通常是除MainForm以外的所有表單)的創建和銷燬。這種方法的優點是應用程序加載速度更快,啓動時立即消耗更少的內存。通常在這種情況下,它是完全管理他們使用的每個表單/數據模塊的生命週期的主要形式(或其他形式)。此方法適用於具有多種形式的大型應用程序。

0

在創建所有其他組件之前不顯示MainForm。所以基本上你會在兩種情況下等待,天氣數據模塊首先被創建或者不被創建。

cxGrid1DBTableView1.Controller.TopRowIndex :=0; 
cxGrid1DBTableView1.DataController.FocusedRowIndex := 0; 

原因是顯而易見的:如果你的網格是主窗體上,那麼你可能想使用類似這樣從數據模塊表(或查詢的)事件(後開)時惹上麻煩的網格尚未創建..我必須承認,我也首先創建datamodule。但是有一些原因,就像我剛剛描述的那樣,當這樣做不切實際時。