【发布时间】:2016-10-28 12:07:33
【问题描述】:
我想使用 Lazarus 创建 Windows GUI 应用程序,该应用程序能够将文件从资源管理器拖到 TEdit 小部件并显示文件路径。
我已经阅读并尝试了一些 delphi 教程,它说您需要处理 WM_DROPFILES 消息,但我仍然无法使其正常工作。所以我在想我是否应该首先尝试简单的方法,让应用程序能够将文件拖动到 TForm。
所以我关注了this example,但也没有用。
这里是完整的代码:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
ShellAPI;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
protected
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(self.Handle, True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(self.Handle, False);
end;
procedure TForm1.WMDropFiles(var Msg: TMessage);
begin
ShowMessage('hello'); // never gets called
end;
end.
TForm1.FormCreate 和 TForm1.FormDestroy 工作正常,但永远不会调用 TForm1.WMDropFiles 方法。
有人知道解决办法吗? Lazarus/Free-Pascal windows 库的行为可能与 Delphi 的不同吗?
仅供参考,我在 Windows 7 64 位上使用 lazarus-1.6.0-fpc-3.0.0-win32。
【问题讨论】:
-
应该是number 2。
-
不,我已经检查了 lazarus 应用程序进程具有与资源管理器进程相同的中等优先级。我还制作了具有相同功能且运行良好的 c++ 应用程序。
-
依赖窗体的窗口不被重新创建是一个很大的错误。创建一个您可以控制其生命的窗口句柄。在 Delphi 中分配 HWnd。
-
@DavidHeffernan:如果我错了,请纠正我,Lazarus 中似乎不存在 AllocateHWnd。
-
@david:不,我知道这意味着什么。谢谢。
标签: drag-and-drop lazarus freepascal