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参数的实例,或,
(可选)拖动图像列表