- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-01-21 12:47
引用:

rucioさんの書き込み (2003-01-21 09:57) より:

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


 これはコンポーネントを継承したコンポーネントを自作するときに、ISiteをインプリメントして、ISite.DesignModeプロパティを自分で作って変更するもの、だそうです。それ以外の場合はFalseが帰るようになっているそうです。
 その他、Design関係の属性も、コンポーネントを作成する上での話で、設計時/実行時を判別するようなものは、今のところ行き当たっていません。
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-21 14:45
Jittaさんご指摘ありがとうございます。
DesignModeについて調べてみましたがどうもわからないことが多いです。

フォームにプログラムするということは
「System.Windows.Forms.Formを継承した新しいフォームを自作」する
ことですから
「コンポーネントを継承したコンポーネントを自作」に該当します。

そこで、フォームにISiteをインプリメントしてみましたが
結局ISite.DesignModeプロパティを実装する段で
どう書いていいかわからないです。
まさかここでMe.DesignModeを返すようでは本末転倒です。
いったいISiteの実装とはどのように書いたらよいのでしょうか?

思うに次の2点から考えてコンストラクタでは特別な事情が
はたらいてDesignModeプロパティが機能していないのではないでしょうか?
・LoadイベントではDesignModeが期待通りの値を返す。
・System.Windows.Forms.Formも
そのたくさんあるどの基本クラスもISiteをインプリメントしていない。
どのインターフェイスに関しても同様。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-01-21 16:25
引用:

rucioさんの書き込み (2003-01-21 14:45) より:
Jittaさんご指摘ありがとうございます。
DesignModeについて調べてみましたがどうもわからないことが多いです。

フォームにプログラムするということは
「System.Windows.Forms.Formを継承した新しいフォームを自作」する
ことですから
「コンポーネントを継承したコンポーネントを自作」に該当します。


 ISiteインターフェイスのヘルプはご覧になったでしょうか。そこには「ISBNSite」のサンプルコーディングあり、それによると・・・

【適当に端折ります】
Class ISBNSite
Implements ISite
Private m_bDesignMode As Boolean

Public Sub New(ByVal actvCntr As IContainer, ByVal prntCmpnt As IComponent)
m_bDesignMode = False
End Sub

Public ReadOnly Property DesignMode() As Boolean Implements ISite.DesignMode
Get
Return m_bDesignMode
End Get
End Property
End Class

 なんと、Falseしか返さないようになっています!!どうも我々が考えているように、「設計時と実行時の区別」以外の意味で用意されているようです。

 MSDN Oct.2002をコンバインしたヘルプで、「設計 NEAR 時」「デザインモード」「実行 NEAR 時」「IDE」「設計 実行 判断」をキーに検索をかけましたが、こちらが意図しているモノは見つかりませんでした。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2003-01-21 18:04
DesignModeプロパティはrucioさんのおっしゃるとおり、コンストラクタでは機能しません。しかし、それ以外の場所(全部確認したわけではありませんが)、たとえばForm_Loadでは機能します。自分で実装するプロパティではありません。

本題はコンストラクタできちんと機能させたいということのようでしたが、それはどうもDesignModeではサポートできないようで、他の方がおっしゃっていたIDEへのパスで識別するなどのハックを行わなければならないようです。とはいっても、IDEはVS.NETだけとは限りませんので、そのようなハックが未来永劫機能するとも思えませんが。

継承フォームとは無関係なのですが、デザイナをサポートするコントロールはISupportInitializeを実装して、これのEndInitメソッドで実行時にのみ動作する内容を実装するようです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-01-22 08:55
引用:

NothingBut.NETFXさんの書き込み (2003-01-21 18:04) より:
DesignModeプロパティはrucioさんのおっしゃるとおり、コンストラクタでは機能しません。しかし、それ以外の場所(全部確認したわけではありませんが)、たとえばForm_Loadでは機能します。自分で実装するプロパティではありません。


 確認しました。以前、拾えなかったのはコンストラクタでやっていたのかな?当時作ったサンプルをOS再インストールの時に消してしまったらしく、なぜ「DesignModeでは判別できない」と思っていたのかはわかりません。

 コンストラクタではクラス自体がまだできていないので、メンバであるDesignModeも設定されておらず、デフォルト、もしくは参照するメモリがNULLクリアされているところを返す?様なものなのでしょう。
名古屋のサワコ
会議室デビュー日: 2003/01/17
投稿数: 6
投稿日時: 2003-02-06 10:00
サービスパックで改善されるとのことです。

実は、本件に関連してMicrosoftのサポートにも問い合わせを出していました。
継承元フォームのコンストラクタやフォームロードイベントで、WEBサービスへのインスタンスを生成している場合、WEBサービスでEnum型のメンバがある場合に、どうにもならないという問題があったんです。

で、MSの回答は開発ツールの不具合で、2003/3末にリリース予定のサービスパックで対応するとのことでした。
開発ツールの不具合とMSが認めているのが、継承元フォームのコンストラクタの実行が回避できないことなのか、WEBサービスでEnum型のメンバがあるサービスのインスタンスを生成した場合のみなのかは不明です。

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