안녕하세요.
제가 지금 구현하려는것은 패널1과 패널2이 존재할 때,
패널1을 패널2에 갖다 대는 순간, 패널2의 색깔이 navy로 바뀌는 것입니다.
그리고 패널1이 패널2로 움직이는 동안 궤적이 나타나는 것입니다.
궤적을 나타내기 위해서 PanelDragover 프로시져에서 다음의 윈도우 api를
사용하였습니다.
----------------------------------------------------------------------
ReleaseCapture;
(source as TWinControl).perform(WM_SysCommand, SC_DragMove, 0);
GetCursorPos(Mpt);
(source as TWinControl).Visible := False; // Visible False시키
----------------------------------------------------------------------
그런데 문제는 위의 4코드줄을 사용하면, 그 이하문장의 dragover가
먹지 않아서, 패널2의 색깔이 변하지 않습니다.
그리고 위으 4코드줄을 // 처리해서 컴파일이 안되게 하는 경우에는,
패널2의 색깔은 변하는데, 궤적이 나타나지 않습니다.
애시당초 델파이에서는 dragmove 위도우api를 사용하면, 델파이의
dragover 이벤트가 안먹는 것인지요.
그렇다면, 어떤 방법을 써야지, 궤적을 그리면서, dragover 되는 패널의
색깔이 변하게 할 수 있을까요...
고수님들의 조언을 부탁드립니다.
아래는 저의 코드입니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
const
SC_DragMove = $F012; // Win API DRAGMOVE Constant
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
QueryResult1: TPanel;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure PanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PanelDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
function GetParentWindowAt(X, Y : integer) : TWinControl;
function GetParentWindowNameAt(X, Y : integer) : string;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
NewPanel: TPanel;
nCnt: integer;
begin
NewPanel := TPanel.Create(Self);
NewPanel.Parent := Form1;
NewPanel.Width := 300;
NewPanel.Height := 40;
NewPanel.Left := 100;
NewPanel.Top := 100;
NewPanel.OnMouseDown := PanelMouseDown;
NewPanel.OnDragOver := PanelDragOver;
NewPanel.DragMode := dmAutomatic;
nCnt := 1;
// Panel1 부터 이름을 찾아 빈번호의 이름을 갖는다.
while FindComponent('Panel' + IntToStr(nCnt)) <> nil do
begin
inc(nCnt);
end;
NewPanel.Name := 'Panel' + IntToStr(nCnt);
end;
procedure TForm1.PanelDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
Mpt: TPoint;
begin
// ReleaseCapture;
// (source as TWinControl).perform(WM_SysCommand, SC_DragMove, 0);
// GetCursorPos(Mpt);
// (source as TWinControl).Visible := False; // Visible False시키지 자기 자신이 선택되버린다.
if (source is TPanel) and (sender is TPanel) then
begin
Accept := True;
TPanel(sender).color := clnavy;
end
else
begin
Accept := False;
TPanel(sender).cursor := crDefault;
end;
if (state = dsDragLeave) then
TPanel(sender).color := clwhite;
(sender as TWinControl).Visible := True
end;
end.