- PR -

継承されたフォームに貼り付けられたコンポーネントの取得方法

投稿者投稿内容
味噌汁まんぼう
会議室デビュー日: 2008/02/27
投稿数: 14
投稿日時: 2008-02-27 14:21
いつも参考にさせていただいております。
少し困っていることがあるので、投稿させていただきました。

チームメンバーが継承して使用できるフォームを作成しているのですが、
継承されたフォームに貼り付けられたタイマを取得したいのです。
(正確に言うと、タイマはフォームに「貼り付ける」ことはできませんが…)

具体的には、継承元フォームのForm#OnLoadメソッドで処理をしたいと思っています。
Form#Controlsプロパティで、ボタンなどのコントロールは取得できますが、
タイマのようなコンポーネントを取得する方法がわかりません。

環境はWindowsXP,VS2005,.NET2.0、言語はC#を使っています。

どなたかご教授いただければ幸いです。


[ メッセージ編集済み 編集者: 味噌汁まんぼう 編集日時 2008-02-27 14:24 ]
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2008-02-27 14:32
子Formに貼り付けたタイマーを親Formで使いたいっていうことですか?
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-27 14:40
タイマーの変数をPublic or Protectedにすれば良いです。

それが嫌ならリフレクションを使用して見つけてください。

参考になればと思います。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2008-02-27 16:30
引用:

Form#Controlsプロパティで、ボタンなどのコントロールは取得できますが、



派生先は基底クラスを知っていますので、「Controlsから探し出す」という行為は不自然だと思います。
indigo-xさんの言われるようにアクセス修飾子を変更して直接アクセスするか、そのボタンを表す機能(仕様)レベルのProtectedなプロパティやフィールドを持つというほうがよいでしょう。
#OKボタンの名前がbuttonOkであろうとbuttonNextであろうと、OKButton プロパティを見ればよいとか。

規模や生産性の観点で一概には言えませんが
何でもアクセス可能にするより、いわゆるProtectedなメソッドなどで
派生先がどんなことをどんなタイミングでできるかを仕様として明示的に実装したほうがよいということもあります。
味噌汁まんぼう
会議室デビュー日: 2008/02/27
投稿数: 14
投稿日時: 2008-02-28 13:18
☆ガルマ・ザビさん
ご回答ありがとうございます。

>子Formに貼り付けたタイマーを親Formで使いたいっていうことですか?
そうです。
具体的には、
子Form(継承したフォーム)に貼り付けられたタイマーを、
親Form(継承元フォーム)で一律に停止できればと思っています。

☆indigo-xさん
ご回答ありがとうございます。

すいません、書き方が悪かったようで、
継承元フォームに貼り付けたタイマを、
継承したフォームで使用する方法を質問しているように、
捉えられていただいていると思います。

この逆がしたいのですが、その方法がわからず困っているところです。

☆まどかさん
ご回答ありがとうございます。

すいません、書き方が悪かったです。
まどかさんもindigo-xさんと同じように、
私の質問を捉えられていただいていると思います。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-02-28 13:31
解としては
コード:

派生Form frmEx = this as 派生Form;
if( frmEx != null )
{
frmEx.Timer = 〜〜〜 // Timer参照
}


で、参照できます。(無論、派生FormのTimerはアクセスできるレベル[public or internal]であること)

でも・・・クラス継承の理念?概念?に反しています。
なぜ派生フォームのオブジェクトを派生元が意識しなければならないのでしょう。
派生フォームにて処理すれば良いのでは?

と、思う次第であります。

[追記]
派生したフォーム全てに、Timerが存在するならば
派生元にTimerを用意しておくべきです。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-02-28 13:34 ]
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-28 13:50
こんな感じかな(多分、要望とは違いますが)
親に
protected virtual Timer timer {
get { return null; }
}
子に
protected override Timer timer {
get { return timer1; }
}

意味的にはくまっちさんと同じですが。。。。

多分、要望は不定のtimerを見つけたいと言う意味だと思うの
で通常では無理です(リフレクションしかないと思います)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-02-28 14:20
引用:

子Form(継承したフォーム)に貼り付けられたタイマーを、
親Form(継承元フォーム)で一律に停止できればと思っています。



おもしろい設計ですね。

すべての派生クラスがタイマを実装するのなら、どうして基底クラスの方にタイマを実装しなんでしょうか?

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