- PR -

継承元Formのプロパティの保護

1
投稿者投稿内容
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2005-06-07 12:01
Formで作成した画面を継承元として、
他複数の画面で継承しています。
VB.NETです。

継承元画面のプロパティを継承先で変更できないよう、
保護するしくみを考えているのですが、
プロパティをシャドウする方法だと、下記のようになってしまいます。

Private mKeyPreview As Boolean = True
Public Shadows ReadOnly Property KeyPreview() As Boolean
Get
Return mKeyPreview
End Get
End Property

この場合、継承元画面のデザイナのプロパティでは「KeyPreview」プロパティを変更できるのですが、「Me.KeyPreview」のプロパティ設定のソースが自動生成され、「ReadOnly」のためエラーになってしまいます。

継承元画面のプロパティはデザイナのプロパティページで変更することができ、継承先では「ReadOnly」となる状態が望ましいのですが、実現する方法はあるのでしょうか?

ご意見をいただけるとありがたいと思います。
よろしくお願いします。
会議室デビュー日: 2005/05/07
投稿数: 13
お住まい・勤務地: 北海道はでっかいどう
投稿日時: 2005-06-07 14:11
こんにちは。

継承先のフォームで、System.ComponentModel 名前空間を利用します。
そしてReadOnlyAttributeクラスをTrue(読取専用)にすることで実現可能です。
継承元画面のプロパティはデザイナのプロパティページで変更することができ、
継承先画面のプロパティはデザイナでは「ReadOnly」となります。
下記に、継承先フォームの記述例を示しますので、試してみてください。

----------------------------------------------------------------
Imports System.ComponentModel

Public Class Form1
Inherits WindowsApplication1.BaseForm 

  " Windows フォーム デザイナで生成されたコード "

Private mKeyPreview As Boolean = True
<ReadOnlyAttribute(True)> _
Public Shadows ReadOnly Property KeyPreview() As Boolean
Get
Return mKeyPreview
End Get
End Property
----------------------------------------------------------------

お役に立てれば幸いです。ではでは
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2005-06-07 14:58
黛さん、ありがとうございます。

継承先画面にて、
ご返答いただいたように、プロパティの記述を行ってみました。
しかし、
デザイナのプロパティページには特に変化はなく、
値が変更できる状態となったままでした。

ちなみに、このようなプロパティの属性設定は、
このプロパティを持つクラスの画面デザイナに
適用可能なものなのでしょうか?

やり方が悪いのか、理解が足りないか、
もしよろしければもう少し教えていただけませんか?

よろしくお願いします。
会議室デビュー日: 2005/05/07
投稿数: 13
お住まい・勤務地: 北海道はでっかいどう
投稿日時: 2005-06-07 15:40
記述方法は間違っていないはずですので、
リビルドを行ってみてください。
画面デザイナに反映されるはずです。

ちなみに 継承元のフォームはこんな感じになっているはずです。
--------------------------------------------------------------
Public Class BaseForm
Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
(省略)
#End Region

Private mKeyPreview As Boolean = True

Public Shadows ReadOnly Property KeyPreview() As Boolean
Get
Return mKeyPreview
End Get
End Property
(以下略)
--------------------------------------------------------------

ユーザが指定できるプロパティの属性については、
各々の画面クラスごとに有効です。

「Category」や「Description」を設定することにより、プロパティの説明を
画面デザイナのプロパティウィンドウ上に表示することもできます。
詳しくはMSDN等でご確認ください。

ではでは。
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2005-06-07 16:30
黛さん、たびたびありがとうございます。

最初の投稿の書き方が悪かったようで、申し訳ありません。

継承元が元のままなら、継承先でプロパティを記述しなくても
継承先で「ReadOnly」は実現できていました。

継承元が元のままの場合、
継承元の画面デザイナのプロパティページでプロパティ設定を変更した後、
継承元のソースコードを表示したときに、ソースの自動生成で
「Me.KeyPreview = True」
が生成され、
「KeyPreview」は「ReadOnly」のため記述エラーになってしまいます。

そのため、
「Public Shadows ReadOnly Propery」
の記述方法ではうまく制御できないのではないかと、考えていました。

書き方が悪かったようで、申し訳ありませんでした。
会議室デビュー日: 2005/05/07
投稿数: 13
お住まい・勤務地: 北海道はでっかいどう
投稿日時: 2005-06-07 16:53
fujiさんの説明から私が理解した内容でコードを書くと
下記のようになります。

-----------------------------------------
◆構成
Solution1
└WindowsApplication1
_└参照設定
_└AssemblyInfo.vb
_└BaseForm.vb
 └Form1.vb

------------- 継承元ここから ------------------
Imports System.ComponentModel

Public Class BaseForm
Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
(省略)
#End Region

Private mKeyPreview As Boolean

<ReadOnlyAttribute(True)> _
Public Shadows Property KeyPreview() As Boolean
Get
Return mKeyPreview
End Get
Set(ByVal Value As Boolean)
mKeyPreview = Value
End Set
End Property

End Class
------------- 継承元ここまで ------------------

------------- 継承先ここから ------------------
Public Class Form1
Inherits WindowsApplication1.BaseForm
#Region " Windows フォーム デザイナで生成されたコード "
(省略)
#End Region

Private mKeyPreview As Boolean

Public Shadows Property KeyPreview() As Boolean
Get
Return mKeyPreview
End Get
Set(ByVal Value As Boolean)
mKeyPreview = Value
End Set
End Property

End Class
------------- 継承先ここまで ------------------


こんな感じでいかがでしょう?

継承元の画面デザイナで「KeyPreview」プロパティを変更し、
リビルドすると、継承先の画面にも反映されます(継承先でデザイナ上は読取専用)です。
この記述方法だと、エラーは起きません。

お役に立てば幸いです。ではでは


[ メッセージ編集済み 編集者: 黛 編集日時 2005-06-07 16:54 ]
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2005-06-07 17:19
黛さん、ありがとうございます。

なるほど、です。
ようやく理解できました。

ちなみに、継承元の記述のみで、
継承先の記述がなくても同じように実現可能のようです。

この方法で進めてみようと思います。
ありがとうございました。
1

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