我试图实现一个简单的拖放面板,用户可以从Windows资源管理器中删除文件。在找到this线程后,基本功能已经正常工作。
现在我正在尝试更改面板的颜色,同时用户正在拖动文件。我尝试使用OnDragOver,但没有任何反应。我做错了什么?
这是我目前的代码:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellApi,
Vcl.ExtCtrls, Vcl.Imaging.pngimage;
type
TPanel = class(Vcl.ExtCtrls.TPanel)
protected
procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;
procedure CreateWnd; override;
procedure DestroyWnd; override;
end;
TfrmMain = class(TForm)
panFileDrop: TPanel;
lblFileName: TLabel;
procedure panFileDropDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TPanel.CreateWnd;
begin
inherited;
DragAcceptFiles(Handle, true);
end;
procedure TPanel.DestroyWnd;
begin
DragAcceptFiles(Handle, false);
inherited;
end;
procedure TPanel.WMDropFiles(var Message: TWMDropFiles);
var
c: integer;
fn: array[0..MAX_PATH-1] of char;
begin
c := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH);
if c <> 1 then
begin
MessageBox(Handle, 'Too many files.', 'Drag and drop error', MB_ICONERROR);
Exit;
end;
if DragQueryFile(Message.Drop, 0, fn, MAX_PATH) = 0 then Exit;
frmMain.lblFileName.Caption := fn;
end;
procedure TfrmMain.panFileDropDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
panFileDrop.Color := $00d4d3d2;
end;
end.
答案 0 :(得分:4)
问题
德尔福的Drag'n'drop概念与COM拖拽无关
Borland在同一应用程序中实现了轻量版拖放功能
这非常有效,但不支持应用程序之间的DnD操作。 COM拖放需要您使用操作系统注册放置目标并接受相关的鼠标消息。在任何时候,COM拖放都不会产生标准的OnDragOver
事件
在the documentation这种混乱的来源时,我担心it does not make clear会产生误导。
您正在将基于Windows消息的代码TPanel.WMDropFiles(var Message: TWMDropFiles)
与Borland的实现混合使用,仅供应用程序内使用:TfrmMain.panFileDropDragOver(...)
这两个选项存在于平行宇宙中
如果你想用COM方式,你需要一直使用COM。
解决方案
在您完成COM并需要实现WMDropFiles
以及所需的所有复杂性之前,IDropTarget
选项仍然是一个“轻量级”解决方案。
我对你的问题的回答是不要发明你自己的拖放,而是继续进行intertubes并下载:https://github.com/DelphiPraxis/The-Drag-and-Drop-Component-Suite-for-Delphi
这是Anders Melander着名套房的最新版本,曾经是:http://melander.dk/delphi/dragdrop/
这实现了基于COM的拖放操作,一次解决了所有问题 它本身就是美丽代码的一个很好的例子 以special note of the demos为准。 shelldragdrop的东西应该涵盖你的用例。