TList
Schritt 5
Damit wir unsere Objekte auch noch mit der Maus bewegen können, gehen wir wie folgt vor.
In der Public-Sektion fügen wir noch folgende Variablen hinzu:
public ... MausDown: boolean; MausX, MausY: Integer; ...
Wenn nun ein OnMausDown-Ereignis auf unserer Zeichenfläche eintritt, stellen wir zuerst fest, dass die Maus gedrückt wurde, an welcher Position und ob vielleicht ein neues Objekt anvisiert wurde:
procedure THauptform.ZeichenflaecheMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var loop:Integer; Basis:^BasisTyp; begin MausDown:=true; MausX:=X; MausY:=Y; for loop:= Objekte.Count-1 downto 0 do // das vorderste zuerst prüfen // es überlagert u.U. ja weiter hinten liegende Objekte begin Basis:=Objekte[loop]; if X>Basis^.X then if X<Basis^.X+Basis^.Width then if Y>Basis^.Y then if Y<Basis^.Y+Basis^.Height then begin AnGewaehlt:=loop; PaintIt; exit; // raus end; // gefunden end; end;
Dabei ergibt sich folgendes kleines Problem: Wenn wir mit den Cursortasten die Größe eines Objektes verändern, können wir es auch „Spiegeln“, d.h. ihm eine Größe kleiner als 0 zuweisen. Dann funktioniert der obige Code zum Erkennen, ob ein Objekt anvisiert wurde, nicht. Wenn ihr das ausbessern wollt, müsst ihr entweder verhindern, dass ein Objekt eine Größe kleiner als 0 zugewiesen bekommt, oder ihr müsst obige Routine ein klein wenig umschreiben, damit sie auch in solchen Fällen funktioniert. Das würde hier aber zu weit führen.
Bewegt sich jetzt die Maus (OnMouseMove), führt das Programm folgenden Code aus:
var Basis:^BasisTyp; begin if MausDown then begin if AnGewaehlt=-1 then Exit; // noch kein Objekt Basis:=Objekte[AnGewaehlt]; Basis^.X:=Basis^.X+(X-MausX); Basis^.Y:=Basis^.Y+(Y-MausY); MausX:=X; MausY:=Y; PaintIt; end; end;
Ich wiederhole mich zwar, aber auch hier interessiert es uns wieder nicht, um was für eine Art Objekt es sich den handelt. Die Maus-Koordinaten speichern wir übrigens, um festzustellen, um wieviel Pixel die Maus bewegt wurde (X-MausX).
Wird die Maus wieder losgelassen, stellen wir das einfach fest:
var Basis:^BasisTyp; begin if MausDown then begin if AnGewaehlt=-1 then Exit; // noch kein Objekt Basis:=Objekte[AnGewaehlt]; Basis^.X:=Basis^.X+(X-MausX); Basis^.Y:=Basis^.Y+(Y-MausY); MausX:=X; MausY:=Y; PaintIt; end; end;