GO BACK
C# (with C#Builder) 教室 その2
「ソースコードの基本」
■デフォルトのコードを見る
ではさっそく開発を——という前に、C#ってのがどういうプログラミング言語か、そのコードをちょっと見ておきましょう。細かな文法というより、ソースコード全体がどういう構造になっているのか、その基本を押さえておきたい、ということです。新たに「C#アプリケーション」を選択して作成したプロジェクトで、デザイナから「コード」タブをクリックしてみましょう。だいたい、こんな感じのコードが表示されるはずです。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace FirstWinApp
{
/// <summary>
/// WinForm の概要の説明
/// </summary>
public class WinForm : System.Windows.Forms.Form
{
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;
public WinForm()
{
//
// Windows フォームデザイナサポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後のコンストラクタコードを追加
//
}
/// <summary>
/// 使用されているリソースの後処理を実行します。
/// </summary>
protected override void Dispose (bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Windows フォームデザイナで生成されたコード
/// <summary>
/// デザイナサポートに必要なメソッドです。このメソッドの内容を
/// コードエディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "WinForm";
}
#endregion
/// <summary>
/// アプリケーションのメインエントリポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new WinForm());
}
}
}このうち、 //ではじまる行はコメント文です。また、コードエディタでは、コードの一部分を折り畳んで非表示にしたりできます。こういのは左端の「+」マークをクリックすることで展開表示できます。ですので、「こんなに長くないぞ?」と思った人は、折り畳まれたコードがないかチェックしましょう。
一通りコメントなど余計な部分をカットして整理すると、こんな感じになります。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace FirstWinApp
{
public class WinForm : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
public WinForm()
{
InitializeComponent();
}
protected override void Dispose (bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "WinForm";
}
[STAThread]
static void Main()
{
Application.Run(new WinForm());
}
}
}
これでだいぶ整理できました。が、これでも何がなんだかわからない人は多いでしょう。これを元に、更にわかりやすく整理するとこんな感じになります。
using 利用するライブラリの指定 namespace 名前空間
{
public class クラス名 : 継承元クラス
{
public メソッド ()
{
・・・実行する処理・・・
}
・・・必要なだけメソッド定義が並ぶ・・・
[STAThread]
static void Main()
{
Application.Run(new WinForm());
}
}
}
だいたい、こんな感じでわかるかな? 整理すると、このC#のソースコードというのは、こういうものが組み合わせられ作られていることがわかるでしょう。
・using文
これは、必要なライブラリを宣言するもの。後述するけど、C#では.NET Frameworkというライブラリのようなものを使ってプログラムを作る。このライブラリの中は、ジャンルごとに階層的に整理されている。こうすることで、同じ名前の機能などを持てるようにしてあるんだ。この「利用する機能がおさめてある階層的な場所」のことを「名前空間」と呼んでいる。このusing文は、使いたい機能がある名前空間を指定して、「その場所にある機能を全部名前だけで使えるようにしますよ」ということを示している。
・namespace〜部分
これは、名前空間を指定するもの。ライブラリだけでなく、.NETのプログラムはすべてどこかの名前空間に配置するのがマナーのようになっているのだね。そのため、C#Builderでは、デフォルトでプロジェクト名の名前空間を作り、そこにすべてのプログラムをまとめるように設計されている。このnamespaceの後にある{}内に記述されたプログラムは、すべてここで指定した名前空間に置かれるようになる。
・class〜部分
これは「クラス」を定義している部分。クラスというのは、プログラムを構成する最小単位のようなものと考えておけばいい。C#のプログラムは、みんなこの「クラス」と呼ばれるものとして作られる。この小さなクラスをたくさん集めて組み合わせて大きなプログラムができる。
・メソッド部分
クラスの中に用意するサブルーチンみたいなもの。実行する処理は、その働きごとにメソッドという形で用意する。そして「ボタンを押したらこのメソッドを実行」というように定義しておけば、クリックでその処理が実行される、というわけ。
まぁ、名前空間だのクラスだのメソッドだのは、今はまだよくわからなくていいです。要するに、全体としてこういう構造だ、という漠然としたものだけ理解しておけば大丈夫です。ソースコードを見た時に、「これがクラスってやつだな、これがメソッドっていうものだな」というのがわかれば、これから具体的にプログラムを作る時に役立ちますから。
■ボタンを使ってみる
では、実際に簡単なプログラムを作ってみましょう。ここではもっとも基本となる部品として「ラベル(Label)」と「ボタン(Button)」を使ってみます。ツールパレットから、「Label」と「Button」を探して、フォームデザイナの上に1つずつ配置しましょう。ツールパレットのアイコンを選択し、フォームデザイナ上をマウスでドラッグすれば、ドラッグした領域に部品が作られます。
作成したら、プロパティをちょっと変更しておきましょう。まず、作成したButtonの「Text」プロパティを変更します。作成したButtonを選択し、オブジェクトインスペクタの「プロパティ」タブの一覧から「Text」を探して下さい。この一覧表示部分は、左側がプロパティ名、その右側が設定された値となっています。「Text」という項目を探し、その右側の部分をクリックして選択すると、直接値を入力できるようになります。ここで「Click」と入力してEnterキーを押せば、Buttonのテキスト表示が変わります。
![]()
次に、「ボタンをクリックしたら何かを実行する」という処理を行わせます。これは、作成したButtonを選択し、オブジェクトインスペクタの「イベント」タブを選択して、現れた一覧から「Click」を探します(一番上にあるはず)。この値部分(つまり右側の欄)をダブルクリックして下さい。自動的にメソッドが割り付けられ、同時にその処理を記述するためコードエディタに切り変わります。おそらく、コードエディタでは、こういう文が作成され、その間でカーソルがちかちか点滅しているはずです。
private void button1_Click(object sender, System.EventArgs e)
{
←ここにカーソルがあるはず
}
この「private void〜」という文の下にある{から}までの間が、「button1_Click」という名前の「メソッド」です。メソッドというのはサブルーチンみたいなもので、このメソッドを呼び出すと、この{から}までに書いた処理だけが実行されます。他の部分は一切呼び出されないのです。つまり、メソッドという形で書くことで、役割の異なるさまざまな処理を1つのソースコードの中に入れておけるわけですね。メソッドはその{}部分だけしか実行しませんから、間違ってその後にある処理も実行しちゃった、なんてこともありません。1つ1つのメソッドは独立しているんです。
では、ここにこういう文を書き込んでみましょう。
private void button1_Click(object sender, System.EventArgs e)
{
label1.Text = "クリックしたわねっ!"; // ★
}
わかりますよね? ★マークの1行を追加しただけです。あ! ちなみに「// ★」の部分は、コメントですから書かなくていいです。その手前までですね。
これを書いたら、<実行><実行>メニューを選んでプログラムを実行してみましょう。画面に、設計したウインドウが現れますよ。そしてボタンをクリックすると、Labelのテキストが変わります。
![]()
どうです、ちゃんとプログラムが動いたでしょう? ま、細かいことは後回しにして、「部品(コントロールっていう)の配置とプロパティの設定の仕方」「イベントの設定の仕方」「クリックした時の処理の書き方」といった基本的な部分だけしっかり理解しておきましょう。
また、「書いたけどエラーになる」というひとは、書いた文が全角文字を使っていないか、チェックして下さい。こうしたプログラミング言語では、英数字は半角が基本です。また、C#は大文字と小文字を区別します。ですから「label1」を「Label1」と書くと、もう同じものとは認識しないのです。この点もよく注意してください。
実際にコードを書いてみると、「label1.」まで書いたところで、インサーションポイントのある部分にウインドウがポップアップして現れ驚いたことでしょう。C#Builderでは、入力を補佐する機能がいろいろと用意されています。部品名やプロパティ・メソッド名を入力すると、このようにウインドウがポップアップして現れ、利用可能な単語の一覧が現れるのです。ここから使いたいものを選べば、それを書き出してくれます。この機能をうまく使えば、単語の綴り間違いなども減らせてエラーも少なくなりますよ。
■コードを再チェック!
では、ここで書いた文について説明しましょう。ここでは「label1.Text = "○○";」といった文が書かれていました。この文に使われている要素を細かく分解してみましょう。
- 「label1」:フォームデザイナに配置したLabelの名前
- 「Text」:Labelの表示テキストを示すプロパティ名
- 「=」:右辺の値を左辺に代入する、ということを意味する演算子
- 「"○○"」:テキストの値。テキストは前後に " 記号をつけて書く
- 「;」:文の終わりを示す記号。C#は、文の終わりに必ずコロンを書く
だいぶこれでわかりやすくなりました。上のことから「label1.Text」というのは、label1という名前のLabelのTextプロパティを示しているらしい、とわかります。部品のプロパティというのは、このように「部品名 . プロパティ名」という具合に両者をドットでつなげて書きます。
そしてイコールは右の値を左に設定する、ということでした。ということは、右に記したテキストを、左にあるlabel1.Text(つまりlabel1という部品のTextプロパティ)に設定する、という意味になりますね。これにより、ウインドウに配置してあったラベルのテキストが変更されていたわけです。このように、部品というのはプロパティの値を変更することで現在の表示を変えることができるのですね。
まだ、何がなんだかよくわからないでしょうが、ともかくGUIアプリケーション操作の基本は「部品のプロパティを操作する」ということらしい、というのはわかったでしょう。ともかく、基本的な計算などの仕方と、この「プロパティの操作」さえわかれば、ちょっとしたプログラムなどは作れそうですね。
■その他のメソッドについて
これで一応「ボタンを押したら何かする」ということはできましたが、ソースコードにはこの他にもいろいろとメソッドがあります。とりあえず今は、それらがどういうものか知る必要はないのですが、わけのわからないメソッドがずらっとあると不安な人は多いでしょう。また、意味もわからず書き換えてしまったりしたら大変です。そこで、標準で用意されているメソッドについて簡単にまとめておきます。これらは、今すぐ覚えるというのでなく、「こういう役割のものが用意されているんだ、へー」というぐらいに考えておきましょう。
public WinForm()
{
・・・初期化の処理・・・
}
これは「コンストラクタ」という特別なメソッドです。コンストラクタは、このクラスが実際に利用される場合に呼び出され、初期化の処理をします。——ちょっとわかりにくいですが、クラスというのは、利用する際にまずメモリ上にクラスをコピーし、それを操作するようになってるんです。これを「インスタンス」と呼びます。こうすることで、例えば1つのクラスをいくつでも部品として作って操作したりできるわけですね。このインスタンスというのを作る時に、コンストラクタが自動的に呼び出され処理が行われるわけです。
これは、このクラスのインスタンスが破棄される時の処理をするものです。作る時の処理があるなら、使い終わる時の処理もあっていいわけですね。けれどまぁ、そんなに多用するものではないので、「そういうのがある」とだけ思えばいいです。
protected override void Dispose (bool disposing)
{
・・・終了時の処理・・・
}
private void InitializeComponent()
{
・・・GUIのデザイン処理・・・
}
これは、コンストラクタから呼び出されるメソッドで、ウインドウやメニューなどのGUIの作成をしている部分です。ほら、フォームデザイナでボタンを配置したりしましたね? あれは、実はここに部品を作成しプロパティを変更する処理のコードを追加していただけだったのです。従って、ここを勝手に書き換えたりすると、フォームデザイナが内容を解析できなくなったりするので注意しましょう。
これが、もっとも重要なメソッドでしょう。上の[STAThread]という部分からひとまとまりで考えて下さい。これは、アプリケーションを実行した時、一番最初に呼び出されるメソッドなのです。つまり、起動処理をしている部分です。C#では、プログラムを実行すると、まず用意されたクラス内からMain()メソッドを検索し、それを実行します。このメソッドが見つからないと、エラーになり起動ができません。
[STAThread]
static void Main()
{
・・・メイン処理・・・
}
というわけで、C#のコードの概略と、ボタンクリックで実行する処理までをざっとまとめてみました。いきなりいろいろメソッドだのクラスだのが出てきて混乱したひともいるでしょうが、あまり深く考えず、「プログラムってのはクラスって形で作られてるんだ、クラスの中にはメソッドって形で処理が用意されてるんだ」という概略だけ覚えておけば今は十分でしょう。
GO HOME