Q&A

  • TLabel 컨트롤을 드래그해서 움직이고 싶은데 문제가...
모종의 기능의 구현을 위해...
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 에러가 떠 버립니다.



도대체 어떻게 된 문제일까요...?
아니면 접근 자체를 다른 식으로 해야 좋을까요?
2  COMMENTS
  • Profile
    도끼로이마까 2005.05.11 01:49

    <!--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-->

  • Profile
    해오름 2005.05.09 08:41
    Application.ProcessMessages;
    문장을 제거하시면 Access Violation 에러발생 문제는 해결하실 수 있읍니다.