- PR -

プロパティ値がInitializeComponentに自動生成される件

投稿者投稿内容
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 16:52
こんにちわ。

ボタンを継承させたカスタムボタンを作成しました。
何がカスタムかというと、ボタンのBackColorやFontを外部XML定義ファイルから
読み込んで設定する機能が付加されています。

下記ソースでBackColorプロパティとFontプロパティは、
カスタムボタンを使用するクラスの
InitializeComponentに記述されることも無くうまく実装できました。

しかし、Sizeプロパティはオーバーライド不可の為、同じように実装できませんでした。

ポイントとしては、外部XML定義ファイルは随時更新されるものなので、
カスタムボタンクラスのコンストラクタで安易にSizeプロパティをセットしてしまうと
カスタムボタンを使用するクラスのInitializeComponent()に値が自動生成されて
変更ができなくなってしまう点です。

何か回避策がございましたらご教授お願いします。

===========================================================================
public class CustomButton : System.Windows.Forms.Button
{
// メンバ変数
private XMLFileReader xmlReader;

// コンストラクタ
public CustomButton()
{
xmlReader = new XMLFileReader();
}

// BackColorプロパティのオーバーライド
public override System.Drawing.Color BackColor
{
get { return XMLFileReader.BackColor; }
}

// Fontプロパティのオーバーライド
public override System.Drawing.Font Font
{
get { return XMLFileReader.Font; }
}

// ↑ここまでは成功

// ↓これはできない(Sizeプロパティはoverrride不可な為)

// Fontプロパティのオーバーライド
public override System.Drawing.Size Size
{
get { return XMLFileReader.Size; }
}
}
========================================================================

参考にしたサイト
http://www.microsoft.com/japan/msdn/net/general/custcodegen.asp#custcodegen_topic6
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14796&forum=7
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30051&forum=7&7 (前スレッド)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-20 17:00
引用:

DUKE更家さんの書き込み (2006-04-20 16:52) より:

しかし、Sizeプロパティはオーバーライド不可の為、同じように実装できませんでした。


C# では new キーワード、VB では Shadows キーワードで、
Setter を無視、DefaultValue を修飾することでできませんか?

根本的な解決にはならないかもしれませんが。

引用:

ポイントとしては、外部XML定義ファイルは随時更新されるものなので、
カスタムボタンクラスのコンストラクタで安易にSizeプロパティをセットしてしまうと
カスタムボタンを使用するクラスのInitializeComponent()に値が自動生成されて
変更ができなくなってしまう点です。


XML からの変更以外は受け付けなくしたい、ということでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 17:11

>XML からの変更以外は受け付けなくしたい、ということでしょうか?

現在その方向で考えています。
ですのでSetもできないようにしています。

そもそもボタンのカプセル化は無理があったのでしょうか、、、
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-20 17:17
引用:

DUKE更家さんの書き込み (2006-04-20 17:11) より:

現在その方向で考えています。
ですのでSetもできないようにしています。
そもそもボタンのカプセル化は無理があったのでしょうか、、、


変更不可自体は先のように Setter を無効化すれば見た目上は可能だと思います。
プロパティが見えてしまうことに違和感があるならば、属性を使ってインテリセンス上からなら消せます。

が、そこまで制限する必要があるようには思えません...
方向性としては「読み込ませる機能まで内包する」ということでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 17:34
ジャンヌメット様、度々ご返答ありがとうございます。

>変更不可自体は先のように Setter を無効化すれば見た目上は可能だと思います。
はい。変更不可に関してはこれで十分要求は満たされています。

>方向性としては「読み込ませる機能まで内包する」ということでしょうか?
どちらかというとこちらの方が重要でして、
overrideできないプロパティもXMLから取得したデータを設定したいのです。

「できたらいいな」順だと
1、overrideできないものを裏技でoverrideしてしまう
2、カスタムボタンクラス呼び出し元のInitializeComponentに記述されないイベント内でSizeプロパティを設定する
3、Sizeに関してはxml定義をあきらめて、サイズパターン分カスタムボタンを作る
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-20 18:02
引用:

DUKE更家さんの書き込み (2006-04-20 17:34) より:

2、カスタムボタンクラス呼び出し元のInitializeComponentに記述されないイベント内でSizeプロパティを設定する


プロパティをシャドウして、これくらいしか思いつきません。
DefaultValue 属性は決め打ちでないとできませんから...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-20 18:04
というより、継承ではなく自作コントロールの方が良いでしょう。
異質なものを求めるのであれば、妥当と言えます。

が、いずれにしても、個人的にはお勧めできません...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 18:21
>というより、継承ではなく自作コントロールの方が良いでしょう。
>異質なものを求めるのであれば、妥当と言えます。
>が、いずれにしても、個人的にはお勧めできません...

確かにそうですね。別の道も検討してみます。
本来のボタンクラスの機能を大幅に制限することにもなりますし。

今回は、
1、全ての画面リソースのプロパティはxmlファイルで一括管理
2、画面リソース作成者は一切のプロパティ変更を禁止
3、画面リソース作成者はノンプログラミングで実装
という要求があったので、少々ここに無理があったのかもしれません。

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