- PR -

C# string型のカラーコード文字列を、Form背景色に・・

1
投稿者投稿内容
和也さん
ベテラン
会議室デビュー日: 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. []内の文字列を取得する(正規表現使えばできる)。
  2. 1.で得られた文字列を各色要素の配列にする(String#Splitで分解する)
  3. 2.で得られた配列をまわし、各色要素の=以降の値を取得する(正規表現使えばできる)。
  4. 各色要素の値をInteger#Parseで整数に変換する。
  5. Color#FromArgbに4.の値を引数として実行し、Colorオブジェクトを得る。
  6. 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回にしたりどうぞ)。ああ、異常系も無視。
1

スキルアップ/キャリアアップ(JOB@IT)