| ■No87773 (WebSurfer さん) に返信
WebSurferさん、回答ありがとうございます。
> C# ですがサンプルを書いておきます。Form5 ⇒ Form1, Form6 ⇒ Form2 に読み替えてください。
>
> デザイナで Form5 には Button を、Form6 には ComboBox をドラッグ&ドロップして、必要なイ
> ベントハンドラを生成しただけです。
サンプルコードありがとうございます!
おかげさまで、無事に実行が成功しました^^
> public partial class Form5 : Form
> {
> public Form5()
> {
> InitializeComponent();
> }
まさかのオーバーロードの書き忘れによるエラーでした…。
(オーバーロードを両方のFormに書く必要があるのだと知らずに初歩的なミスをしていました)
上記のコードをForm1に入れたらちゃんと動くようになりました!
本当にありがとうございました!
■No87776 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん、回答ありがとうございます。
>><修正後ソースコード>
>> 'xmlからデータを取得
>> Function xmlGet(Byval a As String,Byval b As String)
>
> Function の戻り値のデータ型が示されていません。
> 戻り値が無いのなら Sub にするべきですし、
> 戻り値があるのなら、末尾に「As String」などの記述が必要です。
すみません、今回の質問やエラーに直接関係ないかなと思って戻り値書いていませんでした。
あと、As Stringも書き忘れてますね…申し訳ないです。
>>* 'ボタンクリックイベント(Form2が開く)
>>* Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
>>* Dim frm As Form2
>>* frm = New Form2(df)
>>* frm.Show() '(※1)
>
> この段階で、df の中身が Nothing になっていたりはしませんか?
はい、その段階でなっていました。多分、dsとdfが混在していたことが原因だったとは思うんですが…。
>>* 'Form2のオーバーロード(引数あり)
>>* Public Sub New()
>>* InitializeComponent()
>>* End Sub
>>* 'Form2のオーバーロード(引数あり)
>>* Public Sub New(df As DataSet)
>>* IntializeComponent()
>>* Me.df = df
>>* End Sub
>
> この 2 箇所の IntializeComponent() の行で、[F9]キーを押してブレークポイントを貼り、
> この行で一時停止させてみてください。
>
> (※1) からは、後者「Sub New(df As DataSet)」側の IntializeComponent が呼ばれるはずです。
> 後者が呼ばれた場合は、引数 df が Nothing で無いことを確認してください。
> もし、引数に Nothing が渡されるとマズイ場合には、IntializeComponent を呼ぶ前に
> If df Is Nothing Then
> Throw New ArgumentNullException("df")
> End If
> などを設けておくとよいでしょう。
なるほど、勉強になります。
確かに(※1)からは後者が呼ばれていました。
何でもかんでもtry-catchで囲むんでなく、if文で例外をthrowするといいんですね。
万が一のこともあると思うので、ソースコードに追加します。
> 一方、前者「Sub New()」側の IntializeComponent が呼ばれることがあるとすれば、
> それは想定外の呼び出しとなります。
> 引数が渡されなければ、Me.df も Nothing のままになってしまうわけで。
>
> もしも前者が呼ばれるようであれば、それがどこから呼び出されているのか
> コードを見直してみてみてください。
>
> たとえば、前者を
> Public Sub New()
> のままにしただけなら、コンパイルが通る(ただし実行時エラー)のに、それを
> Private Sub New()
> にしただけでコンパイルエラーになるようであれば、現在のプロジェクト設定
> もしくはコーディングのどこかが間違っているのだと思います。
>
> 本来は前者を削除して、後者だけにしたいところなのですが、その場合、
> 特定の条件を満たしたときに、自動生成される *.designer.vb 内で、
> VB のコンパイルエラー BC30109 を生じさせることがあるのが悩ましいところ。
>
> デザイナコードでエラーが生じると、話がややこしくなるため、
> No87759 では意図的に、引数なしコンストラクタを残すように案内しています。
> (きちんと理解している人なら、前者を削除した状態でも正常に動作するコードを書けるはず)
少しのミスでエラーが起きる世界だと改めて分かったので、
もっとプログラミングに関しての知識を深めていけるように頑張ります。
引数なしのコンストラクターは参照0個だし必要あるのかなと疑問でしたが、
これがないだけで発生するエラーがあるんですね…。
今回は特にコンストラクタに対しての指定はないですし理解も不十分なところがあるので、
引数なしコンストラクタを書いておくようにします。
教えていただきありがとうございました。
> Reflection が必要となるのは、非常に限定された処理であって、
> それに、Form1_Load を自前で呼び出すのも避けるべきです。
> イベントハンドラーを、普通のメソッドのように呼び出すことはもちろん可能ですが、
> これは本来「呼びだされる物」であって、「呼び出す物」ではありませんので。
なるほど、できるだけ使用しないべきという訳ではなく、特定の条件下で使用するのがベストなんですね。
今回のことでイベントハンドラーは呼び出される物だと分かったので、これからは「メソッドと同じ扱いはしない」
ということを肝に銘じておきます。
回答頂いた皆様、短い間ではありましたが、お付き合いいただき本当にありがとうございました!
まだまだ初心者ですが、皆様のおかげで多くのことを勉強することができました。
この場を借りてお礼申し上げます。
また今後お世話になることもあるかとは思いますが、その時はどうぞよろしくお願いします。
|