3

これはFAQに違いないと思いますが、グーグルはあまり役に立ちませんでした。

私は何をすることができますか-そしてしないかもしれません-でFormCreate()

フォームのすべての子コントロールが完全に作成され、アクセスできるようになっているのではないかと思います。

私が尋ねる理由は、私がFormCreate()単純に構成されている古いプロジェクトに出くわしたからです。

Sleep(1000);  
PostMessage(Handle, UM_PROGRAM_START, 0, 0);  

「少し待って」、「落ち着いたら」初期化したいようです...

確かに当時は理由があったのですが(?)、啓発的なコメントがなかったので、なぜそれが必要だと感じたのか思い出せません。

誰かが、自分が何をすることができるかについての制限を述べたり、述べているリンクを参照したりできますFormCreate()か?


[更新]DavidHeffermanは、「アプリケーションがメッセージのポンピングを開始します。これは、.dprファイルでApplication.Runを呼び出すと発生します」と書いたときに解決策を見つけたと思います。

私は単一のフォームについては心配していなかったと思います。たとえば、私のメインフォームは、起動時にconfig / optionsフォームを使用して何かを実行したいので、明らかに、作成されるまで待機する必要があります。

これが私のプロジェクトの1つからの典型的な.DPRです...

Application.Initialize;
Application.CreateForm(TGlobal, Global);
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);

Application.CreateForm(TLoginForm, LoginForm);
Application.CreateForm(TConfigurationForm, ConfigurationForm);

//[snip] a bunch of other forms ...

Application.Run();

mainForm.CreateForm()したがって、すべてのフォームが作成されて初期化されるまで処理されないをアプリ自体に送信することは理にかなっていUM_APPLICATION_STARTます(または、メッセージが呼び出された後に.DPRからトリガーされるfn()を呼び出すこともできますApplication.Run();しかし私はそれがより明白であるため、メッセージを好みます-私はめったに私の.DPRファイルを見ません)。

4

3 に答える 3

7

フォームのOnCreateで実行できることと実行できないことのすべてのリストを提供する明確なドキュメントはありません。

.dfmファイルが処理され、フォームが所有するすべてのコンポーネントが作成されたかどうかについては、そうです。

私はあなたが見つけたコードに多くのストアを配置しません。メインスレッドを待機させるために起動中にSleepを呼び出すことは、絶対に良い習慣ではありません。コードが別のスレッドを待機したい場合は、そのスレッドをブロックするか、そのスレッドからのメッセージの取得を待機することができます。これは、自分が何をしているかを理解していない誰かによって入力されたコードのように見えます。そして、コードが削除されることはありませんでした。

コードの他の行は合理的です:

PostMessage(Handle, UM_PROGRAM_START, 0, 0);

このメッセージは投稿されるため、アプリケーションがメッセージのポンピングを開始するまで処理されません。これは、.dprファイルでApplication.Runを呼び出すときに発生します。つまり、メインフォームの作成に関連するすべては、そのメッセージがキューから削除される前に発生します。

于 2012-11-16T06:56:15.750 に答える
4

FormCreateには多くの初期化コードを入れませんが、代わりに、次のような別の関数に配置します。

fm := TForm.Create;
fm.Init;

問題は、FormCreate()プロシージャでスローされた例外が再スローされないことです(MessageBoxのみが存在します)。つまり、フォームが正しく初期化されていなくても、コードは実行され続けます。

于 2012-11-16T07:57:25.267 に答える
2

FormCreateで好きなことをすることができます。しかし、操作するメッセージハンドラーはありません。それだけです。一般に、FormCreateで依存オブジェクトを作成し、FormDestroyでそれらを解放します。また、時間のかかる初期化ルーチンを避けようとします。

于 2012-11-16T06:56:44.487 に答える