Lazarusで別プロセスからのドラッグ&ドロップ

解決


caballero  2020-07-19 14:00:34  No: 148943

当方、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の環境で同様のコードを書いたときは問題ありませんでした。


Mr.XRAY  2020-07-19 15:17:52  No: 148946

どうしても 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;


caballero  2020-07-19 16:43:20  No: 148947

Mr.XRAYさま

回答ありがとうございます。
TApplicationProperties コンポーネントを使ってみたところ、問題なく動作しました。
「M&IのNightly Build」のほうも確認しましたが、ドラッグ受け取りを許可するメソッドが違うのですね。
本当に助かりました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加