いつもお世話になっております。
環境は、windows8、
開発環境は、turboDelphi2006、lazarus(FreePascal) 1.08です。
現象は、windows8上で、ドラッグドロップでファイルを読み込ませる際、
ドラッグドロップの機能(ブレークポイントにも全く反応しない、引っかからない)が動いていない、
というものです。
開発環境側がWindowsXPやVistaの時は正常に動いていたソースで、です。
色々調べたところ、管理者権限で実行するプログラムがあったり、
UACをOFF等にしたりすると、同現象が発生する場合がある、
までは判りました。
こちらの開発環境では、古いソフトを使うなどしているので、
上記に思い当たる節はあるのですが、
別のPC(WIN7)で、試しにそのWin8で開発したソフトを動かしたところ、
全く反応しませんでした。
何とか、Win8上(最悪の場合、他環境だけでも)でドラッグドロップを、
有効にする方法はないでしょうか?
出来れば、プログラム側で対応出来れば、ベストなのですが・・・。
上記の問題で作業が止まっている状態です。
どなたかお知恵をお貸しいただけないでしょうか?
ドラッグドロップというのが、アイコンへのドラッグか、フォームへの
ドラッグかによって処理は変わります。どちらかは確定できませんが、
問題点の内容から後者であると仮定して話を進めます。
最小限の構成では試されましたか?
下記は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;
あ さん、ありがとうございます。
必要最小限で試してみました。
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.
何とか解決しました。
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.
Lazarusの存在自体は知っていましたが、こういう書き方になるのですね。
しばらく使う予定はありませんが、参考となりました。
それと、Windows8では、このような細工をしないと動かないものなの
でしょうか。検証された結果が出ているので間違いはないのでしょうが、
WMDropFilesは頻繁に使われるものでOSの下位互換性の観点で、問題なく
動くものと考えてしまっていました。
(手元にWindows8の環境が1つもないので、稼働検証ができませんが。)
>あ さん
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なんですけどね・・・;。
ツイート | ![]() |