私はこの問題をうまく説明できることを願っています!Delphi TForm OnCreateが複数回呼び出される
私はReWireオーディオデバイスをDelphi .dllとして実装しようとしています。 ReWireが何であるかわからない場合は、心配しないでください。重要なのは、私のコードが.dllにコンパイルされ、ReWireシステムから.dllへの呼び出しが表示され、表示が開かれているかどうかを確認し、もう一度閉じます。私が起動するコールを取得すると
、私は次の操作を行います
if not Assigned(form) then
form := TMyForm.Create(nil);
form.Show;
どこform
は私のDelphiのライブラリの内部グローバル変数です(多分問題?)。私はMyForm
のOnCreate
イベントを利用して、私が働きたいものの配列を準備するような面白いことをしました。
これまでのところすべてが有効です。私のフォームには、TOpenDialog
を開く小さなボタンがあります。そのダイアログが閉じるとすぐに、何とかOnCreate
イベントが私のフォームで再び発生していることがわかりました!
私はOnDestroy
が呼び出されていないことを確認しました。なぜOnCreate
が再び呼び出されるのかわかりません。
残念ながら私は、関連する情報は本当にわからないんだけど、ここでの呼び出しは(フォームが最初に設定されている)最初の頃スタックです:予想通り
を、ReWireのが作っています私の.dllを呼び出してPanelアプリケーションを起動して、フォームを作成します。素晴らしい、ものはよく見ている。
私のフォームの中で、少しダイアログを開いてファイルを選択し、いくつかの操作を行います。左のフィールドのうち、OnCreate
が再び呼び出され、ここでの呼び出しはその時間を積み重ねるですされています
それは呼び出しのクレイジーパーティです!私のアプリケーションをテストするために使用しているReWireホストのReaper(Reaperの下)は、私のコードではないので、スタックトレースの内部で何が起こっているのか分かりません。突然、イベントはちょうど私がそれがすべきだと思わないときに呼び出されます。OnDestroy
は呼び出されていないからです。
私は考えることができる唯一の他の重要なことは、私はSender
のアドレスをプリントアウトした場合、それは異なる各時間ですので、それが何らかの形で再び作成さか何かが、私は私だけ呼んでいることをチェックしましたばかりだということです一度MyForm.Createを実行します。
どのようにこのようなことが起こるかについてのアイデアはありますか?
これは機能しません。 2つのVCLインスタンスがあります。 1つはexeに、もう1つはDLLにあります。静的にすべて1つのexeにリンクします。または、パッケージを使用してください。 –
まず、OnCreateロジックを削除して、まったく動作するかどうかを確認します。次に、OnShowハンドラにポストされているWM_USERメッセージハンドラの新しい関数にロジックを移動します。そうすれば、ユーザーはフォームを早期に見ることができ、セットアップが実行されている(遅延がない)ことが分かります。これにより、2つの部分を分離することができ、1つの部分のエラーを識別しやすくなります。 – mj2008
みなさん、お世話になりました。答えは@Remy Lebeauが提案したものと似ていて、彼の反応の下にコメントで詳述されています。私は本当に皆様のご意見をお待ちしております!私はDavid Heffernanのコメントに少し心配しています。私はこのVCLのすべてに触れていないので、何かが狂ったら、VCLのインスタンスを1つに保つ方法を考えてみましょう! – aardvarkk