Delphi-拖放&x2B;鼠标向下+;事件

Delphi-拖放&x2B;鼠标向下+;事件,delphi,drag-and-drop,delphi-7,Delphi,Drag And Drop,Delphi 7,我正在开发一个拖放应用程序,当拖放一个项目时,我对默认的DragCursor感到不安,因为下面列出了默认的DragCursors: 因此,我正在尝试开发一种新的方式,让用户看到GMAIL这样的拖放运动: 我的问题是: 在Delphi7中是否可以将拖放事件与鼠标事件一起使用 如果我将dmAutomatic放入DragMode中,则MouseDown事件不起作用;如果将dmManual放入DragMode中,则MouseDown工作正常,但DragDrop事件不起作用 下面是我的代码: ty

我正在开发一个拖放应用程序,当拖放一个项目时,我对默认的
DragCursor
感到不安,因为下面列出了默认的
DragCursors

因此,我正在尝试开发一种新的方式,让用户看到GMAIL这样的拖放运动:

我的问题是: 在Delphi7中是否可以将拖放事件与鼠标事件一起使用

如果我将
dmAutomatic
放入
DragMode
中,则
MouseDown
事件不起作用;如果将
dmManual
放入
DragMode
中,则
MouseDown
工作正常,但
DragDrop
事件不起作用

下面是我的代码:

type
  TForm1 = class(TForm)
    pnlInformacaoDragDrop: TPanel;
    pnl1: TPanel;
    pnl2: TPanel;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure pnl1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure pnl2DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure pnl2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure pnl1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure pnl1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pnl1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(Self) then
  begin
    if pnlInformacaoDragDrop.Visible then
    begin
      pnlInformacaoDragDrop.Left :=X + 10;
      pnlInformacaoDragDrop.Top := Y + 10;
    end;
  end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(Self) then
  begin
    if not pnlInformacaoDragDrop.Visible then
      pnlInformacaoDragDrop.Visible := True;

//    img1.BeginDrag(True);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(Self) then
  begin
    if pnlInformacaoDragDrop.Visible then
      pnlInformacaoDragDrop.Visible := False;
  end;
end;

procedure TForm1.pnl1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  TPanel(Sender).Caption := TPanel(Sender).Caption + ' - ' + TPanel(Source).Caption;
end;

procedure TForm1.pnl2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  TPanel(Sender).Caption := TPanel(Sender).Caption + ' - ' + TPanel(Source).Caption;
end;

procedure TForm1.pnl2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := true;
end;

procedure TForm1.pnl1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := true;
end;
对不起,我的问题很简单,但我不知道怎么做

非常感谢

拖放是一种模式操作。当按钮按下时,它必然会随着鼠标事件潜逃,以便为拖动操作提供服务

在cmAutomatic中,您告诉组件在左下按钮上自动启动拖放操作。在dmManual中,您负责通过在MouseDown事件中调用BeginDrag来启动拖动操作


在不抓取实际Windows鼠标事件(WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP等)的情况下,VCL拖放机制将隐藏更高级别的鼠标事件。但是,如果您决定直接处理这些消息,您还将破坏拖放机制。如果不小心管理事件和拖放子系统,您很容易使事情变得非常糟糕。

您可以使用
dmAutomatic
并为
OnStartDrag
事件编写处理程序,而不是尝试使用的鼠标事件

从D7文档:

描述

在以下情况下,使用OnStartDrag事件处理程序实现特殊处理: 用户开始拖动控件或其包含的对象。 仅当DragKind为dkDrag时,才会发生OnStartDrag

OnStartDrag事件处理程序可以创建TDragControlObjectEx 用于指定拖动光标的DragObject参数的实例,或, (可选)拖动图像列表