case 文は、if 文の親戚だと考えると分かりやすいと思います。ここでは、if 文を用いて作成したプログラムを case 文に書き換えることで、その使い方を見ていきましょう。
例えば、ある整数(ここでは仮に変数 Number とします)があるとします。この Number に代入された値が 2 であるなら、「 こんにちは! 」とメッセージボックスを表示し、それ以外なら、「 おはよう! 」とメッセージボックスを表示するプログラムを if 文を用いて書きますと、次のようになります。
procedure TForm1.Button2Click(Sender: TObject); var Number: Integer; begin Number := 3; // Number に適当な値を代入します if Number = 2 then // Number に代入された値が 2 であるなら ShowMessage('こんにちは!') else ShowMessage('おはよう!'); end;
上記のプログラムを case 文を用いて書き直すと、次のようになります。
procedure TForm1.Button2Click(Sender: TObject); var Number: Integer; begin Number := 3; // Number に適当な値を代入します case Number of 2: ShowMessage('こんにちは!'); else ShowMessage('おはよう!'); end; end;
上記の if 文で書かれたプログラムと、case 文で書かれた文をじっくり見比べてみてください。上記の 2 つのプログラムの実行結果は、同じです。ということは、どのような処理をするのかという点で考えてみると、どちらも同様の考え方でプログラムを見る事が出来ますね。まず最初に Number に適当な値(ここでは 3)を代入し、その Number の値に応じて、実行する文を選択しています。
それでは今度は、Number に代入される値に応じて、3 つの選択パターンがある場合をやってみます。
まずは、if 文での例です。
procedure TForm1.Button2Click(Sender: TObject); var Number: Integer; begin Number := 20; // Number に適当な値を代入します if Number = 5 then ShowMessage('5 です') else if Number = 20 then ShowMessage('20 です') else ShowMessage('5 でも 20 でもありません'); end;
上記のプログラムを case 文で書き換えた例です。
procedure TForm1.Button2Click(Sender: TObject); var Number: Integer; begin Number := 20; // Number に適当な値を代入します case Number of 5 : ShowMessage('5 です'); 20: ShowMessage('20 です'); else ShowMessage('5 でも 20 でもありません'); end; end;
if 文を用いて作成したプログラムでも、case 文で作成した文でも 整数型の変数 Number に対して、「値はいくつなのか?」ということを調べています。具体的に見ていきますと、まず最初に、Number は 5 であるかどうかを調べ、そうであれば(Number が 5 であれば)ShowMessage('5 です') が実行されます。しかし、Number の値には、20 が代入されていますので、上記の判定( 5 であるかどうか)は、「偽」です。従って、今度は「 Number は 20 であるか?」が調べられます。この判定は、「真」になりますので、結果的に ShowMessage('20 です') が実行され、一連の case 文(又は if 文)が終了する事になります。
また、上記の case 文のプログラムでは、else がありますが、この else は if 文の場合と同様、必須ではありません。つまり、あってもいいし、なくてもいいということになります。
例えば次の例では case 文で else を使用していません。
var Number: Integer; begin Number := 5; case Number of 3: ShowMessage('3'); 4: ShowMessage('4'); end; end;
上記のプログラムの場合、case 文ではどの条件にも当てはまりませんので、メッセージボックスは表示されません。
それでは、今度はもう少し難しいのをやってみましょう。今度は、Number に 0 から 10 までのいずれかの値を代入して、その代入された値に応じてフォームの色を変えるプログラムを考えてみます。
例えば、Number に 0 〜 3 までの値が代入された時は、フォームの色を白に変更し、Number に 4 〜 7 までの値が代入された場合には、フォームの色を赤に変更し、Number に 8 〜 10 までの値が代入された場合には、フォームの色を青に変更する仕様にします。これを if を用いてプログラムを書くと以下のようになります。
procedure TForm1.Button1Click(Sender: TObject); var Number: Integer; begin Number := 3; // Number に適当な値を代入します // Number に代入された値に応じて、実行する文を選択します if (Number >= 0) and (Number <= 3) then Color := clWhite else if (Number >= 4) and (Number <= 7) then Color := clRed else if (Number >= 8) and (Number <= 10) then Color := clBlue; end;
上記のプログラムを case を用いて書き直すと次のようになります。
procedure TForm1.Button1Click(Sender: TObject); var Number: Integer; begin Number := 3; // Number に適当な値を代入します case Number of 0..3 : Color := clWhite; 4..7 : Color := clRed; 8..10: Color := clBlue; end; end;
0, 1, 2, 3 と連続した値の場合には、0..3 のようにまとめて書くことが出来ます。便利ですので、是非使ってみてください。これまでの例で見てきましたように、if 文も case 文もある値に対して、どの文を実行すれば良いかを選択している点では、いっしょです。単に「記述の仕方」が異なるだけです。「 if 文を使ってみよう 」で紹介しました図を、case 文バージョンで表現したのが下図です。
上図で大事な点は、ある対象(ここでは整数型の変数 Number)に対して、その対象物の値に応じて、処理を分岐しているということです。いろいろな選択肢があり、どれを実行すればよいのかを case 文で選択しているわけです。考え方は、if 文のそれと一緒です。
if 文で出来る事が、全て case文で出来るわけではありません。case 文では、文字列を条件分岐として使用することが出来ません。 つまり、以下のようにすることが出来ないことになります。
procedure TForm1.Button2Click(Sender: TObject); var MyName: string; begin MyName := 'Taro'; // エラー!文字列を使用することは出来ません。 case MyName of 'Jiro': ShowMessage('Jiro !'); 'Taro': ShowMessage('Taro !'); else ShowMessage('else !'); end; end;
文字列ではなく文字の場合は、case 文では使用出来ます。
procedure TForm1.Button2Click(Sender: TObject); var MyCh: Char; begin MyCh := 'U'; // OK case MyCh of 'A': ShowMessage('A'); 'U': ShowMessage('U'); end; end;
まとめ