GO BACK
C# (with C#Builder) 教室 その4
「主なプロパティと値の利用」
■テキストと数値の変換
では、ちょっとずつプログラミングらしいことをやっていきましょう。まず、「ユーザから入力されたテキストを利用する」ということから。これにはTextBoxというテキスト編集のできるコントロールが用意されています。前に使ったLabelはテキストを表示するだけのものでしたが、こちらは入力のためのものなんですね。とはいえ、どちらもテキスト関係ですからプロパティなどはとても似ています。
では、これを使った簡単な例を挙げましょう。——フォームデザイナで、フォーム(ウインドウね)の中に、Label、TextBox、Buttonをそれぞれ1つずつ配置します。そしてButtonのClickイベントにメソッドを割り付けます(デフォルトでbutton1_Clickという名前のメソッドになります)。
![]()
できあがったら、ソースコードエディタの、Clickイベント用メソッドを修正します。ざっと以下のように記述してみましょう。
private void button1_Click(object sender, System.EventArgs e)
{
string s = textBox1.Text;
int n = Convert.ToInt32(s);
int m = 0;
for (int i = 1;i <= n; i++)
m += i;
s = Convert.ToString(m);
label1.Text = "結果:" + s;
}
これでプログラムを実行します。TextBoxに適当に数字(整数)を記入してからButtonをクリックすると、1からその数字までの整数の合計を計算してLabelに表示します。
![]()
ここでは、TextBoxの「Text」プロパティを使って入力されたテキストを得ています。「string s = textBox1.Text;」という文がそれですね。LabelでもTextで表示テキストを操作できました。コントロールが違っていても、同じ役割のプロパティは同じ名前で用意されているのですね。
さて、今回のポイントはその後の部分です。取り出したテキストをこういう処理をしていますね。「int n = Convert.ToInt32(s);」これは、stringの値を整数の値に変換する作業をしていたのです。
先に述べたように、C#では変数には全てタイプが用意されていて、あるタイプの変数にはそのタイプの値しか入れられません。これはプロパティにもいえることで、それぞれのプロパティは設定される値のタイプが決まっています。Textプロパティは、stringの値なのです。ということは、Textプロパティのテキストを元に計算をしようと思ったら、取り出したstringを数値のタイプに変換しないといけません。
値の変換にはいろいろな方法があります。数値同士の場合は、値の前に()でタイプを指定することで変換ができます。例えば、int型の変数nを実数にしたければ、「(double)n」なんて具合にすればいいわけです。が、テキストと数値は全くない用の異なるものなので、そういう簡単な変換はできないのです。両者の間で値をやり取りするには、そのために用意された機能を利用して行います。
これにはいくつかやり方があるのですが、もっともわかりやすいのは「Convert」というクラスを使う方法でしょう。これは値の変換に関するメソッドがいっぱいつまったクラスで、「Convert.メソッド()」というようにクラス名の後に直接メソッドを記述することで、その中のメソッドを呼び出して使えます。ここで使っている「ToInt32()」というのは、()部分に指定した値(引数とかパラメータといいます)をintタイプの値として返す働きをします。
こうして整数の値を取り出したら、後はfor文を使って1からの合計を計算します。そしてLabelのTextに設定します。このときには、逆に「数値からテキストへ」の変換を行わないといけません。それは、Convertクラスの「ToString()」というメソッドを使っています。これで、引数に指定したint値をstringとして得ることができます。
こんな具合に、ユーザから入力されたテキストを使って計算をする場合は、「テキスト→数値」「数値→テキスト」といった変換をしないといけません。また、これに限らず、C#で各種の値を使う際には、「今、使っている値のタイプは何か」「必要とする値のタイプは何か」ということを常に考えておく必要があります。
■Colorの利用
では、次に「コントロールの色」に関するプロパティを使ってみましょう。これには2つのものがあります。「BackColor」と「ForeColor」です。BackColorは背景色を示すもので、ForeColorは前景色(表示テキストとかの色のこと)を示すものです。これらは「Color」というオブジェクトが値として使われています。
では、実際に簡単な例を挙げましょう。ここではフォームにButtonが1つだけ配置されているものを考えます。Buttonには、「Red」というテキストがTextプロパティに設定されているものとします。そしてButtonのClickイベントには以下のようなメソッドを設定します。
private void button1_Click(object sender, System.EventArgs e)
{
string s = button1.Text;
switch (s)
{
case "Red":
button1.BackColor = Color.Green;
button1.Text = "Green";
break;
case "Green":
button1.BackColor = Color.Blue;
button1.Text = "Blue";
break;
case "Blue":
button1.BackColor = Color.Red;
button1.Text = "Red";
break;
}
}
このプログラムを実行してみると、Buttonをクリックするたびに、Buttonの表示テキストと背景の色が「Red」「Green」「Blue」と繰り返し変わっていきます。
![]()
ここでは、switch文を使って、button1のTextプロパティをチェックし、TextとBackColorを変更する処理を行っています。色を変更する部分を見て下さい。「Color.Red」といったものが設定されていますね? Colorには、よく使われる色のオブジェクトがあらかじめ用意されています。例えば、「Red」は赤色のオブジェクト、「Blue」は青色のオブジェクト、といった具合です。こうした、クラスなどの中に最初から用意されている値の類いも、「Color.Red」というように名前の後に値名をドットでつなげて記述することで利用できるようになっています。
しかし、「Colorの値」というのもなんだか奇妙な感じがしますね。C#では、このように数値やテキストだけでなく「クラスから作られたオブジェクト」も値と同じ感覚で利用できます。前にちらっと触れましたが、「インスタンス」ってやつですね。
C#(っていうか.NET)では、さまざまな部品はクラスとして用意されていました。この部品を使うためには、クラスを元にメモリの中に、実際に操作できる部品となるオブジェクトを作って、これを利用することになっていました。これが「インスタンス」でしたね。
Color.Redなどは、つまり「赤色のColorインスタンスを入れてある変数」みたいなものだと考えればよいでしょう。では、そうした変数以外の色を使いたい時は? そういう場合は、新たにColorのインスタンスを作成して、これを設定してやればいいのです。
Color 変数 = Color.FromArgb ( 赤 , 緑 , 青 );
こんな具合に、Colorの「FromArgb()」というメソッドを使ってColorインスタンスを新たに作ることができます。クラスのインスタンスも、変数と同じように「Color c」というようにして変数宣言をし、その変数にインスタンスを代入する感覚で扱えるんですね。——このように「クラスのインスタンス」というのは、C#のいたるところで使われています。Colorなど比較的簡単なものを使って、インスタンスの利用に慣れておくとよいでしょう。
★秘密の暴露★
・・・と、ここまでクラスとインスタンスについて説明しておいてからいうのも何なんですが、実はColorはクラスじゃないです(笑)。これ、本当は「構造体」っていうものなんですよ。構造体は、クラスと同じようにメソッドや値を自身の中に持っていて、ほとんど感覚的にはクラスと同じ感じで使われます。——まぁ、そういうわけなので、Color.FromArgb()で作られるのも本当は「インスタンス」じゃなくて「構造体の値」だったりするわけですが・・・。
正直いって、まだC#をはじめたばかりの段階で、クラスの他に構造体だの何だのと出てくると、わけがわからなくなって混乱してしまいます。なので、「本当はクラスじゃなくて構造体っていうもんらしいけど、ま、使い方はクラスとほとんど同じだから『クラスもどき』と思っておけばいいや」と割り切ってしまいましょう。C#では、このColorのように「クラスもどき」の値がけっこうたくさん出てきます。それを細かに覚えていこうとするとけっこう大変です。別に「クラスだ」と思っていても、当分の間はほとんど害はないので、安心して「みなしクラス」と考えちゃいましょう。ちゃんと構造体を勉強するのは、もっと後になってからでも大丈夫ですから。
■すべての部品はインスタンス
私たちがフォームデザイナで作成したウインドウなども、実はすべて「クラスを元にインスタンスを作り、それを利用する」という形になっています。Buttonなども、実際にはButtonクラスのインスタンスを作って、それをフォームに組み込んで動かしていたのです。
例えば、ソースコードエディタで「InitializeComponent()」というメソッド部分をよく読んでいくと、こんな感じの文が見つかるはずです。
this.button1 = new System.Windows.Forms.Button();
・・・中略・・・
this.button1.Location = new System.Drawing.Point(96, 64);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(184, 80);
this.button1.TabIndex = 1;
this.button1.Text = "Red";
this.button1.Click += new System.EventHandler(this.button1_Click);
・・・中略・・・
this.Controls.Add(this.button1);
・・・以下略・・・
これは、Buttonインスタンスを作成し、細かなプロパティ設定をしてフォームに組み込む処理です。最初の「new System.Windows.Forms.Button()」というのでButtonインスタンスを作成しています。Buttonというのは、System.Windows.Forms名前空間にあるクラスなので、こんな具合に書かれているんですね。本当は、単に「new Button()」でも問題ないんですが、C#Builderではこういう具合に出力されるようです。
そして、その後で「this.button1.Location」だの「this.button1.Name」だのといったものを変更する処理があるはずです。Locationは位置のプロパティ、Nameは名前のプロパティです。また「Size」は大きさのプロパティ、「TabIndex」はタブで選択されるコントロールの順番を示すプロパティです。今はまだ詳細はわからないでしょうが、要するにこうやって作ったButtonインスタンスのプロパティを1つずつ細かく設定していたのですよ。また「this」というのは、このクラスのインスタンス自身を示すものです。つまり「this.button1」というのは「このインスタンス自身の中にあるbutton1インスタンス」という意味ですね。まぁ、これも普通は単に「button1」でいいんですけど、C#Builderはこういう点、妙に律儀に書きます。
そして、「this.button1.Click」というので、イベントを設定し、「this.Controls.Add()」というのでbutton1をフォームに組み込んでいるのです。
まぁ、このへんは、もっとC#と.NETがわかるようにならないと理解するのは難しいので、「そういうことをしている」というぐらいに考えておきましょう。重要なのは1つ1つの文の意味ではなく、「フォームデザイナで作った部品も、実際にはインスタンスを作ってプロパティ設定をする・・といったソースコードの形で作られていたのだ」ということです。「クラスとインスタンス」が、プログラムの全てであることが、なんとなくわかってきました? 今のところは、それが実感できれば十分です。
「要するに、どんな複雑そうで難しそうなものにしても、『インスタンスを作って、そのプロパティを操作する』ということの組み合わせですべてはできているんだ。クラスの役割と、インスタンスの作り方と、プロパティの値のタイプがきっちりわかれば、できないことはないんだ」ということを頭に叩き込んでおきましょう。
■フォントを変更する
次は、テキストのフォントを変更してみましょう。コントロールの表示フォントは「Font」というプロパティとして用意されています。これは「Font」クラスのインスタンスとして値を設定します。ですから、このFontインスタンスの作成さえわかれば、表示のフォントを変更したりできるようになるわけです。
(あ、いっときますがFontは正真正銘、本物の「クラス」です(笑)。でも、「Fontはクラスなのに、Colorはなんでクラスでなくて構造体なんだ?」とか考え出すと夜も眠れなくなっちゃうでしょ? なので、ここではみーんな「クラスみたいなもの」と考えちゃえ、ということなんですね)
では、フォームデザイナでフォームにButtonを1つだけ作成し、これをクリックすることでButtonの表示フォントを変更させてみましょう。ButtonのClickイベントにメソッドを割り付け、これを以下のように記述します。
private void button1_Click(object sender, System.EventArgs e)
{
Font f = button1.Font;
float fs = f.Size + 2;
Font f2 = new Font("Arial",fs,FontStyle.Bold);
button1.Font = f2;
}
これを実行し、Buttonをクリックして下さい。クリックする毎に、表示テキストのフォントサイズが2ポイントずつ大きくなっていきます。
![]()
ここでは、現在設定されているFontからサイズの値を調べ、それを元にして新たにFontインスタンスを作り設定する、という処理をしています。現在のフォントは「button1.Font」としてFontインスタンスを取得できます。このFontインスタンスには、そのフォントに関する情報を示すプロパティが用意されています。例えば、ここでは「f.Size」というのを使っていますが、このSizeはフォントサイズを示すプロパティです。この他、名前を示すNameなどいくつかのプロパティがあります。
そして、新たにFontインスタンスを作成するところでは、「new Font()」というのを使っていますね。通常、クラスのインスタンスを作る場合には、この「new クラス名」という形が使われます。先ほどのColorのようにメソッドを用意しているものもありますが、一般的にはnewでインスタンスを作るのが普通です。Fontのインスタンスを作成するnewは、引数の指定の仕方がたくさんあるんですが、もっとも分かりやすいのはこういう形でしょう。
Font 変数 = new Font ( フォントファミリー名 , サイズ , スタイル );
フォントファミリー名というのは、フォントファミリーというフォントのグループのようなものの名前です。これはstringで指定します。次のサイズはフォントサイズですが、これはintではなくfloatの値なので注意が必要です。floatというのは、実数のタイプなんです。フォントサイズというと整数のように思えますが、現在では小数の値でフォントサイズを指定できるようにもなっているのですね。
で、最後のスタイルですが、これがちょっとややこしい。これ、「FontStyle」というものの値なのです。これ、「列挙体」という値なのです。列挙体っていうのは、いくつもの用意された値の組み合わせで値を指定するようなものです。というとよくわからないでしょうが、例えばフォンとスタイルなんていうのは、ボールド、イタリック、アンダーライン・・・というようにいくつかのものの組み合わせでできていて、それ以外の値はありません。こういう時に列挙体というのが用いられます。
列挙体には使える値が全て内部に用意されていて、ここでの「FontStyle.Bold」のように列挙体名の後にドットでつなげて値を記述します。先の「Color.Red」なんかと同じ感覚ですね。このFontStyle列挙体には、他に「Italic」「Underline」といったものも用意されています。また標準スタイルは「Regular」となります。
■位置と大きさを変更する
次はコントロールの位置と大きさを変更してみましょう。これらは「Location」「Size」というプロパティとして用意されています。値は、それぞれ「Point」「Size」というクラスもどき(構造体ね)のものが設定されます。——では、これもButtonを1つ配置して、そのButtonの位置と大きさを変更するような形で考えてみましょう。
private void button1_Click(object sender, System.EventArgs e)
{
Point p = button1.Location;
Size s = button1.Size;
Point p2 = new Point(p.X - 10,p.Y - 10);
Size s2 = new Size(s.Width + 20,s.Height + 20);
button1.Location = p2;
button1.Size = s2;
}
これでOK。プログラムを実行し、Buttonをクリックしてみると、Buttonが次第に大きくなっていきますよ。
![]()
ここでは、まずLocationとSizeプロパティからPointとSizeの値をそれぞれ取り出し、これを元に新しいPointとSizeを作っています。PointとSizeは、それぞれ以下のような形で値を作ります。
Point 変数 = new Point ( 横位置 , 縦位置 );
Size 変数 = new Size( 横幅 , 縦幅 );
4つの値は、それぞれint値となります。ここでは、取り出したPointとSizeの値を使って新しい値を作っていますね。Pointには「X」「Y」という横位置と縦位置を示すプロパティが、Sizeには「Width」「Height」という横幅と縦幅を示すプロパティが、それぞれ用意されています。これらを使って、現在のPointやSizeの位置や幅の値を得ることができるんです。
実をいえば、これらのプロパティは書き換えもできます。ですからプロパティから取り出した値に「p.X = ○○」というように直接値を変更して使ってもいいんですが、ここでは「newで新たに値を作る」という方法を紹介したかったので、わざわざ新たに作成をしました。
というわけけ、Color、Font、Location、Sizeというコントロールでもっとも基本となる4つのプロパティと、それぞれで使われる値について紹介しました。クラスやクラスもどきがたくさん出てきて混乱したかもしれませんね。実際に自分でこれらの値を操作するコードを何回か書けば、使い方は飲み込めてくると思います。また、クラスやクラスもどき利用に慣れる意味でも、これら基本プロパティは確実に覚えましょう。
GO HOME