【问题标题】:Delphi - Drag and Drop + MouseDown + MouseUpDelphi - 拖放 + MouseDown + MouseUp
【发布时间】:2016-04-19 13:38:29
【问题描述】:

我正在开发一个拖放应用程序,当将项目拖放为默认DragCursors 的以下列表时,我对默认DragCursor 感到困扰:

所以我正在尝试开发一种新的方式让用户看到像 GMAIL 这样的 Drag 'n Drop 运动:

我的问题是: 是否有可能在 Delphi 7 中同时使用拖放事件和鼠标事件?

如果我将dmAutomatic 放入DragMode,则MouseDown 事件不起作用,如果我将dmManual 放入DragModeMouseDown 工作正常,但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;

对不起,我的问题很简单,但我不知道该怎么做......

非常感谢!

【问题讨论】:

    标签: delphi drag-and-drop delphi-7


    【解决方案1】:

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

    来自 D7 文档:

    说明

    使用 OnStartDrag 事件处理程序实现特殊处理时 用户开始拖动控件或其包含的对象。 OnStartDrag 仅在 DragKind 为 dkDrag 时发生。

    ...

    OnStartDrag 事件处理程序可以创建一个 TDragControlObjectEx DragObject 参数的实例以指定拖动光标,或者, 可选地,拖动图像列表。

    【讨论】:

      【解决方案2】:

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

      在 cmAutomatic 中,您是在告诉组件在左键向下时自动启动拖放操作。在 dmManual 中,您负责通过从 MouseDown 事件中调用 BeginDrag 来启动拖动操作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2014-01-31
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多