- PR -

継承フォームをデザインすると継承元が実行される

投稿者投稿内容
名古屋のサワコ
会議室デビュー日: 2003/01/17
投稿数: 6
投稿日時: 2003-01-17 11:42
VBを知らぬまま、3日前からVB.netで開発をはじめたプログラマです。

実は、フォームが継承できると知り「すばらしい」と喜んでいたのですが・・・
VS.netの開発において、継承フォームをデザインしようとすると継承元フォームのイベントが走り、(フォームLOADイベントやコンストラクタに記述した処理)デザインができません。

これって普通の動きなんですか?
これだと非常に開発しにくい(というより無理)なんですが回避策などご存知の方は
教えて下さい。お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-01-17 19:33
引用:

名古屋のサワコさんの書き込み (2003-01-17 11:42) より:
VBを知らぬまま、3日前からVB.netで開発をはじめたプログラマです。

実は、フォームが継承できると知り「すばらしい」と喜んでいたのですが・・・
VS.netの開発において、継承フォームをデザインしようとすると継承元フォームのイベントが走り、(フォームLOADイベントやコンストラクタに記述した処理)デザインができません。

これって普通の動きなんですか?
これだと非常に開発しにくい(というより無理)なんですが回避策などご存知の方は
教えて下さい。お願いします。


 継承の仕様です。継承の子が作られるとき、継承の親のコンストラクタも実行されます。その辺はオブジェクト指向を勉強してください。
 イベントは、オーバーライド指定やればと思ったのですが、どちらも走っちゃいますね。同じ名前で宣言してみましたが、ダメでした。C++であれば::演算子で継承元を指定してイベントを外してやればいいのでしょうが、VBってそのあたり、どうするんでしょうね。イベント自体がPrivateになっているのでダメみたいですが。とりあえずの回避策としては、Object.ToString()の返値と、自分が定義したクラス名のハードコーディングを比較する、という手があります。あ、コンストラクタをこれで中途半端に抜けたらダメですよ。
 デザイン時にも走るのがとてもうっとうしいですが、これは回避方法が見つかっていません。BCB使いの私はComponent.DesignModeを使えばいいと思っていたのですが、全然別個のものでした。アプリケーションが実行しているパスを見て・・・という方法もあるようですが(ここの過去ログを検索してみてください)、あまり実用的ではないでしょう。
名古屋のサワコ
会議室デビュー日: 2003/01/17
投稿数: 6
投稿日時: 2003-01-20 09:26
Jittaさん、RESありがとうございます。

> 継承の仕様です。継承の子が作られるとき、継承の親のコンストラクタも実行されます。その辺はオブジェクト指向を勉強してください。

もちろん、実行時は走ってくれないと困ってしまうんですが・・・・
デザイン時に実行されるとなると、実行時にしか値の入らない変数とかがNullPointerExceptionになったりしてコケてしまったり、参照が実行できなかったりして、
デザイン画面が開けないんです。
これが仕様だとすると、画面のデザインがGUIで出来なくて・・・
「使えない」と思うんです。

すべての継承フォームがデザインし終わるまで、継承元フォームの処理を空っぽにしておくなんてことできないし。
そもそも、それじゃ継承を重ねていけないし、既存コードの活用はできないですよね。


JavaアプリケーションをJbuilderで開発しているときには、こんなことはなかったんですが・・・

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-01-20 15:41
>>すべての継承フォームがデザインし終わるまで、継承元フォームの処理を
>>空っぽにしておくなんてことできないし。
>>そもそも、それじゃ継承を重ねていけないし、
>>既存コードの活用はできないですよね。

 そっち方面ですか。これは失礼しました。
 確かに、イベントのオーバーライドを確認しているときも、Form1から継承してForm2を作ると、Form2のデザイナを開いたり、プロジェクトを読み込んだ時点でイベントが駆動し、うっとうしい思いをしました。Borlandの言語系ではグローバル変数に設計時なのか実行時なのかを判別できる定義があるのですが・・・同じものがないか、日本語ページ内はそこそこ探したのですが、見つかりませんでした。
 こちらに、実行されているパスから設計時なのか実行時なのかを判別する例があります。参考にしてみてください。
名古屋のサワコ
会議室デビュー日: 2003/01/17
投稿数: 6
投稿日時: 2003-01-21 09:51
Jittaさん、Resありがとうございます。

>>とりあえずの回避策としては、Object.ToString()の返値と、自分が定義したクラス名のハードコーディングを比較する、という手があります。

継承元フォームのコンストラクタのMe.ToString()の戻り値は、継承元フォームのクラス名になってしまいます。
なので、継承フォームのデザイン時に影響を与えることはできません。
いったい、ぜんたい、マイクロソフトさんはどーやって開発しろって言うんでしょうか・・・
八方塞で涙にくれています。
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-21 09:57
こんにちは。
Component.DesignModeを使えば何とかなりませんか?
名古屋のサワコ
会議室デビュー日: 2003/01/17
投稿数: 6
投稿日時: 2003-01-21 10:16
rucioさん、RESありがとうございます。

>>Component.DesignModeを使えば何とかなりませんか?

って、どうも拾えないみたいです。

継承フォームのデザイン時に継承元フォームのコンストラクタやLoadイベントが実行されないようにするために、継承元フォームに仕掛けてみましたが無視されました。

具体的には継承元フォームのNEWメソッドに

If Me.DesignMode Then
MsgBox("デザインモードだよん")
Else
MsgBox("デザインモードじゃないよん")
End If
とやって、継承フォームのデザインウィンドウを開くと
"デザインモードじゃないよん"とメッセージボックスがでます。(涙)

もちろんリビルド済みです。
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-21 11:01
とりあえずこれでしのげるようです。

Public Sub New()

MyBase.New()

If AppDomain.CurrentDomain.FriendlyName = "DefaultDomain" Then
MsgBox("デザインモードだよん")
Else
MsgBox("デザインモードじゃないよん")
End If

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。

End Sub

でも本当に「とりあえず」の急場しのぎです。
というのはAppDomain.CurrentDomain.FriendlyNameの意味が勉強不足でよくわからないからです。このコードは試行錯誤の結果です。

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