インスタンスに設定するには?

解決


初心者  2006-03-03 03:01:56  No: 130534

VB.NET2003 WinXP 
FORM1 からコマンドボタン1をクリックし、別フォームを呼び出すのですが、
数秒別フォームが現れた後に
”オブジェクト参照がオブジェクト インスタンスに設定されていません”という
エラーが出ます。(Tryでエラーをメッセージボックスに表示)
そして、メッセージボックスのOKボタン押した後に、再度同じコマンドボタンを
押せば、なぜかフォームは開きます。

ソースの概略は
Dim fm As New FORM2
fm.ShowDialog(Me)
fm.Dispose()

FORM2にはコンボボックスが4つ有、どうもその中の1つが原因かと思い
その行をコメントにしたらエラーは出なくなったのですが、根本的な
解決にはなっていない状況です。

コメントにしたのは FORM2 ロード時にコンボボックスにSQLサーバーから
データを追加し、その後に空白のデータを追加している行です。
For Each A In B
   cboA.Items.Add(New MyComboBoxItem(Cint(Id),Cstr(Name)))
Next
cboA.Items.Add(New MyComboBoxItem(0,"") <---- コメントにした行


特攻隊長まるるう  2006-03-03 22:10:21  No: 130535

インスタンスについて分かっていないのであれば
過去ログ検索『インスタンス』でどうぞ。

で、MyComboBoxItem クラスのインスタンスの生成に
失敗しているのでしょう。
MyComboBoxItem クラスの Public Sub New(ByVal Id As Integer, ByVal Name As String)
にブレークポイントを置いてデバッグして下さい。


初心者  2006-03-04 04:13:40  No: 130536

ありがとうございました。
調査してみます。


初心者  2006-03-04 19:17:37  No: 130537

ブレークポイントを置いて見てみたのですが、その箇所は
問題なく通過していました。
最初の質問で言葉足らずでしたが、エラー(Try)が出ていた箇所は
Try
  Dim fm As New FORM2
  fm.ShowDialog(Me)
  fm.Dispose()
Catch ex As Exception
  MessageBox.Show(ex.ToString)
End Try
の   fm.ShowDialog(Me) この行で発生してました。
過去ログ拝見しましたが、該当するようなものがなかったような
気がします(見落としてたらすいません)のでご教授お願いします。


特攻隊長まるるう  2006-03-08 03:53:58  No: 130538

…ハンドル名が回答する意欲を削ぎますが、乗りかかった船なので…(  _)_

>最初の質問で言葉足らずでしたが、エラー(Try)が出ていた箇所は
特に問題と思われるコードは見つかりませんでした。
原因と考えられる情報はまだ示されていないか、もしくは
ボクの目がふしあななのでしょう。

インスタンスについては理解されましたか?

このエラーメッセージが出る場合、初期化に失敗している、
もしくは初期化を忘れているオブジェクトの中身を利用しよう
としています。この場合に、『メモリ上に実体が用意されてません
ので、利用しようにも空のものを操作するしかありませんよ?』
と文句を言われてます。

デバッグしている時に、このオブジェクトの中身を確認すると
Nothing と表示されます。全ての処理の中からそれを探し
出す必要があります。

1: Try 〜 Catch をはずしてください。
  エラー処理を入れているのは正しいことです。しかしそれは
納品前の状態で、十分デバッグした後、それでも想定外の
エラーに対応するためです。エラーが発生した場合、その
場所が他の関数から呼び出された場所であると、呼び出し側に
制御が移ります。そうして呼び出し側にエラー処理が無いか?
探しながらさかのぼり、そこで Try 〜 Catch があれば実行されます。
このため、正確なエラーの場所が特定できない場合があります。

2:自動で書かれた New() や自分で書いた New() 、そして初期化に
関係する全ての関数の先頭にブレークポイントを設定してください。
  New() の内部でエラーが起こった場合、New() の内部のエラーの
起こった行でなく、呼出側の行でエラーが表示される場合があります。
これを防ぐには、全ての New() 関数の先頭にブレークポイントを設定し、
そこからステップ実行する必要があります。

3:問題点を切り分けてください。
まず、
>その行をコメントにしたらエラーは出なくなったのですが、根本的な
>cboA.Items.Add(New MyComboBoxItem(0,"") <---- コメントにした行
この情報が正しければ、Nothing と成り得るオブジェクトは
  cboA
  MyComboBoxItem(0,"")  の戻り値(New() で作成されたインスタンス)
の2つしかありません。cboA はフォームに最初から存在しますよねぇ?
(動的に作成してたりしますか?)…となれば
>で、MyComboBoxItem クラスのインスタンスの生成に
>失敗しているのでしょう。
しかあり得ません。
>ブレークポイントを置いて見てみたのですが、その箇所は
>問題なく通過していました。
が正しい報告となると、
>その行をコメントにしたらエラーは出なくなったのですが、根本的な
>cboA.Items.Add(New MyComboBoxItem(0,"") <---- コメントにした行
↑これが間違った情報と言うことになります。

その他、いくつかの処理を組み合わせているので、どの部分に
エラーの可能性があるのか特定する情報がありません。

・データベース検索処理を別にして検証してください。
データがNULLにはちゃんと対応してますか?データベース
関連は特有のエラーが起こりやすい場所です。ちゃんとデータ
が取得できたと仮定し、結果の DataTable などを自分で作成するか、
Id や Name といった変数に直接データを代入してからテストして
ください。これでつまり、データベース検索でエラーなのか、
ローカルの(フォーム上の設定)処理でのエラーなのか切り分けます。

・同様に MyComboBoxItem を自分で用意したクラスではなく
既存のクラスに変えてください。
  問題がなければ MyComboBoxItem の内部処理に問題が
あります。例えば、コンボボックスに文字列を表示するには
ToString メソッドが正常に実装されていないといけません。

こういった作業を繰り返し原因のコードを特定してください。


特攻隊長まるるう  2006-03-08 03:58:57  No: 130539

ちなみに Id や Name といった変数名は悪い変数名です。
もう少し長い(他のクラスのプロパティやメソッドで
使われている可能性の低い)固有の名称に変更しましょう。


初心者  2006-03-08 17:10:59  No: 130540

たびたびのご回答ありがとうございました。
ご指摘にあったことをいろいろやってみましたがうまくいかなくて
最後に
>cboA はフォームに最初から存在しますよねぇ?
このプロは前任者が作成したものだったので気になり、再度同じ名前の
コンボボックス作成して実行してみたところエラー出なくなりました。

まさかとは思ったのですが。。。
特攻隊長まるるう さん丁寧に教えていただき本当にありがとうございました。
変数名も固有の名称にするように心がけるようにします。


初心者  2006-03-08 17:12:06  No: 130541

解決しました


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

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






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