Partage de code entre plusieurs gestionnaires d'événement

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des outils de dessin


Chaque fois que plusieurs gestionnaires d'événement utilisent le même code, vous rendez l'application plus efficace en plaçant le code répété dans une méthode partagée par les gestionnaires d'événement.

Pour ajouter une méthode à une fiche :

  1. Ajoutez la déclaration de méthode à l'objet fiche. Vous pouvez ajouter la déclaration dans les sections public ou private à la fin de la déclaration de l'objet fiche. Si le code partage uniquement les détails de la manipulation de certains événements, il est préférable de créer une méthode partagée private.
  2. Ecrivez l'implémentation de la méthode dans la section implementation de l'unité de la fiche.

L'en-tête de l'implémentation de la méthode doit correspondre exactement à la déclaration, les mêmes paramètres apparaissant dans le même ordre.

Le code suivant ajoute à la fiche une méthode appelée DrawShape et l'appelle depuis chacun des gestionnaires. D'abord, la déclaration de DrawShape est ajoutée à la déclaration de l'objet fiche :

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

Ensuite l'implémentation de DrawShape est écrite dans le fichier .cpp pour l'unité

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

Les autres gestionnaires d'événement sont modifiés pour appeler 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
	}
}

Voir aussi