Gemeinsamer Quelltext für Ereignisbehandlungsroutinen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Zeichenwerkzeuge verwenden


Wenn mehrere Ereignisbehandlungsroutinen denselben Quelltext verwenden, können Sie die Anwendung effizienter gestalten, indem Sie den betreffenden Quelltext in eine Routine verlagern, auf die alle Ereignisbehandlungsroutinen zugreifen können.

So fügen Sie einem Formular eine Methode hinzu:

  1. Fügen Sie dem Formularobjekt die Methodendeklaration hinzu. Sie können die Deklaration entweder im public- oder im private-Teil am Ende der Deklaration des Formularobjekts hinzufügen. Wenn der gemeinsame Quelltext nur Details für die Behandlung bestimmter Ereignisse betrifft, ist es am sichersten, wenn Sie die Methode als private deklarieren.
  2. Schreiben Sie die Methodenimplementierung im implementation-Abschnitt der Formular-Unit.

Der Kopf der Methodenimplementierung muss genau mit der Deklaration übereinstimmen, d. h. die Parameter müssen dieselbe Reihenfolge haben.

Der Kopf der Methodenimplementierung muss genau mit der Deklaration übereinstimmen, d. h. die Parameter müssen dieselbe Reihenfolge haben.

Im nachfolgenden Quelltext wird dem Formular eine Methode namens DrawShape hinzugefügt und die Methode in jeder Behandlungsroutine aufgerufen. Zunächst wird die Deklaration von DrawShape in die Deklaration des Formularobjekts eingefügt:

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
};

Danach wird die Implementierung der Methode DrawShape in die .cpp-Datei für die Unit aufgenommen:

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;
	}
}

Die anderen Ereignisbehandlungsroutinen werden so geändert, dass sie DrawShape aufrufen:

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
	}
}

Siehe auch