第2章イベントとイベントハンドラ

 

【学習内容とねらい】

 Windows上のプログラムは、マウスクリックや特定キーの入力によって、所定の処理が始まることが普通です。この時のマウスクリックなどの動作(アクション)を「イベント」と呼びます。そしてそのイベント発生時の処理内容を記述したプログラムを「イベントハンドラ」と呼びます(厳密な定義ではありませんが、ここでは気にする必要はありません)。「handle(ハンドル)」にはさばく、あるいは処理するという意味がありますが、イベントに対する処理を行うもの「handler(ハンドラ)」という意味から、イベントハンドラと呼ばれるのです。

 

 あるイベント(アクション)に対して、所定の処理(イベントハンドラ)が起動するというプログラミングのスタイルは「イベント駆動型プログラミング」と呼ばれます。実は「イベント駆動型プログラミング」は新しいプログラミング・スタイルであり、Windowsの普及によって広まったプログラミング・スタイルと言っていいでしょう。

 

この「イベント駆動型プログラミング」を容易に実現できるように・・・という考えで開発されたのが「ビジュアルプログラミング」というプログラム開発スタイルなのです。ですから、ビジュアルプログラミングをマスターする上で、「イベント」および「イベントハンドラ」の概念をよく理解しておくことは最も重要なことであり、それが本章の学習の目的なのです。

 

 Delphiでは、各コンポーネントに対して、様々なイベントが用意されており、プログラマは適当な「イベント」を選択するだけで良いようになっています。その中でも代表的なものは「ボタン」コンポーネントに対する「クリック」イベントでしょう。「ボタン」はクリック(押される)ために存在しているようなものだからです。本章では、この「ボタンクリック」イベントを典型的なイベントと捉え、ボタンをクリックした時に何らかの処理を行うプログラムを作成します。この“何らかの”処理を記述する部分がイベントハンドラなのですが、イベントハンドラを記述する事が、プログラマが行う主な仕事です。恐らく皆が「プログラムを書く」ということからイメージされる作業が、このイベントハンドラの作成に当たるでしょう。

 

いよいよここで、自分で(処理内容を)プログラミングする第一歩を踏み出します。

 

 

<第2章の構成>

 


2−1 コピープログラムを作ろう

2−2 イベントとイベントハンドラの練習

2−3 プロパティのプロパティ

 

 

 


2-1 コピープログラムを作ろう

【基礎課題2-1-1

 

 【基礎課題1-6-1】で作ったフォームをもとに、コピープログラムを作りましょう。

 まず、各コンポーネントの「Name」プロパティを次のように指定します。

 



 

 

 

 

 

 

 

 

 


コピープログラムとは、

実行して

上のエディットに言葉を入力して

「コピー」ボタンを押すと

上のエディットに入力した言葉が、
下のエディットにコピーされる

というプログラムです。

このプログラムの処理は、

1.       「コピー」ボタンをクリックしたときに“ある処理”を行う。

2.       その処理とは「上のエディット欄に入力した文字を下のエディット欄にコピーする」ことである。

という2点がポイントになります

まず、1.から説明します。

オブジェクトインスペクタから、何かをさせたい対象(この課題の場合はボタンなので、「ButtonCopy」)を選択する。

「イベント」タブをクリックする。

この課題では、「ボタンをクリックしたとき」の処理を考えているので、「OnClick」の右の空欄をダブルクリックする。


すると、次のような画面が現れます。


この画面の意味

Form1の上にあるButtonCopyをClickしたときの処理内容は、以下の通り。
はじまり

おわり


beginend;の間に、「ButtonCopy」をクリックしたときにしたいこと(この課題では、「上のエディット欄に入力した文字を下のエディット欄にコピーする」こと)を書きます。


それでは、「2. 上のエディット欄に入力した文字を下のエディット欄にコピーする」ことを、Delphiではどのように記述するのでしょうか。

 

すでに「1-3」で学習した通り、「エディット」コンポーネントの「Text」プロパティに入力した文字はエディット欄に表示されます。

 

逆に、プログラム実行時に「エディット」コンポーネントに入力された文字は、下のように「Text」プロパティに記憶(保存)されます。このように「Text」プロパティは文字が保存される“場所”と考えることができます。

 



上方の「エディット」コンポーネントの名前は「EditFrom」であるので、上図の状態は、「EditFromコンポーネントのTextプロパティ」に「こんにちは」という文字が保存されている状態である、という事ができます。

 

ところで、Delphiでは、「EditFromのTextプロパティ」を、

EditFrom.Text

という形式で書き表す事になっています。

 

同様に、「EditTo(下の「エディット」コンポーネント)のTextプロパティ」は「EditTo.Text」と書き表されます。

 

したがって、「上のエディット欄に入力した文字を下のエディット欄にコピーする」をDelphiの言葉に直すと、

 

 EditFrom.Textの中身(値)をEditTo.Textにコピーする」

 

という事になります。

ここに、さらに「コピーする」という言葉は、プログラミングの世界では「代入する」という言葉に置き換えられます。「代入する」というと数学的な用語のように聞こえますが、値をそっくりそのままコピーするという意味に他なりません。


さぁ、それでは、コピープログラムを完成させましょう。


下の空欄を埋めて、プログラムを完成させて下さい。

◆解説

l         :=」は、「代入する」を意味します。「:=」の右辺の内容を、左辺に代入するという命令を意味する記号です。イコール記号「=」ではない点に注意してください。

l         ;」は、文の区切りを表します。日本語の文末に「。」をつけるのと同じように、Delphiでは「;」をつけるのです。

 

◆注意

プログラミングでは、命令はすべて半角文字で書きます。

 

実行して、動作を確かめてみましょう。

 ・・・  うまく動作しましたか? うまく行けば【基礎課題2-1-1】は終了です。

 


ここで人間とコンピュータの関係を少し考えてみましょう。

このように、人間とコンピュータの関係は、

ようになっています。


人間がコンピュータに対して何かをする時の、“何か(アクション)”をイベントといいます。

それに対する処理内容を規定したもの(プログラム)を、イベントハンドラといいます。

 

例えば、上の【基礎課題2-1-1】の例でいうと、

 

イベント      : [コピー]ボタンのクリック

イベントハンドラ : 「EditFrom.Textの値をEditTo.Textにコピーするプログラム」


となります。

 

Delphiでは、「あるイベントが発生すると、それに対応したイベントハンドラが起動する」という形でプログラムが動作します。


そして、各コンポーネントには、それぞれ(必要と思われる)「イベント」が用意されています。そこで、プログラム開発者の行う仕事は

 

l           適当なイベントを(オブジェクトインスペクタから)選択する。

l           そのイベントに対するイベントハンドラを記述する。

 

という事になります。

 

1年生の「情報処理基礎・同演習」では、主に、あるイベントに対してどういうイベントハンドラが起動するのかを学習してきたといえます。


2年生のプログラミングでは、イベントハンドラの作り方と書き方を学習して行きます。

 


コラム

ちょっと整理  − Delphiって何? PASCAL言語を習うって聞いたけど?・・・

 

 ここまで学習して来ても、「Delphiって結局何なの?」、「ビジュアルプログラミングというのがDelphi?」、「履修要項にはPASCAL言語を学習するってあったけど?」等など、用語の意味がはっきりせず落ち着かない人が多いことと思います。ここで簡単に整理しておきましょう。

 

上で述べたように、イベントハンドラを作成(記述)することがプログラマの主な仕事です。ここが、要するに「プログラムを書く」部分にあたる訳です。

 

さて、プログラムを書くことを「コーディング」と言います。そしてコーディングはプログラミング言語を用いて行います。Delphiではそのプログラミング言語として「PASCAL」言語を採用しています。言語である以上、その書き方には一定のルール、すなわち「文法」があります。実は、前ージの「◆解説」で述べた

 

「:=」は代入を意味する命令、    文の区切りは「;」

 

などは、PASCAL言語の文法だったのです。コーディングの仕方を学ぶということは、PASCAL言語の文法事項を学習する、ということを意味します。

 

一方、コンポーネントの貼り付けや各プロパティの指定という作業は、コーディングとは独立です。これを可能にしたのが、ビジュアルプログラミング機能と呼ばれるものです。そして、PASCAL言語によるコーディングにビジュアルプログラミングの機能を付加したものが「Delphi」なのです。Delphiではプログラムの開発から実行までに必要な機能が全て備わっています。その意味で、「Delphi」は「統合プログラム開発環境」と呼ばれます。

 

なお、「C++言語」にビジュアルプログラミング機能を付加したものが、並行して学習している「C++Builder」です。Delphiの兄弟のようなものと言えます。Delphiの学習を終えたあとに学習すれば、容易に理解できるはずです。時間に余裕のある人はぜひチャレンジしてみてください。


2-2 イベントとイベントハンドラの練習

【基礎課題2-2-1

 

下のようなフォームのプログラムを作って下さい。
プログラムの動作の内容は【基礎課題2-1-1】のプログラムと同様です。上の「スピンエディット」の値を、下の「スピンエディット」にコピーするようにして下さい。

コピーする向きをわかりやすくするために、ラベルを貼って矢印を表示させてみましょう。

(ヒント:スピンエディットに表示される数の値は、「Value」プロパティに保存されています)。

【基礎課題2-2-2

 

下のようなフォームのプログラムを作って下さい。

「ボタンの高さ」の数値を変えてから、
「ボタンの高さを変える」ボタンを押すと・・・

入力した数値通りにボタンの高さが変わる。


(ヒント:ボタンの高さは、「Height」プロパティに保存されています)。

【基礎課題2-2-3

 

下のようなフォームのプログラムを作って下さい。

ねずみの座標を入力してから、
「ねずみ」ボタンを押すと・・・

入力した数値通りにねずみの位置が変わる。 

 

 

今はスピンエディットの値をもとにねずみの位置が変わりますが、これをランダムに変わるようにすると、面白いプログラムができるでしょう。 実際、5-11で学習するRandom(ランダム)関数を用いると簡単に実現できるようになります。

 




 

【基礎課題2-2-4

 

下のようなフォームのプログラムを作って下さい。

モーニングコールの時刻を指定しても、
「いつもの時刻にセット」ボタンを押すと・・・

指定した時刻を無視して、
強制的に6時30分と表示する。

時間は0〜23時まで、分は0から59までです。あり得ない時刻が表示されないように、「MaxValue」プロパティと「MinValue」プロパティの値を変えておきましょう。

 

 


2-3 プロパティのプロパティ

プロパティの中には、「プロパティのプロパティ」を持つものがあります。

 

【練習問題】

 

「ファイル」→「新規作成」→「アプリケーション」で新たにプログラムを作り、フォームにラベルを置き、

 

オブジェクトインスペクタの「Font」項目の左の十字をクリックしてみましょう。

 

すると、「Font」プロパティに属する、より詳しいプロパティが表示されます。

 

フォントの種類を変更するプログラムは次のようになります。入力して、実行してみましょう。(「MS 明朝」は、4つの文字は全て全角ですが、間の空白は半角です。)

 

 


procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Font.Name := 'MS明朝';
end;

【基礎課題 2-3-1】

 

上のプログラムを改造して、ボタンを押すとラベルのフォントサイズが 16 になるようにしましょう。