Home » Tutorials » VCL » TList

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;