제가 판넬 위에서 라벨을 드래그할수 있게 만들었습니다.
var
Form1: TForm1;
WndPos : TPoint;
//PanZip은 라벨이름입니다
procedure TForm1.PanZipMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
WndPos := Point(X, Y);
end;
procedure TForm1.PanZipMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ( ssLeft in Shift) then begin
TLabel( Sender ).Left := TLabel( Sender ).Left + X - WndPos.x;
TLabel( Sender ).Top := TLabel( Sender ).Top + Y - WndPos.y;
end;
판넬위에서 라벨을 움직이는것입니다. 판넬이름은 Pannel1입니다
위처럼 만들었긴 만들었는데 한가지 문제점은 라벨드래그를 판넬영역안에서만
드래그할수 잇게 하는겁니다. 지금은 판넬 밑으로 라벨이 들어갑니다
어떻게 하면 장난감 자동차가 벽이 있으면 더이상 앞으로 못가듯 드래그하는
라벨이 판넬 영역밖같으로 못나가게 할수 있을까요?
선배님들 가르쳐주세요
부탁합니다
소스 정리 없이 해보았습니다.
수식보다는 하나의 임시 변수를 사용하시는게 좋을듯하네요
if ( ssLeft in Shift) then begin
if TLabel( Sender ).Left + X - WndPos.x > Panel1.Width - TLabel( Sender ).Width then
TLabel( Sender ).Left := Panel1.Width - TLabel( Sender ).Width
else if TLabel( Sender ).Left + X - WndPos.x < 0 then
TLabel( Sender ).Left := 0
else
TLabel( Sender ).Left := TLabel( Sender ).Left + X - WndPos.x;
if TLabel( Sender ).Top + Y - WndPos.y > Panel1.Height - TLabel( Sender ).Height then
TLabel( Sender ).Top := Panel1.Height - TLabel( Sender ).Height
else if TLabel( Sender ).Top + Y - WndPos.y < 0 then
TLabel( Sender ).Top := 0
else
TLabel( Sender ).Top := TLabel( Sender ).Top + Y - WndPos.y;
end;