GeoCities home page

プログラミング A home page

1998年6月22日分

下請け会社

あなたが関数に仕事を依頼すると、関数はあなたが知らないところでその仕事をやってくれます。あなたにとっては、仕事さえやってくれればその手順はどうでもいいものです。こうしてみると、関数は下請け会社に似ています。

バイオリズムのプログラムを作るときに、sin という関数を利用しましたね。数学の本を調べればおそらく sin の求め方が載っているのでしょうか、そのようにして sin を求めるプログラムを自分で書くよりも、sin を計算してくれる関数に下請けに出す方が楽です。

それぞれの関数(下請け会社)には、利用するための決まりがあります。sin なら、実数(double)を渡してやると結果を実数(double)で返してくれる、と決まっています。そう、これは以前見た

double sin(double x);

のことですね。

ShowMessage

もう少し変わった決まりを持つ関数を見てみましょう。MS-WINDOWS を操作していると、時々警告が出ることがありますね。簡単な警告を出すプログラムを作ります。次のようにフォームを作ってください。

ボタンの表示は「押すな」にしてください。そして、ButtonWarn の OnClick に次のように書きます。

void __fastcall TForm1::ButtonWarnClick(TObject *Sender)

{

ButtonWarn->Caption = "こらっ";

ShowMessage("押してしまいましたね。");

ButtonWarn->Caption = "もう押すなよ";

}

ここに出てきた ShowMessage も関数の1つです。この関数の使い方を調べてみましょう。「ヘルプ」→「キーワード検索」で ShowMessage と入力し、「表示」を押してください。次のように表示されるはずです。

ShowMessage は[OK]ボタンがあるメッセージボックスを表示します。

extern void __fastcall ShowMessage(const System::AnsiString Msg);

2行目が ShowMessage の使い方です。しかし、このままではわかりにくいので、現時点では重要ではない「extern」「__fastcall」「const」「System::」を無視すると、次のようになります。

void ShowMessage(AnsiString Msg);

以前利用した sin と比べてみましょう。

double sin(double x);

これらからわかることは、ShowMessage という関数は、AnsiString型を渡してやるとvoid型で返してくれる、ということですね。でも、AnsiString型やvoid型ってどんな型でしょうか。

AnsiString

取り敢えず、プログラムの中でShowMessage 関数がどのように使われているか、もう一度見てみましょう。

ShowMessage("押してしまいましたね。");

どうやら、「""」によって囲まれた文字列はAnsiString型であるといえそうです。

もう1つ、試してみましょう。次のようにプログラムを変更してください。

void __fastcall TForm1::ButtonWarnClick(TObject *Sender)

{

ButtonWarn->Caption = "こらっ";

ShowMessage(ButtonWarn->Caption);

ButtonWarn->Caption = "もう押すなよ";

}

これでも動きますね。ButtonWarn->CaptionAnsiString型であるようです。

実は、ButtonWarn->CaptionAnsiString型であることは、次のように調べることができます。オブジェクトインスペクタでButtonWarn の Caption を左クリックし、その状態で「f1」を押してください。

Caption プロパティはユーザーがコントロールを識別できるようにするためのテキスト文字列を指定します。

__property System::AnsiString Caption;

2行目に注目します。まだ学んでいない「__property」「System::」を無視すると、

AnsiString Caption;

と書いてありますね。これは、

int a;

と同じようなもので、「CaptionはAnsiString型として定義されています」ということを表しています。

AnsiString型は様々なコンポーネント(部品)のプロパティにも用いられています。例えば、Edit コンポーネントのTextプロパティもAnsiString型です。

void

もう1つのvoid型は、「何もない」という特殊な型です。つまり、

void ShowMessage(AnsiString Msg);

と書いてあれば、「ShowMessage関数は何も値を返さない」ということを示しています。以前利用したsin関数は計算するための関数ですから、計算の結果を返してくれないと役に立ちませんが、このShowMessage関数は画面に警告を表示するだけの関数ですから何も値を返してもらわなくてもいいのです。逆に、ShowMessage関数はvoid型として値を返さないことになっていますから、

a = ShowMessage("押してしまいましたね。");

というように値を受け取ろうとするとエラーになってしまいます。
逆に、何も値を受け取らない関数があります。「ヘルプ」→「キーワード検索」で「getchar」という関数を調べてください。次のような説明が出てきます。

#include <stdio.h>

int getchar(void);

わかりますね。また、getchar関数は次のように使います。

a = getchar();

ただし、「どうせ値を渡さなくてもいいのだから」と考えて

a = getchar;

と書くとエラーになります。関数を呼び出すときには必ず「()」が必要だからです。