Partage de code entre plusieurs gestionnaires d'événement
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 :
- 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.
- 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
}
}