2017-10-28 7 views
-1

これは興味深いケースです。Delphi - フォームのプロパティが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、それはやり方です。提供されるコードはApplicationsコードです。最初にログインフォームが作成され、ユーザーログイン後にメインフォームが作成され、ログインの値が割り当てられます。メインを表示します。私は、それらを使用するためのMainプロパティで常に値を持っていましたが、それは完璧に機能しますが、CreateFormイベントでそれらが必要になるまでは、値がまだ利用できませんでした。 – VisualFox

答えて

1

OK、初期化コードをformCreateに入れる代わりに、すべてをメインフォームのメソッド(init()など)に移動します。 次に、application.runの前の行に、 mainform.init; または mainform.init(sSelectedLanguageCode、sCompanyId);

私は常に初期化から作成を分割します。フォームが表示され、初期化されていない場合は、エラーを発生させることができます。つまり、onShowでは会社IDがない場合 - エラーがあり、アプリを終了したことをユーザーに伝えます。

関連する問題