![]() |
「ファイル」→「フォームの新規作成」で第3のフォーム Form3 を作り、「ファイル」→「名前を付けて保存」で「tools」という名前で保存してください。そしてそしてこのtoolsユニット内に、手続きYokoを定義してください。同時に、controlユニット内のYoko定義部分および宣言部分を削除してください。
このとき、[描く]ボタンクリックのイベントハンドラは次のように修正しなければなりません。
![]() |
つまり、外部ユニット(Form3)の手続きを呼び出すので、省略していた市外局番(フォーム名Form3)をつける必要があるのです。 また、controlユニットのインクルードにtoolsを付け加える必要があります。さらに、もはやcontrolユニットからdisplayユニットを参照する必要がなくなったのでdisplayは削除することができます。したがって、controlユニットのインクルード(#include )は次の通りとなります。 | |
|
これにより、controlユニットはtoolsユニットから描画ツールを呼び出す(描画の指示を出す)。toolsユニットのYokoはdisplayユニットの描画領域上に横線を描く。そして、displayユニットは描画領域および作品の展示場所を提供する、というように役割分担が明確になりました。
現時点での各ユニットの関係は、次のようになっています。 | |
|
【基礎課題8-4】において、ほとんどの人は手続き Yoko を control ユニットに記述したと思います。それを呼び出すのがcontrolユニット(のButtonDrawClickイベントハンドラ)ですからこれは自然なことです。ところが、Yokoは必ずしも(それを呼び出す)controlユニットに記述する必要はありません。実際、displayユニットに定義することも可能です。
一般に、後の拡張性やプログラムの再利用性を考えると、手続きや関数は関連する用途あるいは機能毎にまとめておく方が良いとされています。そこで、各ユニットの意味を改めて考えてみましょう。
controlユニットには「線を描け。」などのように何を描くかを指示する所、つまり指示命令を書き込むところという意味がありそうです。一方、displayユニットはCGを描く描画領域およびその展示場所を提供するという役割を担っていると考えられます。そこで、改めて手続きYokoの意味を考えましょう。これは、横線を描く命令ですが、個別の図形を描く道具類と捉える事ができます。そして、その図形描画の道具類を独立させておくと、例えば表示盤(displayユニット)のデザイン等を変更したときでもそのまま使うことができます。
そこで、第3のユニットとして図形描画の道具類(手続きや関数)を納めるtoolsというユニットを作り、そこに、Yokoを納めることにしましょう。
![]() ![]() これまで,関数は、すべてヘッダーファイルのPrivate部に宣言してきました。Private部に宣言した関数は、そのフォーム7の中だけで使うことができました。しかし、今回は複数のフォーム上で使えるようにしなければなりません。関数は宣言する場所によって、使える範囲が変わります。これを関数のスコープといいます。 ![]() ![]() クラスのPublicメンバーとして作成した関数は、そのクラスの中だけでなく、プロジェクト全体で使うことができます。ヘッダーファイルを見ると、クラスの定義の中に”Public:”とかかれている部分があります。Publicメンバー関数は、ここで宣言します。 【基礎課題8-5】の関数Yokoを宣言すると、この関数はプロジェクトのどこからでも、利用できるようになります。ただし、他のフォームからこの関数を使うときには、少し注意が必要です。 ![]() 《ヘッダーファイルをインクルードする》 上記のように、Unit1のPublic部に宣言した関数をUnit3から使う場合は、Unit3の先頭にUnit1.hをインクルードするための命令を記述しなければなりません。 《クラスのメンバー関数として参照する》 他のクラスのメンバー関数を使うときは、クラスの名前から正確に記述しなければなりません。例えば、上記のように宣言された関数をUnit3で使うには「Form1->Yoko()」のように記述します。 ![]() ![]() 下記ののようにYoko関数を宣言すると、関数はプロジェクトのどこからでも利用できるようになります。ただし、関数を宣言したヘッダーファイルのインクルードは必要です。 ![]() 《ヘッダーファイルをインクルードする》 クラスのメンバーではない関数を作成するときは、関数名だけ記述します。メンバー関数のように、クラスの名前を記述する必要はありません。 extern部で宣言した関数は、特定のクラスのメンバーではありません。この関数をUnit2から呼び出すときは、関数名だけを記述します。 2通りプロジェクト全体で使える関数の宣言があります。 私は、今回extern部での関数宣言を行いました。 |
![]() |