- PR -

[VB2005] DefaultValue に定数以外を使用したい

投稿者投稿内容
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2007-11-07 20:24
 標準の TextBox から継承した UserTextBox コントロールにおいて、BackColor の既定値を My.MySettings.Default.〜 に定義した色(IDEからはアプリケーションの設定で行え、.config ファイルに内容が書かれる)にする、というのは不可能なんでしょうか?

Public Class UserTextBox : Inherits System.Windows.Forms.TextBox

 <System.ComponentModel.DefaultValue(My.MySettings.Default.TextBoxBackColor)> _
 Public Overrides Property BackColor() As System.Drawing.Color
  Get
   Return MyBase.BackColor
  End Get
  Set(ByVal value As System.Drawing.Color)
   MyBase.BackColor = value
  End Set
 End Property

 Public Sub New()
  Me.BackColor = My.MySettings.Default.TextBoxBackColor
 End Sub

End Class


とやりたいところなんですが、当然ながら My.MySettings.Default.TextBoxBackColor が定数でないためダメになってしまいます。

 My.MySettings.Default.TextBoxBackColor に相当する色をプログラム内に定数で書くことには抵抗あります。
 System.ComponentModel.DefaultValue 〜 を書かないと、案の定コントロールを張った先で Me.UserTextBox.BackColor = 〜 とコードが出来てしまいます。

 貼った先で BackColor を My.MySettings.Default.TextBoxBackColor に Binding すれば結果的に所望の動作はするのですが、何となく美しくありません。

 何か良い手はないでしょうか。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-07 21:04
configファイルに設定する方法は、自力でがんばるしかないと思います。
初期値のほうは、C#の場合であれば以下のような書き方が可能です。
[DefaultValue(typeof(Color),"Red")]

インタフェースは同じだと思いますので、VB.NETででも同じような書き方が出来るのではないでしょうか?
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2007-11-07 21:09
引用:

[DefaultValue(typeof(Color),"Red")]


 これだと、config ファイルの値が Red の時は所望の動作をしてくれるんですが、Red 以外に変更したら DefaultValue の中身も一緒に変えてあげないいけなくなります。
 忘れるとコントロールを貼った先で美しくないコードが生成されてしまうんです。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-11-07 21:24
configで「型の属性」を変えることが出来たとして
その場合、「型のバージョン」はどうなるのでしょうか?
そういう意味ではこばさんの言われていることは矛盾しています。
DefaultValueはコード生成というレベルの話でありコンパイル以降は意味がありません。

また、外部ファイルに値を出したということはインスタンスに対して代入行為が必要だという事実が生まれます。
それからすると書かれたようにコンストラクタで代入だけで十分なのではないでしょうか。

この相反する二つの事柄を踏まえて、結局何が実現されればいいのかをまずはっきりさせたほうがよいかと思います。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2007-11-07 21:38
引用:

configで「型の属性」を変えることが出来たとして
その場合、「型のバージョン」はどうなるのでしょうか?
がよいかと思います。



 そうですね。型の問題もありました。
 最終的にやりたいことは、TextBox から継承して作った UserTextBox において、BackColor を config ファイルで設定した値にしたい、ということです。

 最初の頃は config ファイルにて TextBoxBackColor = Color.Red と定義してあったとして、途中から Color.Green に変更する、更に納品直前になって Color.Yellow に変更するかもしれない、そういうことを想定したいのです。


Case.1 / DefaultValue を設定しない場合
 Config ファイル値が Color.Red のときにデザインしたフォームには UserTextBox.BackColor = Color.Red のコードが生成されてしまいます。

Case.2 / DefaultValue を設定した場合
 Config ファイル値の変更にあわせて DefaultValue の中もメンテしないと Case.1 と同じようなことがおきます。


 元の UserTextBox の BackColor を config ファイルの値に Binding した場合でも、UserTextBox を貼った先では DefaultValue と異なる場合にはコードが生成されてしまいます。

 「そこまで求めるな」的な質問なのかもしれませんが・・・
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-11-07 21:46
引用:

 最終的にやりたいことは、TextBox から継承して作った UserTextBox において、BackColor を config ファイルで設定した値にしたい、ということです。



型として決定できないのであれば、
コンストラクタのInitializeComponent以降で代入するしかないと思います。
ただし、利用する側のデザインでのプロパティ設定は意味がなくなります。
その場合利用する側のコードで設定することになります。
このことから利用者が個別に設定する場合はどうするの?ということも考慮点の一つですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-07 21:49
default を、「省略時解釈」と訳すから、混乱するのではないでしょうか。
「やるべきことをやっていないときに、どうやってごまかそうか」と訳せば、そもそも「指定していないことがおかしい」とならないでしょうか。
# 金融関係の人に「デフォルトで」なんて言ったらダメですよ。


> 「そこまで求めるな」的な質問なのかもしれませんが・・・
そう思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-08 00:41
まあムリですし、私も大反対ですね。 DefaultValueAttribute に "そこまで求めるな" というより、求めているものがお門違いだと思います。 初期値ではなくて既定値ですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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