case 文

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 文で出来ない事は?

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;

まとめ


up next
Last Update 2003/1/10 by N.Kobayashi