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

■35159 / 親記事)  TEXTBOXのプロパティを文字列に
  
□投稿者/ ま〜 一般人(1回)-(2022/10/07(Fri) 16:49:59)
  • アイコン環境/言語:[Vb.NET] 
    分類:[.NET] 

    はじめまして初心者です
    初歩的な質問で申し訳ないのですが
    TEXTBOXのプロパティを文字列に
    TextBox.Font などを文字変数にしたい。どのFontが使われているのか知りたい
    宜しくお願いします
    Vs2022 basic です


マルチポストを報告
違反を報告
引用返信 削除キー/
■35160 / ResNo.1)  Re[1]: TEXTBOXのプロパティを文字列に
□投稿者/ KOZ 一般人(2回)-(2022/10/08(Sat) 14:26:57)
  • アイコン
    No35159に返信(ま〜さんの記事)
    > TextBox.Font などを文字変数にしたい。どのFontが使われているのか知りたい
    
    どのような文字列が返ってくればゴールですか?
    
    たとえば、フォームに TextBox と Button を貼り付けて
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim s As String = TextBox1.Font.ToString()
            MessageBox.Show(s)
        End Sub
    End Class
    
    のようにコードを書くと、変数 s には
    
    [Font: Name=MS UI Gothic, Size=9, Units=3, GdiCharSet=128, GdiVerticalFont=False]
    
    という文字列が入ります。
    

違反を報告
引用返信 削除キー/
■35161 / ResNo.2)  Re[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() を保持するだけで良いですけれどね。



    > 初歩的な質問で申し訳ないのですが
    分からないことにたいして、それが技術的に初歩的な事柄であるのかどうかを、
    どうやって判断しているのかが、微妙に気になってみたり…。
    (「初歩的な質問かも知れませんが」という表現なら分からなくも無いのですが)
違反を報告
引用返信 削除キー/
■35162 / ResNo.3)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ まー 一般人(1回)-(2022/10/11(Tue) 12:53:43)
  • アイコン親切丁寧にご指導ありがとうございます。
    感謝です。一歩前に進みました

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

    ご推察の様に
    アプリ上で変更したTextBoxの最終的なフォントをファイルに保存しておいて
    次にアプリを開いた時に同じフォントで開くのが目的です
    ほんと助かります


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

    私は親父世代でしてVB6までは結構ソフト開発しておりました
    第一線から退いたのですが務めていた会社が倒産して再就職先で.NETを勉強しています
    こんな事をしたいとか発想はでるのですが.NETは具体化が難しいので苦しんでます
    実は教えて頂いたサンプルコードも理解出来ない所が多い状態です

    ですのでホント感謝です。
違反を報告
引用返信 削除キー/
■35163 / ResNo.4)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ ま〜 一般人(2回)-(2022/10/11(Tue) 16:59:51)
  • アイコン 関連する内容で追加の質問をさせて頂きたいのですがお手数ですが宜しくお願いします。
    参考にしてFont以外の復元(色とか)もトライして見たのですが上手くいきません
    Labelには文字列として値は入っています。

    'この宣言を理解してない所があります。(Label13は適当に書いてみました。これが要因?)
    Dim pdFont = TypeDescriptor.GetProperties(Label13).Find("Font", False)
    Dim pdBackColor = TypeDescriptor.GetProperties(Label13).Find("BackColor", False)
    Dim pdForeColor = TypeDescriptor.GetProperties(Label13).Find("ForeColor", False)

    '各設定を文字列として保存
    Label13.Text = pdFont.Converter.ConvertToInvariantString(TextBox1.Font)
    Label14.Text = pdBackColor.Converter.ConvertToInvariantString(TextBox1.BackColor)
    Label15.Text = pdForeColor.Converter.ConvertToInvariantString(TextBox1.ForeColor)

    '文字列として保存された Fontなどの値を、実際の オブジェクトに復元したい
    TextBox2.Font = DirectCast(pdFont.Converter.ConvertFromInvariantString(Label13.Text), Font)

    ’   ↑ここまでは上手く行ってます。問題はFont以外です↓(文法が間違っているみたいです)

    TextBox2.BackColor = DirectCast(pdBackColor.Converter.ConvertFromInvariantString(Label14.Text), BackColor)
    TextBox2.ForeColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString(Label15.Text), ForeColor)

    宜しくお願いします
違反を報告
引用返信 削除キー/
■35164 / ResNo.5)  Re[3]: TEXTBOXのプロパティを文字列に
□投稿者/ 魔界の仮面弁士 大御所(1453回)-(2022/10/11(Tue) 19:04:19)
  • アイコンNo35163に返信(ま〜さんの記事)
    > TextBox2.BackColor = DirectCast(pdBackColor.Converter.ConvertFromInvariantString(Label14.Text), BackColor)
    > TextBox2.ForeColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString(Label15.Text), ForeColor)
    DirectCast の第二引数には「データ型」を指定します。

    BackColor プロパティは「System.Drawing.Color 型」で
    ForeColor プロパティも「System.Drawing.Color 型」で
    Font プロパティは「System.Drawing.Font 型」で
    Text プロパティは「System.String 型」で
    Enabled プロパティは「System.Boolean 型」ですよね。

    すなわち、
     TextBox1.BackColor = DirectCast(〜, Color)
     TextBox1.ForeColor = DirectCast(〜, Color)
     TextBox1.Font = DirectCast(〜, Font)
     TextBox1.Text = DirectCast(〜, String)
     TextBox1.Enabled = DirectCast(〜, Boolean)
    のように記述することになります。



    > (Label13は適当に書いてみました。これが要因?)
    Label 用の PropertyDescriptor を TextBox 用に対して用いてはいけません。

    PropertyDescriptor にとって重要なのは「どの型のプロパティを扱おうとしているのか」なので、
    コントロールの型を一致させてないと実行時エラーになりえます。


    たとえば
     Dim a = TypeDescriptor.GetProperties(Label1).Find("AutoEllipsis", False)
     Dim b = TypeDescriptor.GetProperties(TextBox1).Find("CharacterCasing", False)
    とした場合、
     MsgBox( a.GetValue(Label1) )
     MsgBox( b.GetValue(TextBox1) )
    とは書けますが、
     MsgBox( a.GetValue(TextBox1) )
     MsgBox( b.GetValue(Label1) )
    にしてしまうと、呼び出し時に例外がスローされます。
    これは ShouldSerializeValue などでも同じことです。


    PropertyDescriptor は:

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(Label1).Find("Font", False)
    のように「コントロールのインスタンス」を通じて取得する方法のほか、

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(GetType(Label)).Find("Font", False)
    のように「コントロールの型」を通じて取得する方法もあります。
違反を報告
引用返信 削除キー/
■35166 / ResNo.6)  Re[4]: TEXTBOXのプロパティを文字列に
□投稿者/ まー 一般人(2回)-(2022/10/13(Thu) 11:10:58)
  • アイコン魔界さんありがとうございます
    やっと出来ました。
    色々と推察して頂いて書いて頂けのが凄く有難かったです。
    ホントにありがとうございました。

    最後に変な質問をさせて頂きたいのですが
    もっと理解を深めたく思うのですがMSDNを見ても難しく感じてます
    たとえば教えて頂いたTypeDescriptor.GetPropertiesとか大体は理解できたのですが
    何もなければこう書くも推測すら出来ません。

    魔界さんはどの様な感じでこの辺りの理解を深められたのでしょうか?
    参考にされたWebなどあましたら教えて頂けたらと思います。親父教育で申し訳ないです。


違反を報告
引用返信 削除キー/
■35171 / ResNo.7)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ ま〜 一般人(5回)-(2022/10/18(Tue) 17:17:35)
  • アイコン解決しました。↑
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -