
Zitat von
Trulek
...
2. Mit Onmouseup und onmousedown hab ich mich schon beschäftigt. Damit hab ich auch heute das Zeichnen einer Linie realisiert, von dem Punkt wo die Maustaste unten ist, bis sie wieder losgelassen wird. Allerdings kommt da das nächste Problem, da sich die Mausposition links oben in der Ecke orientiert.
Code:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x1:= Mouse.CursorPos.X;
y1:= Mouse.CursorPos.Y;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x2:= Mouse.CursorPos.X;
y2:= Mouse.CursorPos.Y;
image1.Canvas.MoveTo(x1,y1);
image1.Canvas.LineTo(x2,y2);
end;
ScreenToClient funktioniert nicht, weil ich x und y einzeln habe, wegen dem Zeichnen der Linie.
Also das Zeichnen funktioniert, nur halt nicht an gewünschter Stelle.
Es ist doch gar kein Problem, dass sich die Koordinaten an der linken oberen Ecke orientieren, im Gegenteil, es geht damit auch ohne Mouse.CursorPos zu verwenden:
Code:
//globale Variablen
var zeichne: Boolean;
x1, y1: Integer;
....
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//prüfen, ob linke Maustaste gedrückt
if (ssLeft in Shift) then begin
x1:=x;
y1:=y;
zeichne:= true;
Image1.Canvas.Pixels[x,y]:= clBlack;
end; //if
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (zeichne) then begin
Image1.Canvas.MoveTo(x1, y1);
Image1.Canvas.LineTo(x, y);
zeichne:= False;
showMessage('Linie fertig!');
end; //if
end;
Wie du siehst, braucht man Mouse.Cursorpos nicht, sondern nimmt stattdessen die Werte der Parameter X und Y von OnMouseDown- bzw.OnMouseUp.
Das gleiche gilt für den Fall, dass man ein Objekt verschieben möchte.