イベント ハンドラ間でのコードの共有
描画ツールの利用 への移動
多くのイベント ハンドラが同じコードを使用していることに気付いた場合、何度も現れるコードを 1 つのルーチンに移動し、それをすべてのイベント ハンドラで共有すると、アプリケーションを効率化できます。
フォームにメソッドを追加するには:
- フォーム オブジェクトにメソッド宣言を追加します。この宣言は、フォーム オブジェクトの宣言の末尾にある public と private のいずれの部分に追加してもかまいません。いくつかのイベントの処理の詳細を共有するだけのコードであれば、共有メソッドを private にしておくと安全です。
- フォーム ユニットの implementation セクションにメソッドの実装を記述します。
メソッド実装のヘッダーは、宣言と正確に一致させ、同じパラメータを同じ順序で記述しなければなりません。
メソッド実装のヘッダーは、宣言と正確に一致させ、同じパラメータを同じ順序で記述しなければなりません。
以下のコードでは、フォームに DrawShape というメソッドを追加し、そのメソッドをそれぞれのハンドラから呼び出しています。まず、オブジェクトの宣言部分に DrawShape の宣言を追加します。
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
void __fastcall DrawShape(TPoint TopLeft, TPoint BottomRight,
TPenMode AMode);
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
};
次に、ユニットの .cpp ファイルに DrawShape の実装を記述します。
void __fastcall TForm1::DrawShape(TPoint TopLeft, TPoint BottomRight,
TPenMode AMode) {
Canvas->Pen->Mode = AMode;
switch (DrawingTool) {
case dtLine:
Canvas->MoveTo(TopLeft.x, TopLeft.y);
Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
case dtRectangle:
Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
case dtEllipse:
Canvas->Ellipse(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
case dtRoundRect:
Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y,
(TopLeft.x - BottomRight.x) / 2, (TopLeft.y - BottomRight.y) / 2);
break;
}
}
DrawShape を呼び出すよう、他のイベント ハンドラを変更します。
void __fastcall TForm1::FormMouseUp(TObject *Sender) {
DrawShape(Origin, Point(X, Y), pmCopy); // draw the final shape
Drawing = false;
}
void __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) {
if (Drawing) {
DrawShape(Origin, MovePt, pmNotXor); // erase previous shape
MovePt = Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor); // draw current shape
}
}