基礎課題8-5

ファイル」→「フォームの新規作成」で第3のフォーム Form3 を作り、「ファイル」→「名前を付けて保存」で「tools」という名前で保存してください。そしてそしてこのtoolsユニット内に、手続きYokoを定義してください。同時に、controlユニット内のYoko定義部分および宣言部分を削除してください。

 このとき、[描く]ボタンクリックのイベントハンドラは次のように修正しなければなりません。


つまり、外部ユニット(Form3)の手続きを呼び出すので、省略していた市外局番(フォーム名Form3)をつける必要があるのです。 また、controlユニットのインクルードにtoolsを付け加える必要があります。さらに、もはやcontrolユニットからdisplayユニットを参照する必要がなくなったのでdisplayは削除することができます。したがって、controlユニットのインクルード(#include )は次の通りとなります。

これにより、controlユニットはtoolsユニットから描画ツールを呼び出す(描画の指示を出す)。toolsユニットのYokodisplayユニットの描画領域上に横線を描く。そして、displayユニットは描画領域および作品の展示場所を提供する、というように役割分担が明確になりました。

 現時点での各ユニットの関係は、次のようになっています。
8-5 CG描画ソフトの作成(2) 
−処理の分割−


☆ 総目次へ ★ 第8章目次へ ★ 前節へ ★ 次節へ ☆

☆『Delphi入門』 8-5CG描画ソフトの作成(2)-処理の分割- ☆

【基礎課題8-4】において、ほとんどの人は手続き Yokocontrol ユニットに記述したと思います。それを呼び出すのがcontrolユニット(のButtonDrawClickイベントハンドラ)ですからこれは自然なことです。ところが、Yokoは必ずしも(それを呼び出す)controlユニットに記述する必要はありません。実際、displayユニットに定義することも可能です。

一般に、後の拡張性やプログラムの再利用性を考えると、手続きや関数は関連する用途あるいは機能毎にまとめておく方が良いとされています。そこで、各ユニットの意味を改めて考えてみましょう。

controlユニットには「線を描け。」などのように何を描くかを指示する所、つまり指示命令を書き込むところという意味がありそうです。一方、displayユニットはCGを描く描画領域およびその展示場所を提供するという役割を担っていると考えられます。そこで、改めて手続きYokoの意味を考えましょう。これは、横線を描く命令ですが、個別の図形を描く道具類と捉える事ができます。そして、その図形描画の道具類を独立させておくと、例えば表示盤(displayユニット)のデザイン等を変更したときでもそのまま使うことができます。

そこで、第3のユニットとして図形描画の道具類(手続きや関数)を納めるtoolsというユニットを作り、そこに、Yokoを納めることにしましょう。

基礎課題8−5 解答
☆ Delphiプログラミング入門8−5 ☆

総目次へ ★ 第8章目次へ ★ 前節へ ★ 次節へ


  関数のスコープ 
これまで,関数は、すべてヘッダーファイルのPrivateに宣言してきました。Privateに宣言した関数は、そのフォーム7の中だけで使うことができました。しかし、今回は複数のフォーム上で使えるようにしなければなりません。関数は宣言する場所によって、使える範囲が変わります。これを関数のスコープといいます。

  プロジェクト全体で使う関数  〜Public部〜
クラスのPublicメンバーとして作成した関数は、そのクラスの中だけでなく、プロジェクト全体で使うことができます。ヘッダーファイルを見ると、クラスの定義の中に”Public:”とかかれている部分があります。Publicメンバー関数は、ここで宣言します。
【基礎課題8-5】の関数Yokoを宣言すると、この関数はプロジェクトのどこからでも、利用できるようになります。ただし、他のフォームからこの関数を使うときには、少し注意が必要です。


《ヘッダーファイルをインクルードする》
上記のように、Unit1Publicに宣言した関数をUnit3から使う場合は、Unit3の先頭にUnit1.hをインクルードするための命令を記述しなければなりません。

《クラスのメンバー関数として参照する》
他のクラスのメンバー関数を使うときは、クラスの名前から正確に記述しなければなりません。例えば、上記のように宣言された関数をUnit3で使うには「Form1->Yoko()」のように記述します。

  プロジェクト全体で使う関数  〜extern部〜
下記ののようにYoko関数を宣言すると、関数はプロジェクトのどこからでも利用できるようになります。ただし、関数を宣言したヘッダーファイルのインクルードは必要です。


《ヘッダーファイルをインクルードする》
クラスのメンバーではない関数を作成するときは、関数名だけ記述します。メンバー関数のように、クラスの名前を記述する必要はありません。

externで宣言した関数は、特定のクラスのメンバーではありません。この関数をUnit2から呼び出すときは、関数名だけを記述します。

2通りプロジェクト全体で使える関数の宣言があります。
私は、今回externでの関数宣言を行いました。
                                   Delphiとの相違点                                   
☆『Delphi入門』 8-5CG描画ソフトの作成(2)-処理の分割- ☆

☆ 総目次へ ★ 第8章目次へ ★ 前節へ ★ 次節へ ☆