■90173 / inTopicNo.6) |
Re[4]: カスタムコントロールのデフォルト値を設定するには? |
□投稿者/ 魔界の仮面弁士 (2053回)-(2019/02/14(Thu) 00:47:21)
|
■No90172 (魔界の仮面弁士) に追記 > 指定があった場合は、普通にインスタンス化した後でプロパティが指定されるだけなので、 > 特に問題は無いでしょう。 > 指定が無い場合は、作成したコントロール側の最初の振る舞いに依存します。
たとえば、こんな感じのフォームがあるとします。 System.Windows.Forms.GroupBox が 2 つと System.Windows.Forms.TextBox が 4 つあるフォームです。
Form1 (Font 既定値 … MS UI Gothic, 9pt) ├GroupBox1 (Font 未設定) │├TextBoxA1 (Font 未設定) │└TextBoxB1 ("MS ゴシック, 20pt") └GroupBox2 ("MS UI Gothic, 20pt") ├TextBoxA2 (Font 未設定) └TextBoxB2 ("MS ゴシック, 20pt")
上記フォームの作成手順としては、まず GroupBox1 と GroupBox2 を Form1 に貼り、 GroupBox1 の Font は未設定(MS UI Gothic, 9pt)、 GroupBox2 の Font は "MS UI Gothic, 20pt" にします。
GroupBox1 の上に 2 つのテキストボックス TextBoxA1 と TextBoxB1 を貼り、 GroupBox2 の上に 2 つのテキストボックス TextBoxA2 と TextBoxB2 を貼ります。
TextBoxA1 と TextBoxA2 の Font は未設定、 TextBoxB1 と TextBoxB2 の Font は "MS ゴシック, 20pt" とした状態です。これで準備完了。
この時、Form1 のデザイン時画面で各テキストボックスのプロパティグリッドを見ると、 TextBoxB1 / TextBoxB2 の Font プロパティの行は太字で表記されていますが、 TextBoxA1 / TextBoxA2 の Font プロパティの行は未設定なので、太字表現になっていないはず。
そもそも Font プロパティはアンビエントである物なので、基本的には 親コントロールの Font を受け継ぐことになっています。 そのため、TextBoxA1 と TextBoxA2 の Font の値は、 どちらも未設定ではありますが、両者が示す値は異なっており、 TextBoxA1 は "MS UI Gothic, 9pt" で、 TextBoxA2 は "MS UI Gothic, 20pt" として扱われます。
―――という点を踏まえた上で。
もしもテキストボックスを継承して、画面に貼った直後に Font が "Arial, 12pt" に設定されるようにしたいとしましょう。
その場合、新規にコントロールを貼る場合は良いとして、 既存の上記フォーム画面を開いた場合、各 Font の振る舞いはどうあるべきかを 考える必要があると思います。
TextBoxB1, TextBoxB2 の Font は、設定された通り "MS ゴシック, 20pt" のままで良いとして、 問題は Font 未設定である TextBoxA1 と TextBoxA2 の扱い。
Form1.designer.vb 上で Font プロパティがシリアライズされていない以上、 Font 設定済み(プロパティグリッド上で太字表現)の状態にはなりえないはず。
となると、「未設定時は "Arial, 12pt" とみなす」ようにするか、 「未設定時は従来通り、親 Font を受け継ぐ」実装にするのかの二択では無いでしょうか。 (試していませんけれども)
未設定時の既定値を割り当てる方法については、 No90168 で述べた通りですし、 InitializeComponent からシリアライズされた値を受け取るタイミングで対処したいなら No90171 でも用いたデザイナクラスで処置できるんじゃないかな…? (自信無し)
http://systemartlaboratory.com/netdefaultvalue.html
|
|