別々のDLLでMDI親子を実現するには?


ベサリウス  2003-11-28 06:57:16  No: 5811

はじめまして。
いつも拝見させていただいています。

DLLにてMDI画面を作成しようとしています。

構成としては、MDI親画面・MDI子画面ともDLLとして実現しようとしています。

以下の問題が発生しました。
・MDI親画面DLLより、MID子画面DLLを呼び出した場合「MDIの親が見つかりません」という内容の
エラーが発生しました。
調査した結果、MDI子画面はApplicationクラスのMainFormの内容を参照しているのようなので、
MDI親画面を、Application.createFormで作成し、そのApplicationクラスをMDI子画面に引き渡して
表示させたところ、表示はできましたが、画面を終了するときに、アクセス違反が発生してしまいます。

DLL同士で、MDI親子としての作成はできないのでしょうか?

わかりづらいとは思いますが、よろしくお願いします。


にしの  2003-11-28 09:18:19  No: 5812

・アプリケーション(EXE)
・親MDI(DLL-A)
・子MDI(DLL-B)
というように、EXEと、DLLが2つの、合計3つで構成されているということでしょうか。

調査されたのであれば、この3つの構成には、TApplicationのインスタンスが3つあることはご承知かと思います。
親EXE+子DLLのパターンは、
http://www.k-brand.gr.jp/program/delphi.rhtml
こちらにあるように、親EXEのApplicationにあわせる形で解決できます。

試していませんが、今回の場合は、2つのDLLのApplication変数に、EXEのApplication変数の値を入れ、それを使い回せばよろしいかと思います。

つまり、例外が発生しているのは、
・アプリケーション(EXE) Applicationの値 App0
・親MDI(DLL-A) Applicationの値 App1
・子MDI(DLL-B) Applicationの値 App2
のときに、
・アプリケーション(EXE) Applicationの値 App0
・親MDI(DLL-A) Applicationの値 App1
・子MDI(DLL-B) Applicationの値 App1
としていて、親MDIと子MDIのApplicationの値は同じだけれど、EXEとは違う形なのでしょう。
これを、
・アプリケーション(EXE) Applicationの値 App0
・親MDI(DLL-A) Applicationの値 App0
・子MDI(DLL-B) Applicationの値 App0
というように、EXEにあわせてやればよろしいかと。


ベサリウス  2003-11-28 19:54:11  No: 5813

にしの様

丁寧なご回答ありがとうございます。
ご紹介いただいているHPなどを拝見し、いろいろ試してみました。

構成は以下のとおりです。
・アプリケーション(EXE)
・親MDI(DLL-A)
・子MDI(DLL-B)

■パターンA
>・アプリケーション(EXE) Applicationの値 App0
>・親MDI(DLL-A) Applicationの値 App1
>・子MDI(DLL-B) Applicationの値 App1

■パターンB
>・アプリケーション(EXE) Applicationの値 App0
>・親MDI(DLL-A) Applicationの値 App0
>・子MDI(DLL-B) Applicationの値 App0

1.はじめに、パターンBで作成したのですが、
子MDI(DLL-B)を呼び出し、フォームを生成する処理で、「MDIの親が見つかりません」という内容のエラーが発生しました。
アプリケーション(EXE) Applicationの値 を引き渡しているため、Application.MainFormの内容がアプリケーション(EXE)になっています。
アプリケーション(EXE)はMDIフォームではありませんので、上記のようなエラーが発生しているとおもわれます。

2.次に、パターンAで作成しました。
親MDI(DLL-A)で、Application.CreateFormを行い、親フォームを作成します。
そのApplicationを、子MDI(DLL-B)に引渡し子フォームを作成しました。
この場合は、MDI親子の整合性がとれていると思われ、MDI親子画面がきちんと表示されました。ただ、
EXE側で、MDI親子画面を終了しようとした場合、「アクセス違反」エラーが発生してしまいます。

3.パターンBの関係で、親MDI(DLL-A)のみの表示をさせてアプリケーション(EXE) から、親MDI(DLL-A)の終了関数を呼び出した際、
一緒にアプリケーション(EXE)も閉じてしまい、
その後「アクセス違反」エラーが発生してしました。
(同じApplicationの値 を使用しているため?)

以上のような問題があり、なかなか思うとおりにできません。

お手数ですが、なにかアドバイスがあればよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加