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

■35175 / 1階層)  Lableのカラー色を文字変数から変更したい
□投稿者/ 魔界の仮面弁士 大御所(1458回)-(2022/10/18(Tue) 20:29:28)
  • アイコンNo35172に返信(ま〜さんの記事)
    > その時教えて頂いた事をLableに対して猿真似で転用しようとしたのですが。。
    Label が 3 回とも
    Lable と誤記っているのはさておき。

    Label1.BackColor = RichTextBox2.BackColor
    の動作を文字列経由で受け渡したい、という状況でしょうか。


    アンビエント等を意識せず、現在のプロパティ値を文字列化/復元するだけなら

     Dim cc As New ColorConverter()
     MessageBox.Show(cc.ConvertToInvariantString(Button1.ForeColor))

     Dim ic As New ImageConverter()
     MessageBox.Show(ic.ConvertToInvariantString(Button1.BackgroundImage))

     Dim fc As New FontConverter()
     MessageBox.Show(fc.ConvertToInvariantString(Button1.Font))

    のように、プロパティに応じた型コンバーターを用意することで、
    文字列への変換 & 文字列からの復元作業を行うこともできます。

    これらの型コンバーターは、先に使っていた
     pdForeColor.Converter
    の部分にあたります。


    Enabled プロパティなどのように、単純に現在値を保存してはならないメンバーについては
    やはり型コンバーターを使う前に、PropertyDescriptor を併用した方が良いですけれどね。
    (ShouldSerializeValue が False なら、現在の値を保存してはならないので)


    より厳密に言えば、SerializationVisibility が Content なプロパティ
    (TreeView の Nodes プロパティなど)も考慮する必要がありますし、
    設定順に意味のあるプロパティ(NumericUpDown の Value, Minimum, Maximum) などに対しては
    ISupportInitialize を併用しなければならないといったように、
    追加の作業を求められるプロパティもあったりするのが面倒なところなのですが。


    > Dim pdBackColor = TypeDescriptor.GetProperties(RichTextBox2).Find("BackColor", False)
    > Lable.BackColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString("255,245,222"), Color)

    Label の BackColor を設定することが目的なのであれば、
    何故、TypeDescriptor.GetProperties(RichTextBox2) を使うのですか?

    No35164 でも説明していますが、
    TypeDescriptor.GetProperties(X) で読み書きできるプロパティは、基本的には
    X 型のコントロールに対してです。Y 型のコントロールのプロパティに対しては
    TypeDescriptor.GetProperties(Y) でアクセスしてください。


    Dim rtbProps = TypeDescriptor.GetProperties(RichTextBox1)
    Dim rtbBackColor = rtbProps.Find("BackColor", False)
    MessageBox.Show(rtbBackColor.Converter.ConvertToInvariantString(RichTextBox1))


    .Find メソッドで個別に取り出す代わりに、
    すべてを列挙するならこんな感じ。

    Dim rtbProps = TypeDescriptor.GetProperties(RichTextBox1)
    For Each p As PropertyDescriptor In rtbProps
      Debug.WriteLine(StrDup(20, "-"c))
      Debug.WriteLine("DisplayName: " & p.DisplayName)
      Debug.WriteLine("Name: " & p.Name)
      Debug.WriteLine("Category: " & p.Category)
      Debug.WriteLine("Description: " & p.Description)
      Debug.WriteLine("DesignTimeOnly: " & p.DesignTimeOnly)
      Debug.WriteLine("IsBrowsable: " & p.IsBrowsable)
      Debug.WriteLine("IsReadOnly: " & p.IsReadOnly)
      Debug.WriteLine("SerializationVisibility: " & p.SerializationVisibility)
      Debug.WriteLine("GetChildProperties.Count: " & p.GetChildProperties().Count)

      Debug.WriteLine("ShouldSerializeValue(): " & p.ShouldSerializeValue(RichTextBox1))
      Debug.WriteLine("Value(): """ & p.Converter.ConvertToInvariantString(p.GetValue(RichTextBox1)) & """")
    Next


    なお、 PropertyDescriptor では無く PropertyInfo を列挙する手法もあります。
    永続化を目的として使う場合は、PropertyDescriptor の方が良さそうですが。

    Dim t As Type = RichTextBox1.GetType()
    For Each p As PropertyInfo In t.GetProperties()
      Debug.WriteLine(StrDup(20, "-"c))
      Debug.WriteLine("Name: " & p.Name)
      Debug.WriteLine("CanRead: " & p.CanRead)
      Debug.WriteLine("CanWrite: " & p.CanWrite)

      Debug.WriteLine("Value(): """ & String.Format("{0}", p.GetValue(RichTextBox1)) & """")
    Next
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Lableのカラー色を文字変数から変更したい /ま〜 →Re[2]: Lableのカラー色を文字変数から変更したい /ま〜
 
上記関連ツリー

Nomalアイコン Lableのカラー色を文字変数から変更したい / ま〜 (22/10/18(Tue) 17:28) #35172
Nomalアイコン Re[1]: Lableのカラー色を文字変数から変更したい / KOZ (22/10/18(Tue) 18:24) #35173
Nomalアイコン Lableのカラー色を文字変数から変更したい / 魔界の仮面弁士 (22/10/18(Tue) 20:29) #35175 ←Now
  └Nomalアイコン Re[2]: Lableのカラー色を文字変数から変更したい / ま〜 (22/10/19(Wed) 13:05) #35176 解決み!
    └Nomalアイコン Re[3]: Lableのカラー色を文字変数から変更したい / 魔界の仮面弁士 (22/10/19(Wed) 13:58) #35178
      └Nomalアイコン Re[4]: Lableのカラー色を文字変数から変更したい / ま〜 (22/10/21(Fri) 17:21) #35190 解決み!

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

Mode/  Pass/


- Child Tree -