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

■35172 / 親記事)  Lableのカラー色を文字変数から変更したい
  
□投稿者/ ま〜 一般人(6回)-(2022/10/18(Tue) 17:28:16)
  • アイコン環境/言語:[Windows10 Basic ] 
    分類:[.NET] 

    こんにちは、TextBoxの件でお世話になりました
    その時教えて頂いた事をLableに対して猿真似で転用しようとしたのですが。。
    Dim pdBackColor = TypeDescriptor.GetProperties(RichTextBox2).Find("BackColor", False)

    Lable.BackColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString("255,245,222"), Color)

    とやって見ましたがこれでは駄目なようで理解しきって無い私には難しい所です
    どうか宜しくお願いします。
マルチポストを報告
違反を報告
引用返信 削除キー/
■35173 / ResNo.1)  Re[1]: Lableのカラー色を文字変数から変更したい
□投稿者/ KOZ 一般人(3回)-(2022/10/18(Tue) 18:24:38)
  • アイコン
    No35172に返信(ま〜さんの記事)
    > Dim pdBackColor = TypeDescriptor.GetProperties(RichTextBox2).Find("BackColor", False)
    > Lable.BackColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString("255,245,222"), Color)
    
    pdBackColor/pdForeColor, RichTextBox2/Lable とバラバラですね。
    
    > とやって見ましたがこれでは駄目なようで理解しきって無い私には難しい所です
    
    理解できるまで弁士さんの回答を読み直すといいんじゃないでしょうか。

違反を報告
引用返信 削除キー/
■35175 / ResNo.2)  Re[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
違反を報告
引用返信 削除キー/
■35176 / ResNo.3)  Re[2]: Lableのカラー色を文字変数から変更したい
□投稿者/ ま〜 一般人(8回)-(2022/10/19(Wed) 13:05:52)
  • アイコンいつもありがとうございます

    > Lable と誤記っているのはさておき。
    はい、間違ったスペルでコピペしたみたいです

    > Label1.BackColor = RichTextBox2.BackColor
    > の動作を文字列経由で受け渡したい、という状況でしょうか。
    ここも、誤記でlabelが正です

    Dim pdBackColor = TypeDescriptor.GetProperties(Label1).Find("BackColor", False)
    Label2.BackColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString("255,245,222"), Color)
    で上手く行きました

    原因は新しく作ったFormの先頭にImports System.ComponentModelが無かった為です。
    以前、教えて頂いた時のFormには書いてあったのですが今回それが無かった為に
    TypeDescriptorで構文エラーになっていました。
    以前色々とやってる中で何処かで見つけて書いていたもので何故必要なのかも理解せずに書いてましたので構文エラーとはならず気づかないまま。あれやこれややってました。。
    参照設定だけでは駄目なのでしょうか?
    何を基準にImports したら良いのか分からないですね。

    それと、またまた棚ぼたの文例ありがとうございます。
    凄く勉強になりました。

    然しながら
    > 永続化を目的として使う場合は、PropertyDescriptor の方が良さそうですが。
    > Dim t As Type = RichTextBox1.GetType()
    > For Each p As PropertyInfo In t.GetProperties()
    のPropertyInfoで構文エラーとなります。要因は上記と同じく何かImportsしなくては?。。。

解決み!
違反を報告
引用返信 削除キー/
■35178 / ResNo.4)  Re[3]: Lableのカラー色を文字変数から変更したい
□投稿者/ 魔界の仮面弁士 大御所(1459回)-(2022/10/19(Wed) 13:58:45)
  • アイコンNo35176に返信(ま〜さんの記事)
    >>For Each p As PropertyInfo In t.GetProperties()
    > のPropertyInfoで構文エラーとなります。要因は上記と同じく何かImportsしなくては?。。。

    PropertyInfo クラスの解説を見てみましょう。
    https://learn.microsoft.com/ja-jp/dotnet/api/system.reflection.propertyinfo?view=netframework-4.8

    冒頭の「定義」を見ると、PropertyInfo クラスは、
     名前空間:System.Reflection
    と書かれていることが分かるかと思いますので、この名前空間を明示してください。


    あるいは PropertyInfo の下に赤波線が出ていると思いますので、
    破線の PropertyInfo の上で [Alt]+[Shift]+[F10] を押すと表示される、
    修正候補から選ぶという手もあります。キーボード操作の他、
    赤破線の箇所をクリックすると表示される電球マークをマウス操作しても OK です。


    ということで、具体的な修正方法を 3 案挙げておきます。


    修正案1) プロジェクトのプロパティの [参照]-[インポートされた名前空間]
    にて「System.Reflection」にチェックを入れる

    修正案2) 該当の .vb ファイルの先頭に Imports 文を書く
    「Imports System.Reflection」


    修正案3) クラス名の前に名前空間を明示する…
    a) PropertyInfo
    b) Reflection.PropertyInfo
    c) System.Reflection.PropertyInfo
    d) Global.System.Reflection.PropertyInfo
違反を報告
引用返信 削除キー/
■35190 / ResNo.5)  Re[4]: Lableのカラー色を文字変数から変更したい
□投稿者/ ま〜 一般人(12回)-(2022/10/21(Fri) 17:21:39)
  • アイコン魔界さんへ
    勉強になります
    いつもありがとうございます。

解決み!
違反を報告
引用返信 削除キー/



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

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -