イベント ハンドラ間でのコードの共有

提供: RAD Studio
移動先: 案内検索

描画ツールの利用 への移動


多くのイベント ハンドラが同じコードを使用していることに気付いた場合、何度も現れるコードを 1 つのルーチンに移動し、それをすべてのイベント ハンドラで共有すると、アプリケーションを効率化できます。

フォームにメソッドを追加するには:

  1. フォーム オブジェクトにメソッド宣言を追加します。この宣言は、フォーム オブジェクトの宣言の末尾にある publicprivate のいずれの部分に追加してもかまいません。いくつかのイベントの処理の詳細を共有するだけのコードであれば、共有メソッドを private にしておくと安全です。
  2. フォーム ユニットの 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
	}
}

関連項目