Delphi入門

基本構文を押さえよう!

基本構文(IF文を使ったサンプル)

さて、結構ハイペースで進んで来ましたが、大丈夫でしょうか? タイピングへの道はさほど遠くありません。いくつかの基本構文と、仕組みを理解すれば、実装は可能になります。 基本構文をまずは押さえましょう。

基本構文: if A then B else C

一番基本的なものです。 「if」というのは英語でも御存知の通りです。「もしも〜ならば」ですよね?プログラムでも同じです。 「else」というのも英語では「〜以外」という意味というのはよろしいでしょうか。 要するにすべて意味ある英単語な訳です。

もしも(if) Aならば、その時(then) はBを行って、それ以外(else) はCを行う。

という意味になります。全くこのままです。 また、「ELSE」以下は記述する必要がある時だけ記述して、そうではない時には記述しなくても構いません 。次の例を見て見る事にしましょう。TButton(ボタンコンポーネント)を適当に配置してそこプログラムを書きます。 ボタンを配置した後、ボタンをダブルクリックしてみて下さい。

そうすると、自動的に、「クリックされた時のイベント」が書ける状態になります。 前回は説明しませんでしたが、ダブルクリックする事で一番頻度の高いイベントに自動的に焦点を当ててくれます。 ボタンの場合は、クリックされた時に起こるイベントに通常は書くので、このようになります。

その他のイベントに書きたい時は、前回説明したような、「オブジェクト インスペクタ」 » 「イベントのタブ」で選びますが、 今はクリックした時のイベントしか扱わないので余計な事は考えないで下さい。 また、「if」などは通常は小文字で書きます。タイトルでは強調したいので大文字にしているだけです。 ボタンの「Caption」は取りあえず、「10」とかして見て下さい。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if Button1.Caption = '10' then showmessage('ボタンの値は「10」です!') ;
end ;

Aにあたる部分には、条件式を書きます。 Bにあたる部分はそれに対応する処理を書きます。「else」は先程言いましたように、今回の場合は書いてません。 「showmessage」というのは、実行してみれば分かりますが、W indowsでのエラーメッセージなどを出すダイアログに()内の文字列を表示させるものです。 結構頻繁に使いますので覚えておくと良いでしょう。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if Button1.Caption = '10' then showmessage('ボタンの値は「10」です!')
      else showmessage('ボタンの値は「10」ではありません!') ;
end ;

上のサンプルは「else」文を使った例です。 ここで最も注意しなくれはならない点がいくつかあります。 それは「;(セミコロン)」です。「else」の前には「;」はつけてはなりません! 最初の方は良くミスるので注意して下さい!「IF A THEN B ELSE C ;」で一連のプログラム文だからです。 逆に「else」を使わない場合は、「IF A THEN B ;」で一文となるのでここで「;」を打ちます。 また、「Delphi」では改行しても、一般的には「;」がある所まで一文とみなすので、 今回のように改行しても構いません!

また、気付かなかった方も多いと思いますが、 「=」「:=」の違いをよく見て下さい。「if」文の条件式(この場合Aに当たる部分)は、 「:=」ではなく「=」を使ってますね。「:=」は説明したように「代入演算子」です。 「if」文では代入している訳ではなくただ比較しているだけなので、「=」を使う訳です。 この辺が非常に論理的で分かり安いと思うのは大分慣れた後からでしょうか… そう思います。今は「if」文の条件式の中では「:=」は使ってはいけない!という事を覚えて下さい。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   //誤ったプログラムコード
   if Button1.Caption := '10' then showmessage('ボタンの値は「10」です!')
      else showmessage('ボタンの値は「10」ではありません!') ;
end ;

という事になります。プログラムの事は「コード」とか「スクリプト」とか「ソース」とか言ったりします。 さてさて、本題の意味について全然触れてませんでしたね。 「else」は先程も言いましたように、「〜以外」です。 この場合ですと、「Button1」の「Caption」が’10’であるならば、「ボタンの値は「10」です!」というメッセージを表示させ、 そうでないならば(「Button1」の「Caption」が’10’でなければ…)、「ボタンの値は「10」ではありません!」というメッセージを表示させます。 意味はご理解頂けたでしょうか。これはそんなに難しくはないと思います。 型というものがやはり少々慣れるまで厄介ですが、次の場合はどういう意味になるか分かるでしょうか?

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if StrToInt(Button1.Caption) > 15 then Button1.Caption := '10'
      else Button1.Caption := IntToStr(StrToInt(Button1.Caption)+1) ;
end ;

結構難しいと思います。 というかすごい難しいと思います。でも、一発で分かった方は驚く程よく理解できていますのでご安心下さい(勿論、プログラム経験者は除いてですが…)。 「Button1」の「Caption」は実行時には「10」と書かれていますよね?このプログラムは答えを先に言ってしまうと、 ボタンをクリックして行って、値が15より大きくなったら、10に戻して、そうでないならば、 値を1づつ増やすというようなプログラムです。つまり、ボタンをマウスでカチカチクリックしていくと、

10→11→12→13→14→15→16→10→11→12→13→14→15→16→10→11→12→・・・

という風にボタンをクリックするたびに、変化するプログラムです。実際にまずはこれを記述してみて実行して確認して見て下さい。確認できましたか?それと、StrToIntなどはよろしいでしょうか?「Button1」の「Caption」は「あいうえお」とかにしていると、当然、「文字列→整数」に変換できないのでエラーが起きます。ここでは「Caption」が数値に変換できるのを前提として話を進めています。まず、実行直後は、「10」と書かれていますよね?そこから、ワンクリックすると・・・

  1. Button1.Captionは'10'
  2. StrToInt(Button1.Caption)は数値の10
  3. 10 > 15 は成り立たないので「else」以下の処理が行われる
  4. 前回の説明参照 : Button1の値が1増加される »「Caption」は'11'になる

というものが行われているのです。5回押した地点では、どうなっているんでしょうか?

  1. Button1.Captionは'15'になっている
  2. StrToInt(Button1.Caption)は数値の15
  3. 15 > 15 は成り立たないので「else」以下の処理が行われる
  4. 前回の説明参照 : Button1の値が1増加される » 「Caption」は'16'になる

更にそこからワンクリックされると…

Button1.Captionは’16’になっている!

StrToInt(Button1.Caption)は数値の16だ!

16 > 15 は成り立つので「if」以下直後の処理が行われる!

Button1.Caption := ’10’ →「Caption」は’10’になる!

となり、これでまた、最初の処理…と繰り返されてる訳です。何となく意味が取れたでしょうか? 「StrToInt」「IntToStr」とか分からない方はもう一度前の章を御覧になって下さい。 比較の際にも型が一致している必要がありますので注意が必要です!例えば、次は誤った例です。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   //誤ったプログラムコード
   if Button1.Caption > 15 then Button1.Caption := '10'
      else Button1.Caption := IntToStr(StrToInt(Button1.Caption)+1) ;
end ;

Button1.Captionは文字列型なのに対し15は整数です。 この場合ですと、’10’と15とを比較してしまっている事になっているので誤りです。 型は最初は慣れるまで本当に厄介ですが、修得して下さい。

ボタンを押すたびに色が変化するサンプルを作成してみる

さて、一通り終わった所で、 もう少し実用的なものを作ってみる事にしましょう。ボタンをクリックするたびに、ボタンの色を赤と青、 交互に変えるプログラムを考えてみる事にします。しかし、ボタンは色を変える事は現段階ではできませんので、 「TPanel」を使ってプログラムを書きます。TPanelというコンポーネントを配置して下さい。

それでこのパネルの色を変えるにはどのようにしたら良いか考えて見ましょう。これは簡単です。 次の一行でOKです。「オブジェクト インスペクタ」でも変える事ができます。 「Color」というそのままの所がありますので、変更して見て下さい。 これで色が変わりましたか?実行時にもきちんと反映されているはずです。

しかし、今回は、 プログラムを使って色を変えるという作業を行いますが、やってる事は基本的には同じです。 また、「Color」の欄をダブルクリックすると、自由な色が選べますよ。 また、コンボボックスから選ぶ事もできます。「▼」を押して選択して見て下さい。 「cl・・・」とかいうのが沢山ありませんか?一方、ダブルクリックして選んだものは、 選んだ後に「$00FF33FF」のように16進法で書かれている事が分かりますが、 ここでは16進法の方はかなり高度な話になるので、 とりあえずはコンボボックスから適当にどんな色があるか見て見て下さい。

あれっ?と思った方もいらっしゃると思います。 そうなんです、「HTMLの基本16色カラーコードネーム」と同じような感じなのです。 ちなみに「cl」は「color」の省略形です。普通に「シー・エル」と呼んで良いと思います。 英単語の意味など余談になりますが、言っておきましょう。 「Navy」は「海軍」、「Teal」は「緑青(銅につく錆のCuSO4・Cu(OH)2 )」、「Maroon」は「栗」です。 「Aqua」は「水」です。と余計な話はどうでもいいんですが、これをどのように扱うか!?が問題となって来ます。 ちなみに色もひとつの型です。整数型、文字列型と同じように、カラー型というのが定義されています。 しかし、扱いは簡単ですので次の例を見て下さい。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   Panel1.Color := clRed ;
end ;

だけで何とクリックした時に、「Panel1」の色が赤くなります。簡単でしたか? どちらも、「カラー型」(TColor)なので代入が可能な訳です。ここで、次のようにしてしまったらいけません!

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   Panel1.Color := 'clRed' ; 左辺はカラー型なのに対し、右辺は文字列型
end ;

シングルクォーテーションで囲むとどんなものも文字列型となってしまいます。 カラー型と、文字列型で不一致で実行時にエラーが起きます。 それと、全然言い忘れてましたが、「Delphi」のエラー機能は非常に優れています。 無限ループに入っても、終了できますし、エラーがあれば丁寧にその理由をマーカーで色付きで警告してくれます。 そういう訳で、プログラムを何度も見直すよりは、実行(コンパイル)してエラーを発見する方がずっと効率がいい訳です。

それともうひとつ、「Delphi」でプログラム中にコメントを書きたい時には、次のようにします。これはもう決まりなので覚えるしかありません。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   {プログラムを開始します…}
   Panel1.Color := clRed ; //Panel1の色を赤くする
end ;

というように、「{ }(中カッコ ・ ブレース)」で囲むか、「//」(スラッシュ×2)で色がコメント色になりますので、 コメントを付けたい時にはこれを利用します。ちなみに「Delphi3」では確かコメントはイタリックになるのに対して、 「Delphi5」では紺色になります。変える事はできますが、それは慣れてからお話する事にしましょう。 でわでわ、早速カラーチェンジプログラムを書いてみましょう!

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if Panel1.Color = clRed then Panel1.Color := clBlue
      else Panel1.Color := clRed ;
end ;

です。「百聞は一見に如かず」でして、見れば納得できたでしょうか?このプログラムの意味する所は…

  1. 「Panel1」の色が「clRed」、つまり赤色であるならば…
  2. 「Panel1」の色を「clBlue」、つまり青色にします。
  3. 「Panel1」の色が「clRed」でない、赤色でないのであれば…
  4. 「Panel1」の色を「clRed」、つまり赤色にします。

です。この仕組みで、クリックするたびに色が切り替わるプログラムが完成しました。 また、ここでは答えをサクッと言ってしまいましたが、 プログラムを始めた方は、次のプログラムでもいいのでは?と思う事と思います。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if Panel1.Color = clRed then Panel1.Color := clBlue ;
   if Panel1.Color = clBlue then Panel1.Color := clRed ;
end ;

というよりも、「いきなり書きなさい!」と言われたら半分以上はこう書くと思います。では、これのどこが行けないのか考えて見て下さい。また例のごとく、答えを隠してありますので、じっくり考えた上で見て下さい。

答えは…

この場合ですと、プログラムが上から順番に実行して行きますので、 「Panel1」の色が赤色だった場合に、まず最初のプログラムが実行されて、青色になります。 そして、次の判定文で、「Panel1」は青色になっていますので、この判定文の対象にもなってしまい、 赤色に戻ってしまいます。

という訳です。起動に乗って来たでしょうか。 まだまだ基礎的な事しか話してませんが、こんな簡単に書けるとなると次々いろいろなコンポーネントを使っておもしろいものを作ってみたくなりませんか?でも、まだまだ慣れが必要ですのでもう少し、この「if」文に慣れて見ましょう。次は、ボタンをクリックするたびに、 信号機のように「赤」「青」「黄」と変わるプログラムを書いて見ましょう。

信号機のようにパネルの色を変化させてみる

さて、では続いて信号機の変化をやってみましょう。 とはいうものの、考えると以外に難しい事が分かります。いままでは、分岐が2つでしたが、今回の場合は3つです。 2つ以上になった場合は、「if」と「else」では処理しきれません。というので次のようなテクニックを使います。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if Panel1.Color = clRed then Panel1.Color := clBlue else
   if Panel1.Color = clBlue then Panel1.Color := clYellow else
   Panel1.Color := clYellow ;
end ;

「else」の中で更に「if」で判定するという手法を取ります。 「○○以外だけど、更にその○○以外でも条件を付け加えたい時」は多々出てきます。 その時はこのようにします。このプログラムの意味する所は、

  1. 「Panel1」が赤色ならば、青色に変える(1行目)
  2. 「Panel1」が赤色ではない場合だけど、「Panel1」が青色の時は黄色に変える(2行目)
  3. 「Panel1」がそれ以外ならば(赤色でも、青色でもなければ)、黄色に変える(3行目)

という事になっています。しばらくプログラムを眺めてみて納得して下さい。これにより、多分岐も可能になります。 「赤→青→黄→緑」もできますね。条件がひとつでなくふたつ以上の場合や、行いたい処理が多い場合などは次の例を御覧下さい。

procedure TForm1.Button1Click(Sender:TObject) ;
begin
   if (Panel1.Color = clRed) or ( Panel1.Color = clBlue) then
   begin
      showmessage('パネルの色は赤色か青色のどちらかです!') ;
   end else
   begin
      showmessage('パネルの色は赤色か青色のどちらかです!') ;
   end ;
end ;

2つ以上条件が重なる場合は「or」「and」をつかってつなげます。 「or」は「○○、或いは××」、「and」は「○○かつ××」です。 これらは検索エンジンなどでも「or検索」とか「and検索」とか聞いた事もあるのではないでしょうか? 複数行に渡る場合は、処理範囲を「begin」〜「end」で囲みます。 「begin」〜「end」を省略できるのは処理が一行の時だけです。大抵は、一行という事はあまりないので、 このように書くことが多いです。

また、次のように書いたりする事はできません! ボタンをクリックした時のイベントです(パネルでも変わりませんが…)。

procedure TForm1.Button1Click(Sender:TObject) ;
var x : integer ;
begin
   //誤ったプログラムコード
   x := 15 ;
   if 10 <= x <= 20 then showmessage('x は10以上、20以下です!') ;
end ;

算数ではこのように書きますが、Delphiに限らずプログラム業界では比較は2つまでしかできませんので、

procedure TForm1.Button1Click(Sender:TObject) ;
var x : integer ;
begin
   //正しいプログラムコード
   x := 15 ;
   if (10 <= x) and (x <= 20) then showmessage('x は10以上、20以下です!') ;
end ;

ここで慣れないマークが出てきましたが、 「=」は等号、「< 、>」は不等号ですが、 大なりイコール、小なりイコールは「<= 、>=」のように書きます。 「=」を「<、>」の後に書きますのでご注意下さい。 また、「○○ではない」という判定文の時には、例えば「xは10ではないならば…」と書きたいのでしたら、 次のように2パターンで書けますが、慣れないうちは最初の方がいいでしょう。

procedure TForm1.Button1Click(Sender:TObject) ;
var x : integer ;
begin
   x := 15 ;
   if x <> 10 then showmessage('x は10ではありません!') ;
end ;
procedure TForm1.Button1Click(Sender:TObject) ;
var x : integer ;
begin
   x := 15 ;
   if not (x = 10) then showmessage('x は10ではありません!') ;
end ;

上記のように書けば大丈夫です。 「<>」は「○○ではない」という事を意味します。適当に値を変更してみたりして、 等号、不等号などの使い方を確認して下さい。

基本構文(FOR文を使ったサンプル)

forはループ文と呼ばれる構造に用いられます。 例えば、何回か同じ事を繰り返したい場合に利用します。

基本構文 : for i := 開始値 to 終了値 do 処理

これも非常に重要な構文です。意味するのは、 「開始値」から「終了値」まで処理を繰り返すというものです。 開始値、終了値は整数でなくてはなりません。 数学の「Σ(シグマ)」に概念は酷似していると思います。以下のサンプルコードを見て見ましょう。 ちなみに、サンプルコードとはサンプルプログラムの事と同じです。 1から10までの総和を求めるよくあるプログラムです...

procedure TForm1.Button1Click(Sender:TObject) ;
var i, total : Integer ;
begin
   total := 0 ;
   for i := 1 to 10 do
      total := total + i ;
   showmessage('1から10までの合計は、' + inttostr(total) + 'です!') ;
end ;

開始値と終了値は整数です。 つまり、この場合だと、変数i が、1から10まで値を1づつ増やしながら処理を繰り返します。 この時に変数i を特にループ変数と呼んだりします。 この場合ですと、処理を10回繰り返す訳です。ループ文と言ったりもします。1ループ目は、変数i は1です。 そして、

total := total + 1 ;

という処理が行われています。つまり、変数totalの値は1になります。そして、2ループ目は、

total := total + 2 ;

という処理です。変数totalは、2となっているので、 ここで、変数totalの値は3となります。そして、3ループ目、

total := total + 3 ;

です。変数totalには、3が入っているので、ここでは、変数totalの値は6となります。 そして、ずっとこの処理を繰り返して行きまして、10ループ目は、ループ変数i は10なので、

total := total + 10 ;

この地点では変数totalの値は45になっているので、ここでtotalの値は55となります。 そして、結果を「showmessage」を使ってみる訳ですが、 ここで、文字列なのに「+」を使ってるのに気付いた方もいらっしゃると思います。 今までは整数同士の足し算しか出てきませんでした。 文字列同士の足し算は即ち、「文字列の連結」を意味します。 実際に実行して見て結果を確認して下さい。しかし、「-」は使えませんの注意して下さい。 文字列の引き算は出来ません。

練習問題

では、ちょっとした練習問題を出しますので、考えて見て下さい。 1から10までを掛けた結果を求めたい場合はどのようにすればいいでしょうか? ちょっと考えて見て下さい。ちょっとミスる人もいるかも知れません。答えは、例のように隠れています。

procedure TForm1.Button1Click(Sender:TObject);
var i, total : Integer ;
begin
   total := 1 ;
   for i := 1 to 10 do
      total := total * i ;
   showmessage('1から10まで掛けるとは、' + inttostr(total) + 'です!') ;
end ;

変数total の初期値は1にしなくてならない事に気を付けて下さい。 先程は足し算だったので、初期値は0でも構わなかった訳ですが、今回のかけ算で初期値を0にしてしまうと、

0×1×2×3×4×5×6×7×8×9×10=0

となってしまいます。この辺気を付けて下さい!

という風になります。また、「if」文だけに関わらず「for」文でも他の構文でも、 複数行処理したい時には「begin」〜「end」を付けます。 条件文が一行の時は「begin」〜「end」は省略して書く事ができる事も再度思い起こすと良いでしょう。

procedure TForm1.Button1Click(Sender:TObject) ;
var i, total1, total2 : Integer ;
begin
   //ループ文内容が複数行に渡る場合の処理
   total1 := 0 ;
   total2 := 1 ;
   for i := 1 to 10 do
   begin
      total1 := total1 + i ;
      total2 := total2 * i ;
   end ;
   showmessage('和:'+inttostr(total1)+'  積:'+inttostr(total2)) ;
end ;

また、この「For」文を使っても、 疑問が出てくる時があります。途中で抜け出したい場合はどうすればいいのか?というのを感じる方もいらっしゃるでしょう。 抜け出すには「break」というものを使います。

それと、説明していませんでしたが、「for」の次に使うループ変数i というのがありましたね? このループ変数i は「for」文内で代入したりする事ができません。 上のプログラムを見て、「バリバリ代入してんじゃないの?」と思うでしょう。 代入させられるのには一向に構わないのです。 代入するのがいけないのです。と言っても、実行時に、エラーできちんと表示してくれますけどね。

ですから、「for」構文内では、「i := i + 1 ;」とかはできません! しかし、別の変数jを使って「j := i + 1 ;」とかはできます。 つまり、変数i が「For」文内で変わるようなプログラムは書いてはいけない…という事になります。

また、これは高度な話になりますが、今は1から10までの和や積としましたが、 この合計値が32768を超えるとオーバーフローと言ってエラーになります。 integer型は-32767〜32768までの値を扱う事ができます。 この辺は後々理解していけば良いと思います。