귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
강좌, 팁, 정보 강좌, 팁, 정보 입니다.
글내용 - 강좌, 팁, 정보
 마우스로 드래그해서 판넬위에 사각형 영역 만들어 여러 컴포넌트(판넬) 선택하기
영영
(송종영)
2019-12-08 오후 10:42:04
카테고리: 팁
1425회 조회



등록된 파일이 없습니다.

어린왕자 님이 올린것을 조금 수정하였습니다.

  private
    { Private declarations }

  public
    { Public declarations }

    procedure MouseControl(x,y:Integer);
  end;

var
  Form1: TForm1;

  Mouse_Down_Bool : Boolean;

  startX, startY : integer;

  fDragging : Boolean;
  fRect : TRect;


implementation

 

{$R *.DFM}

procedure TForm1.Panel_BackMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i:integer;
begin
  // PaintBox1.Enabled := False 또는 PaintBox1.Visible := False 로 해야만 그려짐.

  if  shift = [ssctrl,ssleft] then
  begin

  // 첨 드래그(Ctrl+left)시작하기전에 초기화

    fDragging := true; //전에 드래그플래그변수(Private) 정의함.
    fRect.Left := 0;
    fRect.Right := 0;
    fRect.Top := 0;
    fRect.Bottom := 0;

    PaintBox1.Canvas.DrawFocusRect(fRect);

  // 시작위치기억하는 변수(Private)
    StartX := X;
    StartY := Y;
  end;

end;

procedure TForm1.Panel_BackMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if fDragging then
  begin
    With PaintBox1 do // 페인트박스에 사각형 영역을 그림
    begin
     Canvas.DrawFocusRect(fRect); // 이전의 사각형을 지우고

     fRect.Left:= Min(StartX,x);
     fRect.Right:= Max(StartX,x);
     fRect.Top:= Min(StartY,y);
     fRect.Bottom:= Max(StartY,y);

     Canvas.DrawFocusRect(fRect);  // 다시 영역으로 사각형을 그리고
    end;
 end;

end;

procedure TForm1.Panel_BackMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i, WidthNum, HeightNum : integer;
  PnlSender : TPanel absolute Sender;
  TmpPanel:TPanel;

begin
  if fDragging then
  begin
    for i := 0  to PnlSender.ControlCount - 1 do
    begin

    // 컨트롤이 TPanel인가?
     if (PnlSender.controls[i] is TPanel) then
     begin
      // 각각의 Panel을 읽어서
      TmpPanel:= TPanel(PnlSender.controls[i]);

      WidthNum := Max(abs(TmpPanel.left + TmpPanel.width - fRect.Left),
                    abs(TmpPanel.left - fRect.Right));
     // 영역사각형의 가로변과 패널의 가로변의 가장먼거리를 구한다.

      HeightNum := Max(abs(TmpPanel.Top + TmpPanel.Height-fRect.Top),
                     Abs(TmpPanel.Top - fRect.Bottom));
     // 영역사각형의 세로변과 패널의 새로변의 가장먼거리를 구한다.

     // 만일 이렇게 구한 각각의 거리가, 영역사각형,패널의 가로합,세로합보다 크면 겹친다.( 한직선상의 두개의 선분이 겹칠조건..)
      if (WidthNum <= ((fRect.Right - fRect.left) + (TmpPanel.width))) and
       (HeightNum <= ((fRect.Bottom - fRect.Top) + (TmpPanel.Height))) then
      begin
      { if TmpPanel.BorderWidth = 3 then
        TmpPanel.BorderWidth := 0
       else }
        TmpPanel.BorderWidth := 3;
      end;

     end;
    end; // for

    MouseControl(x,y);

    fDragging := false; // 드래그플래그를 false시키고
    PaintBox1.Canvas.DrawFocusRect(fRect); // 영역 사각형을 지우고
    invalidate; // 다시 그려줌.
    ClipCursor(nil); //마우스 못움직이는 영역을 해체

  end;
end;


// 드래그모드에서 마우스가 Panel_Back 박스내 에만 움직이게 하는 코드
procedure TForm1.MouseControl(x,y:Integer);
var
  xbar, ybar : integer; // 스크롤바의 넓이 변수
  PanelRect : TRect;  // 스크롤박스의 영역

begin
  xbar:=0;
  ybar:=0;

  PanelRect.TopLeft := Panel_Back.ClientToScreen(
                          Point(Panel_Back.left, Panel_Back.top + Panel_Back.top));

  PanelRect.Right := PanelRect.TopLeft.x + Panel_Back.Width;
  //스크롤박스 아래쪽 범위까지 못움직게 함.
  PanelRect.bottom := PanelRect.TopLeft.y + Panel_Back.Height;

  InflateRect(PanelRect, 0,0); //API 함수
  ClipCursor(@PanelRect);  //커서를 정한 범위에 못 움직이게 함.
end;