はじめまして。
いつも拝見させていただいています。
DLLにてMDI画面を作成しようとしています。
構成としては、MDI親画面・MDI子画面ともDLLとして実現しようとしています。
以下の問題が発生しました。
・MDI親画面DLLより、MID子画面DLLを呼び出した場合「MDIの親が見つかりません」という内容の
エラーが発生しました。
調査した結果、MDI子画面はApplicationクラスのMainFormの内容を参照しているのようなので、
MDI親画面を、Application.createFormで作成し、そのApplicationクラスをMDI子画面に引き渡して
表示させたところ、表示はできましたが、画面を終了するときに、アクセス違反が発生してしまいます。
DLL同士で、MDI親子としての作成はできないのでしょうか?
わかりづらいとは思いますが、よろしくお願いします。
・アプリケーション(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にあわせてやればよろしいかと。
にしの様
丁寧なご回答ありがとうございます。
ご紹介いただいている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の値 を使用しているため?)
以上のような問題があり、なかなか思うとおりにできません。
お手数ですが、なにかアドバイスがあればよろしくお願いします。
ツイート | ![]() |