DOBON.NETプログラミング道掲示板

■35161 / 1階層)  TEXTBOXのプロパティを文字列に
□投稿者/ 魔界の仮面弁士 大御所(1452回)-(2022/10/08(Sat) 15:23:38)
  • アイコン2022/10/09(Sun) 12:06:32 編集(投稿者)

    No35159に返信(ま〜さんの記事)
    > TEXTBOXのプロパティを文字列に
    > TextBox.Font などを文字変数にしたい。どのFontが使われているのか知りたい

    何のために Font の値を知りたいのでしょうか?
    その目的によっては、話が変わってくるかもしれません。


    というのも、TextBox の Font プロパティや
    Label の ForeColor プロパティといったものは
    アンビエント(ambient)なプロパティであるからです。

    Font が未設定の場合、親コントロールの Font に依存した値になるため、
    設定値を保持しておいて再設定するような目的なのか、
    現在のフォント設定の内容を知るだけで良いのかでは、
    そのための対処方法が変わってくることがあります。


    たとえば、新規 Form に TextBox1 と TextBox2 を貼って、
    それぞれの Font プロパティを見ると
     "MS UI Gothic, 9pt"
    と細字で表示されるかと思います。
    この時、TextBox1 側のフォントを
     "MS ゴシック, 18pt"
    に変更すると、プロパティ ウィンドウ上の Font 欄の値が太字になると思います。

    その後、TextBox1 を "MS UI Gothic, 9pt" に設定しなおしてみます。
    この段階で、TextBox1 と TextBox2 の Font の値はいずれも
     "MS UI Gothic, 9pt"
    という同じ値に見えますが、TextBox1 は設定済み、TextBox2 は未設定という
    差異がありますのでプロパティ ウィンドウの Font プロパティに値を見ると、
    TextBox1 の方だけは太字で表示されていることが分かります。

    この時点で、親コントロールである Form の Font を
     "MS 明朝, 15pt"
    に変更すると、変更されていた TextBox1 の値は "MS UI Gothic, 9pt" のままで
    TextBox2 の方は、Form 側の Font 設定と同じ状態になります。

    Form の Font を "MS UI Gothic, 9pt" に戻せば、TextBox1 と TextBox2 の Font は、
    共に "MS UI Gothic, 9pt" に戻りますが、この時点で、2 つの TextBox の Font プロパティは
    「同じ状態に見えるが、実は異なっている」ことになりますよね。


    …ということで、上記も踏まえて記述するならばこんな感じ。


    'PropertyDescriptor を使って、Font プロパティの値を永続化する必要があるかどうかを調べます。
    Dim pdFont = TypeDescriptor.GetProperties(TextBox1).Find("Font", False)
    If pdFont.ShouldSerializeValue(TextBox1) Then
      Label1.Text = "Font が設定済みなので永続化が必要"
    Else
      Label1.Text = "Font は未設定なので永続化は不要"
    End If

    'Font プロパティの値を文字列として保持する
    Label2.Text = pdFont.Converter.ConvertToInvariantString(TextBox1.Font)

    '--- 以下はおまけ ---
    '
    '文字列として保存された Font 値を、実際の Font オブジェクトに復元する
    'Label3.Font = DirectCast(pdFont.Converter.ConvertFromInvariantString(Label2.Text), Font)

    'TextBox の Font プロパティをリセットする
    'If pdFont.CanResetValue(TextBox1) Then
    '  pd.ResetValue(TextBox1)
    'End If


    ちなみに最後の ResetValue メソッドですが、これの代わりに
    Font プロパティのリセットを
     TextBox1.ResetFont()
    あるいは、
     TextBox1.Font = Nothing
    と書いてリセットすることもできます。

    同様に、ForeColor プロパティのリセットは
     TextBox1.ResetForeColor()
    で行えますし、あるいは
     TextBox1.ForeColor = Color.Empty
    とも書けます。

    この他、Enabled プロパティなどを保存しておくような場合も、
    ShouldSerializeValue 判定を併用しないと正しく保持できなかったりします。

    シリアライズが目的ではなく、現在値を確認したいというだけの意図ならば、
    TextBox1.Enabled.ToString() を保持するだけで良いですけれどね。



    > 初歩的な質問で申し訳ないのですが
    分からないことにたいして、それが技術的に初歩的な事柄であるのかどうかを、
    どうやって判断しているのかが、微妙に気になってみたり…。
    (「初歩的な質問かも知れませんが」という表現なら分からなくも無いのですが)
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←TEXTBOXのプロパティを文字列に /ま〜 →Re[2]: TEXTBOXのプロパティを文字列に /まー
→Re[2]: TEXTBOXのプロパティを文字列に /ま〜
 
上記関連ツリー

Nomalアイコン TEXTBOXのプロパティを文字列に / ま〜 (22/10/07(Fri) 16:49) #35159
Nomalアイコン TEXTBOXのプロパティを文字列に / 魔界の仮面弁士 (22/10/08(Sat) 15:23) #35161 ←Now
│├Nomalアイコン Re[2]: TEXTBOXのプロパティを文字列に / まー (22/10/11(Tue) 12:53) #35162
│└Nomalアイコン Re[2]: TEXTBOXのプロパティを文字列に / ま〜 (22/10/11(Tue) 16:59) #35163
│  └Nomalアイコン Re[3]: TEXTBOXのプロパティを文字列に / 魔界の仮面弁士 (22/10/11(Tue) 19:04) #35164
│    └Nomalアイコン Re[4]: TEXTBOXのプロパティを文字列に / まー (22/10/13(Thu) 11:10) #35166
Nomalアイコン Re[1]: TEXTBOXのプロパティを文字列に / KOZ (22/10/08(Sat) 14:26) #35160
  └Nomalアイコン Re[2]: TEXTBOXのプロパティを文字列に / ま〜 (22/10/18(Tue) 17:17) #35171 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -