Gemeinsamer Quelltext für Ereignisbehandlungsroutinen
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:
- 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.
- 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
}
}