모종의 기능의 구현을 위해...
TLabel컨트롤 하나를 폼 위에서 드래그해서 움직이고 싶어졌습니다.
그런데 이 과정에서 모종의 문제가 발생해 버렸습니다.
일단 어떤 식으로 처리를 해야 좋을지 알 수 없어서,
대략 다음과 같은 코드를 작성했습니다.
<!--CodeS-->
procedure TForm1.Label1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
Startdrag := true;
end;
procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
StartDrag := false;
end;
procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Startdrag then
begin
Label1.left := Label1.Left + X - Label1.Width div 2;
Label1.Top := Label1.Top + Y - Label1.Height div 2;
end;
Application.ProcessMessages;
end;
<!--CodeE-->
이렇게 하니까, 일단 움직이기는 하는데요...
(아참. Label1 의 DragMode는 DmAutomatic으로...)
황당한 문제가 발생해 버립니다.
터치패드를 이용하여 작업중입니다.
일단 왼쪽 버튼으로 Label1을 누르고, 이 상태에서 터치패드 위를 살살 움직여 이동시킨 뒤에, 버튼에서 손을 떼면 정상 작동합니다.
그런데, 터치패드 위를 살살 움직여 이동시키는 [중간에] 터치패드 위에 손은 계속 움직이고 왼쪽 버튼에서 손을 떼면, Access Violation 에러가 떠 버립니다.
도대체 어떻게 된 문제일까요...?
아니면 접근 자체를 다른 식으로 해야 좋을까요?
<!--CodeS-->
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FLabelDown := true;
FOrgX := X;
FOrgY := Y;
end;
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
delx, dely: integer;
begin
if FLabelDown then
begin
delx := X - FOrgX;
dely := Y - FOrgY;
Label1.Left := Label1.Left + delx;
Label1.Top := Label1.Top + dely;
end;
end;
procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FLabelDown := false;
end;
<!--CodeE-->