当方、Lazarus2.0.8+windows10(64bit)の環境です。
タイトル通りLazarusで別プロセスからのドラッグ&ドロップを受け取りたいのですがうまくいきません。
問題の切り分けのために最小構成のコードで実験しましたが動きません。
まずその最小構成のコードを示します(40行程度です)
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,Shellapi,
windows;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
protected
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
begin
showmessage('D&D');
end;
end.
上記のコードでビルドすると、ドラッグしていったときに、カーソルの形がドロップ可能に変わるので、"DragAcceptFiles(Handle, True);"は、正常に機能していると思われます。
しかし、この状態からドロップしても何も起きません。
ドロップが正常に処理されていれば”D&D”のメッセージが出るはずなのですが。
推測ですが、”procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);”が実行されていないのではないかと思います。
WM_DROPFILESメッセージが飛んできてないとは考えにくいので、メッセージの振り分けが適切にされていないのではないかと思います。
この現象についてなにか(できれば解決法)情報をお持ちの方がいましたらご教示ください。
//15年ほど間にdelphi6+win2kの環境で同様のコードを書いたときは問題ありませんでした。
どうしても WM_DROPFILES を使用したければ別ですが,
こんな方法もあります.
フォームに TApplicationProperties コンポーネント (Additional] タブ) を配置します.
その OnDropFiles イベントで処理する方法です.
以下も参考にしてください.
[DelphiとLazarusでのドロップファイル処理の違い: M&IのNightly Build]
http://m-and-i.cocolog-nifty.com/freetalk/2017/04/delphilazarus-6.html
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
procedure TForm1.ApplicationProperties1DropFiles(Sender: TObject;
const FileNames: array of String);
begin
showmessage('D&D');
end;
Mr.XRAYさま
回答ありがとうございます。
TApplicationProperties コンポーネントを使ってみたところ、問題なく動作しました。
「M&IのNightly Build」のほうも確認しましたが、ドラッグ受け取りを許可するメソッドが違うのですね。
本当に助かりました。
ツイート | ![]() |