- 和也さん
- ベテラン
- 会議室デビュー日: 2006/02/09
- 投稿数: 78
|
投稿日時: 2006-11-09 15:33
C#2003でフォームの背景色を変更しようとしています
string型変数に、"Color [A=222,R=111,G=112,B=113]"のような文字列が格納されています
この文字列を、フォームの背景色に使用したいと思っているのですがどのように
すればよいのでしょうか?
下記のようにするとエラーが発生します
string hoge=this.BackColor.ToString();
this.BackColor=(Color)hoge;
|
- かずくん
- ぬし
- 会議室デビュー日: 2003/01/08
- 投稿数: 759
- お住まい・勤務地: 太陽系第三惑星
|
投稿日時: 2006-11-09 16:00
一例として、かなり泥臭い方法を
- []内の文字列を取得する(正規表現使えばできる)。
- 1.で得られた文字列を各色要素の配列にする(String#Splitで分解する)
- 2.で得られた配列をまわし、各色要素の=以降の値を取得する(正規表現使えばできる)。
- 各色要素の値をInteger#Parseで整数に変換する。
- Color#FromArgbに4.の値を引数として実行し、Colorオブジェクトを得る。
- this.BackColorに5.のColorオブジェクトを渡す。
もっとエレガントな方法は、他の誰かがきっと提示してくれるでしょう。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2006-11-09 16:24
引用: |
|
和也さんさんの書き込み (2006-11-09 15:33) より:
string型変数に、"Color [A=222,R=111,G=112,B=113]"のような文字列が格納されています
|
根本的な解決方法として、こういった状態の保存をしないことです。
実装者である和也さんは、良くない仕様だと感じませんでしたか?
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- mio
- ぬし
- 会議室デビュー日: 2005/08/25
- 投稿数: 734
- お住まい・勤務地: 神奈川県
|
投稿日時: 2006-11-09 17:08
1. "(\\d+)"とマッチする。
2. マッチした文字列を順にInteger#Parseで整数に変換する。
かずくんさんの5〜6。
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2006-11-09 21:58
引用: |
|
和也さんさんの書き込み(2006-11-09 15:33)より:
string型変数に、"Color [A=222,R=111,G=112,B=113]"のような文字列が格納されています
下記のようにするとエラーが発生します
string hoge=this.BackColor.ToString();
this.BackColor=(Color)hoge;
|
なんか、矛盾していません? Color.ToString メソッドが、"Color [A=222,R=111,G=112,B=113]" のような文字列を返しますか?
string colorString = this.BackColor.ToString();
someControl.BackColor = Enum.Parse(typeof(Color), colorString);
って、Enum.Parse メソッドの説明で、Color 使ってるやん。。。
かずくんさんの、1〜2
コード: |
|
Regex reg = new Regex(@"(?<A>A=\d+)|(?<R>R=\d+)|(?<G>G=\d+)|(?<B>B=\d+)");
MatchCollection matches = reg.Matches("Color [A=222,R=111,G=112,B=113]");
|
_________________
|
- ya
- 大ベテラン
- 会議室デビュー日: 2002/05/03
- 投稿数: 212
|
投稿日時: 2006-11-10 15:00
コード: |
|
static Color ToColor(string value) {
Match match = Regex.Match(
value,
@"^Color ¥[A=(?<A>¥d+),R=(?<R>¥d+),G=(?<G>¥d+),B=(?<B>¥d+)¥]$"
);
return Color.FromArgb(
Int32.Parse(match.Result("${A}")),
Int32.Parse(match.Result("${R}")),
Int32.Parse(match.Result("${G}")),
Int32.Parse(match.Result("${B}"))
);
}
|
どんなもんでしょね(¥は半角に)。正規表現はかなり厳しめで順序固定(いやなら所々¥s*入れたりorを4回にしたりどうぞ)。ああ、異常系も無視。
|