使用する描画ツールの追跡
グラフィック プログラムでは、ユーザーがある時点でどの種類の描画ツール(線、四角形、楕円、角丸四角形など)を使用したいか、追跡する必要があります。
各ツールに数値を割り当てることもできますが、各数値を何を表すか覚えていなければなりません。ニーモニック定数名を各数値に割り当てることにより、より簡単にこれを行うことができますが、コードで数値が適正範囲にあり適切な型であるか、判断することはできません。幸いなことに、Delphi は、これら両欠点を処理する方法を備えています。列挙型を宣言することができます。
列挙型は、連続した値を定数に割り当てる手っ取り早い方法です。これは型宣言でもあり、Delphi の型チェックを使用して、それら特定の値のみを割り当てているか、確認することができます。
列挙型を宣言するには、type 予約語、そしてそれに続いて型の識別子、等号(=)、括弧内にカンマ区切りで、その型の各値の識別子のリストと指定していきます。
たとえば、次のコードでは、グラフィック アプリケーションで利用可能な各描画ツールのための列挙型を宣言しています:
type
TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);
typedef enum {dtLine, dtRectangle, dtEllipse, dtRoundRect} TDrawingTool;
慣例として、型識別子は文字 T から始まり、同じグループの定数群(その列挙型を構成する値)は、2 文字の接頭辞から始まります(描画ツールに対して dt など)。
TDrawingTool 型の宣言は、定数グループの宣言と同一です:
const
dtLine = 0;
dtRectangle = 1;
dtEllipse = 2;
dtRoundRect = 3;
主な違いは、列挙型を宣言することにより、定数に値を与えられるだけでなく、型を与えられ、それにより、Delphi 言語の型チェックを使用して、多くのエラーを回避できることです。型 TDrawingTool の変数は、定数 dtLine ~ dtRoundRect のいずれかが割り当てられます。他の数値を割り当てようとすると、(たとえそれが 0 ~ 3 の範囲のものでも)、コンパイル時エラーを生成します。
次のコードでは、フォームに追加されるフィールドが、フォームの描画ツールを追跡します。
type
TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);
TForm1 = class(TForm)
{ Method declarations here }
public
Drawing: Boolean;
Origin, MovePt: TPoint;
DrawingTool: TDrawingTool;{ field to hold current tool }
end;
enum TDrawingTool {
dtLine, dtRectangle, dtEllipse, dtRoundRect
};
class TForm1 : public TForm {
__published: // IDE-managed Components
void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
bool Drawing; // field to track whether button was pressed
TPoint Origin, MovePt; // fields to store points
TDrawingTool DrawingTool; // field to hold current tool
};