- PR -

ShowDialog関数のエラーの質問

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/11/19
投稿数: 14
投稿日時: 2005-03-09 14:28
はじめて投稿させて頂きます。

現在親フォームから画面を2つ呼び出しています
(ラジオボタンにより子フォームの呼出しを制御)

子画面1(以下 Aform)と子画面2(以下 Bform)はほとんど似たような機能なので
AformのコピーでBformを作成し、Bformに新たにコントロールを追加しました。

しかしながら、AformをShowDialog関数で呼出時には正常に動作するのですが
BformをShowDialog関数で呼び出すと
「'System.Exception' のハンドルされていない例外が App.exe で発生しました。
 追加情報 : Internal error: owner arg should never be null.」
のエラーが表示されてしまいます。
AformとBformの違いはDataGridコントロールがあるないしかありません。

以下に呼出時のコードを簡略で記載します。

private void button1_Click(object sender, System.EventArgs e)
{
(ラジオボタンのVALUE判定)
(以下AformとBformは処理が同じなので省略)
instance = new (メインクラス)
instance.WindowsShow(); //メインクラスの関数の呼出

---------------------------------------------------------------------------
Main.csのコード
public void WindowsShow()
{

予めメインクラスで作成しておいたFORMのインスタンス
form.ShowDialog();
↑ここで例外が発生




上記処理の流れはAformとBformに全く違いがありません。
情報が少なく分かりにくい説明だとは思いますが
似たような経験をお持ちでしたらご教授下さい。
よろしくお願いします。



OS:WindowsXp
言語:Microsoft Visual C# .NET(2003)
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-03-09 15:05
引用:

似たような経験をお持ちでしたらご教授下さい。


このようなことはいっぱい経験しています。
でも、「未記入」さんが陥っている問題を解決するずばりな回答は持ち合わせていません。

私がそのような状況になって行っているのは、単にステップ実行でのデバッグです。
このメッセージによるとnullになっては困るものがnullになっているようですので、
例外になる直前に止めて、そのようなモノが無いか調べてみることからはじめます。
お試しください。

で、
引用:

instance = new (メインクラス)


これが不吉な感じです。
もしかして、「メインクラス」はこのボタンを押されたときに2度目の生成になってませんか?
コードが提示されていないのでわからないのですが、2度目のときもformは正しく入ってますか?

・例外の直前で止めて、nullになってはダメそうなものを調べてはいかが?
・コピーして変更する、という作業を再度やってみてはいかが?
・問題の出るプログラムを、問題が出なくなるまで簡略化してみてはいかが?

_________________
たつごろー
codeseek
こみゅぷらす
未記入
会議室デビュー日: 2004/11/19
投稿数: 14
投稿日時: 2005-03-09 17:27
早速の返答を有難うございました。

引用:
--------------------------------------------------------------------------------
例外の直前で止めて、nullになってはダメそうなものを調べてはいかが
--------------------------------------------------------------------------------
デバッグモードでAformとBformの違いを調べていたのですが
違いが分かりませんでした(両方とも未定義のプロパティが同じでした)


引用:
--------------------------------------------------------------------------------
・問題の出るプログラムを、問題が出なくなるまで簡略化してみてはいかが
--------------------------------------------------------------------------------
問題のあるフォーム上のユーザーコントロールを作成せずにただシステムが作成するコントロールのみで挑戦したのですが結果が同じでした。

引用:
--------------------------------------------------------------------------------
2度目の生成になってませんか?
--------------------------------------------------------------------------------
デバッグモードでじっくりソースを追ったり、ソースの調査をしたのですがこれも
同様にエラーでした。


上記を調査した結果、やっぱりもう一度作成し直した結果
今度はエラーが出力されずに成功しました(意味不明)

自分のスケジュールの都合で作成し直しでやることに決めました。
原因がよく分からずにこれからも戦々恐々としながら開発して行こう思います。
有難うございました。
(本当に意味不明で理解不能でした・・・)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-09 20:51
 発生しているのがただのSystemEceptionで、メッセージが‘Internal error: owner arg should never be null.’というのが気になりますね。
 もしかして、AForm→BFormの順番で呼び出したときにはBForm、BForm→AFormの順番で呼び出したときにはAForm、つまり、後から呼び出そうとしたフォームで発生していませんか?
# エラーを特定する、というのは、このように順番を変えるなど、
# 考えられる操作をすべて行い、エラーとなる要因ではないものを
# 排除していくことをいいます。

 関係しそうなコードが端折られているので何ともいえませんが、私はFormクラスが内部的に設定しているルートウインドウのハンドルが取れていないのではないかと思います。SowDialogは、ダイアログとして表示するために親ウインドウが必要ですから、その親ウインドウが設定されていないのではないかと。

 ん?たつごろーさんの指摘と一緒か。
引用:

もしかして、「メインクラス」はこのボタンを押されたときに2度目の生成になってませんか?


C#らしいので、mainメソッドを含むクラスをインスタンス化していると。設計を見直す必要がありそうですね。

 オブジェクトの生成とその生存期間、フォームの呼び出しタイミングを図で考えるといいかもしれません。UMLのうち、状態遷移図とか、シーケンス図とかのあたり。


# 夜しか出てこられなくてすみません
_________________
未記入
会議室デビュー日: 2004/11/19
投稿数: 14
投稿日時: 2005-03-10 09:52
色々なアドバイス有難うございます。

拙い文章説明で伝わりきれない部分があったので補足説明を追加します。
親フォーム上にラジオボタン(chkA,chkB)を置き
ボタン押下時
chkAがTRUEの時は子フォームA(Aform)の呼出
chkBがTRUEの時は子フォームB(Bform)の呼出
の構造でした。
その時の呼出時に上記にも説明させて頂いたとおり
同様の方法で行っています。
(ShowDialog(親フォーム)を行っても同様の結果でした)

ちょっとした疑問なのですが
子フォーム上のユーザーコントロールインスタンス作成のタイミングは
子フォームのインスタンス作成時に行ったほうがよいのでしょうか?
それとも子フォームのLoadイベント時に行ったほうがよいのでしょうか?

(上記の事はShowDialogエラー時に調査した時に混乱しました。)
超初心者レベルの質問ですがよろしくお願いします。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-10 21:08
プログラムの起動直後にチェックボックスでAを選択して表示、次にBを選択して表示というパターン。
プログラムの起動直後にBを選択して表示した後にAを選択して表示というパターン。
   こういう意図だったのですが、伝わらなかったか。


 とりあえず、私のこの投稿の下に「www」というリンクがありますよね。そこから私のウェブページへいって、「.NET FrameworkおよびVS.NETに関するTips」→「プログラムサンプル」(上の広告の直下)と進み、「サンプル1のソリューションをダウンロード」をクリックしてサンプル1をダウンロード、解凍してください。

1.ボタンをクリックするごとにフォームを生成する
2.ボタンを何度クリックしても、フォームを1つだけ生成する
3.いくつでもフォームを開くが、任意のものを消去することも出来る

という3つのパターンを紹介しています。このうち、2のパターンの応用になります。表示するフォームは2つで、それぞれ1つだけ生成する、ようにアレンジしてください。ChildForm1という変数に、インスタンスが生成されます。この変数をどのように持っているか、どんなイベントをハンドルして、どのように扱っているか、調べてください。

_________________
1

スキルアップ/キャリアアップ(JOB@IT)