windows 8上でドラッグドロップが動かない

解決


RAD命  2013-06-23 21:24:08  No: 44726

いつもお世話になっております。

環境は、windows8、  
開発環境は、turboDelphi2006、lazarus(FreePascal)  1.08です。

現象は、windows8上で、ドラッグドロップでファイルを読み込ませる際、
ドラッグドロップの機能(ブレークポイントにも全く反応しない、引っかからない)が動いていない、
というものです。

開発環境側がWindowsXPやVistaの時は正常に動いていたソースで、です。

色々調べたところ、管理者権限で実行するプログラムがあったり、
UACをOFF等にしたりすると、同現象が発生する場合がある、
までは判りました。

こちらの開発環境では、古いソフトを使うなどしているので、
上記に思い当たる節はあるのですが、

別のPC(WIN7)で、試しにそのWin8で開発したソフトを動かしたところ、
全く反応しませんでした。

何とか、Win8上(最悪の場合、他環境だけでも)でドラッグドロップを、
有効にする方法はないでしょうか?

出来れば、プログラム側で対応出来れば、ベストなのですが・・・。

上記の問題で作業が止まっている状態です。
どなたかお知恵をお貸しいただけないでしょうか?


  2013-06-23 21:57:03  No: 44727

ドラッグドロップというのが、アイコンへのドラッグか、フォームへの
ドラッグかによって処理は変わります。どちらかは確定できませんが、
問題点の内容から後者であると仮定して話を進めます。

最小限の構成では試されましたか?

下記はWindows7 + Delphi6で動きます。
Windows7 のデフォルト設定のままのUAC下でも問題なくです。
もし途中で処理が止まっているとすれば、他の部分の問題でしょう。
他の処理部分を疑った方がよろしいかと思います。

---

usesに ShellAPI を追加する。 

フォームのType中のPrivate宣言に以下の2行を追加する。
{ Private 宣言 }
procedure WMDropFiles(var Msg: TWMDropFiles);
  message WM_DROPFILES;

フォームのCreateイベントに以下の記述を追加する。
DragAcceptFiles(Handle, True);

最後に以下の手続きを実現部に追加する。
procedure TForm1.WMDropFiles(var Msg:TWMDropFiles);
var
  FileName: array [0..255] of Char;
begin
  DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
  ShowMessage(FileName);
  DragFinish(Msg.Drop);
end;


RAD命  2013-06-23 23:27:20  No: 44728

あ  さん、ありがとうございます。

必要最小限で試してみました。

Delphi3では、問題なく動き、

TurboDelphiでは、
    「管理者として実行」をOFFにし、
    「互換性の設定」を「windows 7」に変えたところ、
    無事動作しました。

しかし、Lazarusの方は、何をやっても動作しません。

ソースはほぼDelphiの場合と同じですが、念の為載せます。

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  windows, messages, shellapi,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  procedure WMDropFiles(var Msg: TWMDropFiles);
  message WM_DROPFILES;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

procedure TForm1.WMDropFiles(var Msg:TWMDropFiles);
var
  FileName: array [0..255] of Char;
begin
  DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
  ShowMessage(FileName);
  DragFinish(Msg.Drop);
end;

end.


RAD命  2013-06-24 00:44:14  No: 44729

何とか解決しました。
Lazarusの方の原因は、windows 8ではなく、ソースの記述方法でした;。
以下サイトを参考にして必要最小限の構成で動かしたところ、無事動きました。

らざるー
TForm.AllowDropFiles
https://sites.google.com/site/lazarue777/home/lazarus-lcl-help/tform/tform-allowdropfiles

これで何とか先に進めそうです。

以下は動作したソースです。

ありがとうございました。

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
  private
    { private declarations }
    procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
  public
    constructor Create(TheOwner: TComponent); override;
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

constructor TForm1.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  Self.AllowDropFiles := True;
  Self.OnDropFiles  := @FormDropFiles;
end;

procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
var
  i: Integer;
  file_name: String;
begin
  for i := Low(FileNames) to High(FileNames) do begin
    file_name := FileNames[i];
    showmessage(file_name);
  end;
end;

end.


  2013-06-24 01:52:45  No: 44730

Lazarusの存在自体は知っていましたが、こういう書き方になるのですね。
しばらく使う予定はありませんが、参考となりました。

それと、Windows8では、このような細工をしないと動かないものなの
でしょうか。検証された結果が出ているので間違いはないのでしょうが、
WMDropFilesは頻繁に使われるものでOSの下位互換性の観点で、問題なく
動くものと考えてしまっていました。
(手元にWindows8の環境が1つもないので、稼働検証ができませんが。)


RAD命  2013-06-24 03:40:40  No: 44731

>あ  さん

windows 8は、それ以前のOSとは、結構、違う所が多いです。
OS初期インストールの状態だと、VisualStudio(2008)のインストールですらコケます^^;。

勿論Delphi(ボーランド時代の古い物限定かも)も、
インストールで例外なくコケます。

USキーボード設定をインストールしてあげれば、大体はインストール自体は成功するのですが。

色々小細工というか、設定とか、ググって調べて設定すれば動きますが、
TurboDelphiの場合、
互換モードのチェックを外すと、IDEが起動時にライブラリを読み込めずに、
またしてもコケます。

Delphiネタでは無いですが、
Node.Jsとか、そこら辺もwindows 8はこけてくれて、
中々、斬新すぎてるというか、プロトタイプ的過ぎて、Windows Xpや7が懐かしくなったり…。

自分の場合、お仕事<趣味  の比重が大きくても許される(Win8は余り重要なことには使ってない)ので、
当分Win8ですが、
もし、これから何か仕事に使うとして、Win8か、7どちらかを選べと言われたら、
多分7を取ります^^;。

8、それ以外では軽くて速い、良いOSなんですけどね・・・;。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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