unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn_Move: TButton;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DrawLine(StartPt,EndPt: TPoint);
function MoveLine(MyPoint,FirstPt,LastPt: TPoint): Boolean;
procedure RealMoveLine(MyPoint: TPoint);
procedure btn_MoveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CanDraw,CanMove,Moving: Boolean;
OriginPt,EndPt,SaveOriginPt,SaveEndPt,MovePt: TPoint;
implementation
{$R *.dfm}
procedure TForm1.DrawLine(StartPt, EndPt: TPoint);
begin
Canvas.MoveTo(StartPt.X,StartPt.Y);
Canvas.LineTo(EndPt.X,EndPt.Y);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Catched: Boolean;
MyPoint: TPoint;
begin
if Button = mbleft then
begin
CanDraw := True;
OriginPt := Point(x,y);
EndPt := OriginPt;
DrawLine(OriginPt,EndPt);
end;
if CanMove then
begin
CanDraw := False;
MyPoint := Point(x,y);
Catched := MoveLine(Mypoint,SaveOriginPt,SaveEndPt);
if Catched then
begin
MovePt := MyPoint;
SetCursor(LoadCursor(0, IDC_SIZEALL));
Moving := True;
end
else
begin
SetCursor(LoadCursor(0, IDC_ARROW));
Moving := False;
end;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
MyPoint: TPoint;
begin
if CanDraw then
begin
Canvas.Pen.Mode := pmNotXor;
DrawLine(OriginPt,EndPt);
EndPt := Point(X,Y);
DrawLine(OriginPt,EndPt);
end;
if Moving then
begin
MyPoint := Point(x,y);
RealMoveLine(MyPoint);
MovePt := MyPoint;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
NowPt: TPoint;
begin
if CanDraw then
begin
NowPt := Point(x,y);
Canvas.Pen.Mode := pmCopy;
DrawLine(OriginPt,NowPt);
CanDraw := False;
end;
if Moving then
Moving := False;
end;
function TForm1.MoveLine(MyPoint, FirstPt, LastPt: TPoint): Boolean;
var
lengthA,lengthB,lengthC:real;
lengthX,lengthY:real; //integer;
begin
lengthX:=abs(myPoint.X - FirstPt.X );
lengthY:=abs(myPoint.Y - FirstPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthA:=sqrt(lengthX+lengthY);
lengthX:=abs(myPoint.X - LastPt.X );
lengthY:=abs(myPoint.Y - LastPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthB:=sqrt(lengthX+lengthY);
lengthX:=abs(LastPt.X - FirstPt.X );
lengthY:=abs(LastPt.Y - FirstPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthC:=sqrt(lengthX+lengthY);
if (lengthA + lengthB) < (lengthC + 1) then
result:=true
else
result:=false;
end;
procedure TForm1.RealMoveLine(MyPoint: TPoint);
var
deltaX,deltaY:integer;
firstPoint,secondPoint:TPoint;
begin
Canvas.Pen.Mode := pmNotXor;
DrawLine(SaveOriginPt,SaveEndPt);//
deltaX:=myPoint.X - MovePt.X;
deltaY:=myPoint.Y - MovePt.Y;
firstPoint:=Point(SaveOriginPt.X+deltaX,SaveOriginPt.Y+deltaY);
secondPoint:=Point(SaveEndPt.X+deltaX,SaveEndPt.Y+deltaY);
// Canvas.Pen.Mode := pmCopy;
drawLine(firstPoint,secondPoint);
SaveOriginPt:=firstPoint;
SaveEndPt := secondPoint;
end;
procedure TForm1.btn_MoveClick(Sender: TObject);
begin
CanMove := True;
CanDraw := False;
SaveOriginPt := OriginPt;
SaveEndPt := EndPt;
end;
end.