Felder einem Formularobjekt hinzufügen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Beispiel: Der Gummiband-Effekt


Wenn Sie feststellen wollen, ob eine Maustaste gedrückt wurde, müssen Sie dem Formularobjekt ein Objektfeld hinzufügen. Sobald Sie ein Formular um eine Komponente erweitern, fügt Delphi dem Formularobjekt ein entsprechendes Feld hinzu, so dass Sie über den Namen des Feldes auf die Komponente zugreifen können. Sie können auch eigene Felder zu Formularen hinzufügen, indem Sie die Typdeklaration in der Formular-Unit entsprechend ändern.

Im folgenden Beispiel muss das Formular verfolgen, ob der Benutzer eine Maustaste drückt. Dazu wir dem Formular ein Boolesches Feld hinzugefügt, dessen Wert auf True gesetzt wird, sobald der Benutzer eine Maustaste drückt.

Um einem Objekt ein Feld hinzuzufügen, ändern Sie die Typdefinition des Objekts, geben den Feldbezeichner an und schreiben dann nach der public-Anweisung am Ende der Deklaration weiter.

Alle Deklarationen vor der public-Anweisung "gehören" Delphi/C++Builder: An dieser Stelle werden Felder eingefügt, die Steuerelemente und Methoden vertreten, die auf Ereignisse reagieren.

Im folgenden Quelltext wird zunächst in der Objektdeklaration eines Formulars ein bool Feld mit der Bezeichnung Drawing eingefügt. Danach werden zwei Felder vom Typ TPoint hinzugefügt (Origin und MovePt), die zum Speichern von Punktpositionen dienen.

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

public: // User declarations
	__fastcall TForm1(TComponent* Owner);

	bool Drawing; // field to track whether button was pressed
	TPoint Origin, MovePt; // fields to store points
};

Das Feld Drawing gibt an, ob gerade gezeichnet wird. Es muss auf True gesetzt werden, wenn der Benutzer die Maustaste drückt, und auf False, wenn er sie loslässt:

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y) {
	Drawing = true; // set the Drawing flag
	Canvas->MoveTo(X, Y); // set pen position
}

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y) {
	Canvas->LineTo(X, Y); // draw line from PenPos to (X, Y)
	Drawing = false; // clear the Drawing flag
}

Anschließend kann in der Ereignisbehandlungsroutine für OnMouseMove festgelegt werden, dass nur gezeichnet wird, wenn Drawing den Wert True hat:

void __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y) {
    if (Drawing)
        Canvas->LineTo(X, Y); // only draw if mouse is down }

Dies bewirkt, dass nur zwischen den Ereignissen OnMouseDown und OnMouseUp gezeichnet wird. Trotzdem erhalten Sie anstelle einer geraden eine "gekritzelte" Linie, die den Mausbewegungen direkt folgt. Deshalb wird die Linie nicht gerade.

Das Problem liegt in der Behandlungsroutine für das Ereignis OnMouseMove, die bei jeder Mausbewegung LineTo aufruft. Dadurch ändert sich die Stiftposition, und beim Loslassen der Maustaste ist der eigentliche Ausgangspunkt der Linie nicht mehr bekannt.

Siehe auch