2017-10-28 38 views
-1

這是一個有趣的案例。德爾福 - 表單屬性FormCreate上設置時從其他表單

有登錄表單,其中設置了一些變量值,如company_id和SelectedlanguageCode,想法是將此值傳遞給MainForm屬性以使事情更快(所選語言代碼轉到數據庫進行查詢),則此值將在FormCreate事件中立即需要,但是這裏的值缺失,但在CreateForm事件後調試值剛剛顯示。

這裏是項目源代碼:

{$R *.res} 

Var 
    LoginOK: Boolean = False; 
    sCompanyId: integer; 
    sSelectedLanguageCode: string; 
begin 
    // The login form is created and show up 
    // -------------------------------------- 

    fLogin := TfLogin.Create(nil); 
    try 
    // Show login form. When it closes, see if login worked. 
    fLogin.ShowModal; 
    LoginOK := fLogin.CanLogin;   
    sCompanyId := fLogin.pCompanyId; 
    sSelectedLanguageCode := fLogin.gDefaultLanguageCode; 
    finally 
    fLogin.DisposeOf; 
    end; 

    if not LoginOK then 
    Halt; // Login failed - terminate application. 

    Application.Initialize; 

    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TfMain, fMain); 
    // Here the properties of Main are set with the values, 
    // when debugging the properties get the values, you can 
    // see the actual values when hovering over the property 
    fMain.gSelectedLanguage := sSelectedLanguageCode; 
    fMain.gUserCompany := sCompanyId; 
    Application.Run; 
end. 

但是如前所述,在主要的的CreateForm,屬性是空的...... 還有......事件的CreateForm後,性能有實際的價值。

我需要在活動的CreateForm這個值,因爲一些方法將被調用,並需要向他們發送...

我欣賞的是怎麼回事就明白我在做什麼錯了,或者如果有答案這是一個很好的理由,如果你能給我另一種方法來解決這個要求,謝謝。

+1

如果我正確地理解你,你有雞和雞蛋的困境。您無法在創建表單之前設置屬性,但在創建表單時您已經需要這些值。因此,將這些變量放在主窗體單元中作爲全局變量(顫抖)。然後,您可以在創建表單之前設置它們,並且您的主窗體可以在需要時讀取它們。 –

+3

當Application.CreateForm返回時,表單已經被創建並且它的FormCreate被執行。很顯然,當你沒有設置它們時,它們不能在'FormCreate'中使用,直到*'FormCreate'已經運行之後。 –

+0

Tom,就是這樣做的,提供的代碼是應用程序代碼,它首先創建登錄表單,然後在用戶登錄後創建主表單並分配登錄的值,發佈登錄表單和顯示Main。我一直在主要屬性中使用它們的值,這是完美的,但直到我在CreateForm事件中需要它們時,才意識到具體值的存在尚未提供,只是在那裏。 – VisualFox

回答

1

好吧,所以不要在formCreate中有初始化代碼,而是將它全部移到主窗體上的一個方法(例如init())。 然後在你的application.run之前,你可以有 mainform.init; 或 mainform.init(sSelectedLanguageCode,sCompanyId);

我總是從初始化中分離出創建。如果表單顯示並且未初始化,則可以提出錯誤。即在onShow中,如果沒有公司ID - 告訴用戶出現錯誤並關閉應用程序....