- PR -

フォームの継承

投稿者投稿内容
みのひき
常連さん
会議室デビュー日: 2003/07/17
投稿数: 26
投稿日時: 2003-07-17 20:39
お疲れ様です。
質問させてください。

現在、VB.NETの開発をVisual Studioを使って行っています。
その機能を使って『Windowsフォームの継承』を行うと、
下記のエラーが発生する場合があります。

『オブジェクト参照がオブジェクト インスタンスに設定されていません。』

うまくいく場合もあるのですが、一度このエラーが表示されると
その後復活することはありません。
どういう理由で発生するかご存知の方、
アドバイスをお願いいたします。

以上、よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-17 22:01
こんにちは。
引用:

みのひきさんの書き込み (2003-07-17 20:39) より:

その機能を使って『Windowsフォームの継承』を行うと、
下記のエラーが発生する場合があります。

『オブジェクト参照がオブジェクト インスタンスに設定されていません。』

うまくいく場合もあるのですが、一度このエラーが表示されると
その後復活することはありません。
どういう理由で発生するかご存知の方、
アドバイスをお願いいたします。



このエラーは、「作成していないオブジェクトを参照しようとしている」
という意味にとらえてください。
#そのエラーのヘルプは参照しました?
どういうとき、、、たとえば、

public sub hoge(byref a as object)
dim b as object
a = b
end sub
・・・う〜ん、我ながらむちゃくちゃな例・・・
こんな場合に発生します。bというobject型の変数は、
作成していないのにaというオブジェクト型の変数に代入(参照の代入)
をしようとしています。

おそらく、コード上にこういう箇所があると思います。
一度よく見直してみてください。
みのひき
常連さん
会議室デビュー日: 2003/07/17
投稿数: 26
投稿日時: 2003-07-18 12:56
お疲れ様です。

返信ありがとうございます。

ただ、仮に下のようなソースが存在した場合、
実行時にエラーが発生するのではないでしょうか。

実行してもエラーは発生せず、
継承元のフォームに記述されているソースで
実行時に処理されない部分はない状態です。

念のため、ソースを見直してみましたが、
インスタンスを作成せずにオブジェクトを使用している部分は
ないかと思います。

他に何か考えられる事はないでしょうか?

よろしくお願いいたします。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-07-18 13:09
エラーメッセージを別の解釈をすると、
「作成したけど既に破棄したインスタンスを参照している」
というのもありですね。

エラーメッセージから答えられることはエラーメッセージの意味だけです。

「ミドルウエア等にバグがある」「単に間違った組み方をしている」等が原因で出るメッセージではないかと思います。
みのひき
常連さん
会議室デビュー日: 2003/07/17
投稿数: 26
投稿日時: 2003-07-18 13:29
お疲れ様です。

申し訳ありませんでした。
お二人の言うとおりでした。

Moduleにグローバル変数のような扱いとして
宣言してあるクラス(ログイン時にインスタンス生成)
を使用しているソースがありました。

それをコメントにするとフォームの継承が行えました。
ありがとうございました!

そこでもう一つ質問させてほしいのですが、
フォームの継承というのはあくまで
画面(見た目)だけという意味なのでしょうか?

共通ロジックは書かないほうがよいというか・・・、
今回のように継承元ではインスタンス生成しないが、
実行した場合は、その画面が表示されるときには
かならずインスタンス生成されているようなオブジェクト
は記述できないのでしょうか?

以上です。
よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-20 16:59
まずは解決、何よりです。

引用:

みのひきさんの書き込み (2003-07-18 13:29) より:

フォームの継承というのはあくまで
画面(見た目)だけという意味なのでしょうか?

共通ロジックは書かないほうがよいというか・・・、


 フォームという『クラス』を継承するのですから、
『スーパークラス』として継承することは何の問題もありません。
下位のクラスが実装すべきロジックを、
コードを書く手間の削減という意味で含めてしまうことも、問題ないでしょう。
ただ、それでは「継承」というものが満足していない、、、らしいです。
すみません、私も先日まで「継承」を、
書く量削減くらいの意味でしか見ていませんでしたので、
あまり偉そうなことはいえません。

[quote]
今回のように継承元ではインスタンス生成しないが、
実行した場合は、その画面が表示されるときには
かならずインスタンス生成されているようなオブジェクト
は記述できないのでしょうか?
[quote]
こんな風にします。

class Parent
inherits form
public PublicInstance as form
end class

class Child
inherits Parent
public sub New()
MyBase.New()
PublicInstance = New Form()
end sub
end class

このように、子フォームのNewで、インスタンス化します。

もちろんこの場合、PublicInstanceは、子供同士では共有されていません。
子供同士で共有したい場合は、子供の実の親に持たせます。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-07-21 09:54
みのひきさん、Jittaさん、こんにちは。
引用:

Jittaさんの書き込み (2003-07-20 16:59) より:
下位のクラスが実装すべきロジックを、
コードを書く手間の削減という意味で含めてしまうことも、問題ないでしょう。
ただ、それでは「継承」というものが満足していない、、、らしいです。
すみません、私も先日まで「継承」を、
書く量削減くらいの意味でしか見ていませんでしたので、
あまり偉そうなことはいえません。


設計者が思想を持って横着しており、その設計思想が他社に対して明確になっていればいいじゃないかと思います。

闇雲に上位クラスにロジックを書いて後でわけのわからない分岐だらりなったりするなら下位クラスに書いた方がいいですが、最初から上位クラスで分岐させる設計方針もありの言語だと思います。「今が楽」で「先々も楽だろう」にするにはどこに書いたらいいだろうって考えます。

「オブジェクト指向に反する」と言われたら「だってオブジェクト指向じゃないもん!」でいいんじゃないでしょうか?
オブジェクト指向を強く意識するならVB.Netは使わないほうがよいと思います。
みのひき
常連さん
会議室デビュー日: 2003/07/17
投稿数: 26
投稿日時: 2003-07-22 09:49
お疲れ様です。

Jittaさん、ラフィンさん、解答ありがとうございました。

今回は、共通の処理は別のクラスに持たせ、
各継承先のフォームでそのクラスを生成して
使用するという方法で実装することにしました。

アドバイスありがとうございました!
助かりました。

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