gpt4 book ai didi

drag-and-drop - 处理 WM_DROPFILES 消息在 Lazarus 中不起作用

转载 作者:行者123 更新时间:2023-12-04 06:01:05 24 4
gpt4 key购买 nike

我想使用 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.FormCreateTForm1.FormDestroy 工作正常,但永远不会调用 TForm1.WMDropFiles 方法。

有人知道解决办法吗? Lazarus/Free-Pascal windows 库的行为可能与 Delphi 的不同吗?

仅供引用,我在 Windows 7 64 位上使用 lazarus-1.6.0-fpc-3.0.0-win32。

最佳答案

DragAcceptFiles 不正确(对于 Lazarus),因为它是一个依赖于平台的代码))

有正确的跨平台代码:OnDropFiles - Only works with dock icon, not with Application Form

他不使用“Windows”、“Messages”和“ShellAPI”。

1 将 MainForm 的属性“AllowDropFiles”设置为 True;

2 程序声明:

  type
{ TMainForm }
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure OnApplicationDropFiles(Sender: TObject; const FileNames: array of String);
public
end;

3 程序:

procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.AddOnDropFilesHandler(@OnApplicationDropFiles);
end;

procedure TMainForm.OnApplicationDropFiles(Sender: TObject; const FileNames: array of String);
begin
ShowMessage('Files dropped');
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
Application.RemoveOnDropFilesHandler(@OnApplicationDropFiles);
end;

关于drag-and-drop - 处理 WM_DROPFILES 消息在 Lazarus 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38037656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com