- - PR -
継承フォームをデザインすると継承元が実行される
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-01-21 12:47
これはコンポーネントを継承したコンポーネントを自作するときに、ISiteをインプリメントして、ISite.DesignModeプロパティを自分で作って変更するもの、だそうです。それ以外の場合はFalseが帰るようになっているそうです。 その他、Design関係の属性も、コンポーネントを作成する上での話で、設計時/実行時を判別するようなものは、今のところ行き当たっていません。 | ||||
|
投稿日時: 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をインプリメントしていない。 どのインターフェイスに関しても同様。 | ||||
|
投稿日時: 2003-01-21 16:25
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」「設計 実行 判断」をキーに検索をかけましたが、こちらが意図しているモノは見つかりませんでした。 | ||||
|
投稿日時: 2003-01-21 18:04
DesignModeプロパティはrucioさんのおっしゃるとおり、コンストラクタでは機能しません。しかし、それ以外の場所(全部確認したわけではありませんが)、たとえばForm_Loadでは機能します。自分で実装するプロパティではありません。
本題はコンストラクタできちんと機能させたいということのようでしたが、それはどうもDesignModeではサポートできないようで、他の方がおっしゃっていたIDEへのパスで識別するなどのハックを行わなければならないようです。とはいっても、IDEはVS.NETだけとは限りませんので、そのようなハックが未来永劫機能するとも思えませんが。 継承フォームとは無関係なのですが、デザイナをサポートするコントロールはISupportInitializeを実装して、これのEndInitメソッドで実行時にのみ動作する内容を実装するようです。 | ||||
|
投稿日時: 2003-01-22 08:55
確認しました。以前、拾えなかったのはコンストラクタでやっていたのかな?当時作ったサンプルをOS再インストールの時に消してしまったらしく、なぜ「DesignModeでは判別できない」と思っていたのかはわかりません。 コンストラクタではクラス自体がまだできていないので、メンバであるDesignModeも設定されておらず、デフォルト、もしくは参照するメモリがNULLクリアされているところを返す?様なものなのでしょう。 | ||||
|
投稿日時: 2003-02-06 10:00
サービスパックで改善されるとのことです。
実は、本件に関連してMicrosoftのサポートにも問い合わせを出していました。 継承元フォームのコンストラクタやフォームロードイベントで、WEBサービスへのインスタンスを生成している場合、WEBサービスでEnum型のメンバがある場合に、どうにもならないという問題があったんです。 で、MSの回答は開発ツールの不具合で、2003/3末にリリース予定のサービスパックで対応するとのことでした。 開発ツールの不具合とMSが認めているのが、継承元フォームのコンストラクタの実行が回避できないことなのか、WEBサービスでEnum型のメンバがあるサービスのインスタンスを生成した場合のみなのかは不明です。 |