[Delphi:91078] ドラッグしたファイル名の取得

275 views
Skip to first unread message

佐々木 義照

unread,
Feb 16, 2009, 7:36:54 AM2/16/09
to Del...@ml.users.gr.jp
フォームにドラッグしたフォルダ名を取得したくて、下記のサイトを参考にしています。
 
 
でも、total := DragQueryFile(msg.Drop, -1, nil, 0);でエラーになります。
 
対処法をご教示下さい。
なお、参考サイトでは、ファイル名を受け取るとありますが、フォルダ名も受け取れますよね?
 
よろしくお願いします。
ターボDELPHI +VISTA

unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ShellAPI, StdCtrls;
 
type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure WMDropFiles(var msg: TWMDropFiles);
    message WM_DROPFILES;
  public
    { Public 宣言 }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.DFM}
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  // ドラッグ&ドロップを受け付けることを Windows に教える
  DragAcceptFiles(Handle, True);
end;
 
procedure TForm2.WMDropFiles(var msg: TWMDropFiles);
var
  FileName: array[0..255] of Char;
  total, i: Integer;
begin
  // いくつのファイルがドロップされたかを得る
  total := DragQueryFile(msg.Drop, -1, nil, 0); //--------ここでエラー
  // ファイル名を1つずつ得る
  for i := 0 to total - 1 do begin
    DragQueryFile(msg.Drop, i, FileName, SizeOf(FileName));
    ListBox1.Items.Add(FileName);
  end;
  // ハンドルを解放
  DragFinish(msg.Drop);
end;
 
end.

高木太郎

unread,
Feb 16, 2009, 8:12:13 AM2/16/09
to Del...@ml.users.gr.jp
 こんばんは、イマジオムの高木です。

佐々木義照さん:


> total := DragQueryFile(msg.Drop, -1, nil, 0);でエラーになります。

 DragQueryFile(msg.Drop, Cardinal(-1), nil, 0) ではどうですか?
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/

佐々木 義照

unread,
Feb 16, 2009, 9:01:13 AM2/16/09
to Del...@ml.users.gr.jp
高木太郎さん、ありがとうございます。

今度はエラーにならず、コンパイルできました。

でも、この procedure TForm2.WMDropFiles(var msg: TWMDropFiles);にイベントが届いてないみたいです。

ListBox1.Items.Add(FileName);になんの表示もされません。

再度、ご教示願います。

Terry

unread,
Feb 16, 2009, 9:52:56 AM2/16/09
to Del...@ml.users.gr.jp
佐々木 義照 さん、こんにちは。Terry(寺田)です(^-^)

|今度はエラーにならず、コンパイルできました。

Delphi のデザイナで
フォームをWクリックしてソースコードが現れてからコンパイル
してみてください

違うかな?

o(^^ )o--------⊆^U)┬┬~...
Terry

佐々木 義照

unread,
Feb 16, 2009, 10:26:49 AM2/16/09
to Del...@ml.users.gr.jp
Terry(寺田)さん、こんばんわ

やってみましたが・・・

ダメでした。

---佐々木義照---

"寄木 康彦(Yasuhiko Yoriki)"

unread,
Feb 16, 2009, 11:10:02 AM2/16/09
to Del...@ml.users.gr.jp
寄木です。

同じコードで、Delphi2009Pro で試してみましたが、問題なく、
ListBoxにファイル名がドラッグアンドドロップした分だけ表示さ
れます。

原因は、違うところにありそうですが。

------------------------------------------------------------------
Windows Vista Ultimate *64 / Delphi 2007 Pro / Delphi 2009 Pro
Yasuhiko Yoriki 寄木康彦
mailto:yor...@yoriki.jp http://www.yoriki.jp/


佐々木 義照

unread,
Feb 16, 2009, 11:36:32 AM2/16/09
to Del...@ml.users.gr.jp
ありがとうございます。遅い時間で恐縮です。

私は Vista と ターボdelphi ですが。そのへんでしょうか?

コードの途中 (total :=DragQueryFile(msg.Drop, Cardinal(-1), nil, 0);) にブレークポイントを入れても止まりません。

ここの procedure は通ってないということですよね。

今日は遅いので、明日(?)お願致します。

---佐々木義照---

Terry

unread,
Feb 16, 2009, 12:13:45 PM2/16/09
to Del...@ml.users.gr.jp
Terry(寺田)です(^-^)

|コードの途中 (total :=DragQueryFile(msg.Drop, Cardinal(-1), nil, 0);) 
|にブレークポイントを入れても止まりません。

DragAcceptFiles(Handle, True);
にブレークポイントでは止まりますか?

佐々木 義照

unread,
Feb 16, 2009, 12:29:52 PM2/16/09
to Del...@ml.users.gr.jp
● DragAcceptFiles(Handle, True);

ここは、ブレークポイントで止まります。

ん~~。何が原因なんでしょう?

今日は、もう寝ます。
ありがとうございます。

---佐々木義照---


MoonDoldo

unread,
Feb 16, 2009, 7:02:56 PM2/16/09
to Del...@ml.users.gr.jp
 MoonDoldoです。

WindowsXP SP3
Delphi7

こちらでも同じ場所でエラーになりました。

total := DragQueryFile(msg.Drop, -1, nil, 0);

[エラー] Unit1.pas(36): 定数式が範囲を越えました

なので、以下の様に変更してみてはどうでしょう?
total := DragQueryFile(msg.Drop, Cardinal(-1), nil, 0);

--
ムーンドルド
do1...@king-postman.com

MoonDoldo

unread,
Feb 16, 2009, 7:10:05 PM2/16/09
to Del...@ml.users.gr.jp
 MoonDoldoです。

>なので、以下の様に変更してみてはどうでしょう?
> total := DragQueryFile(msg.Drop, Cardinal(-1), nil, 0);

・・・って既に同じ事を高木さんが言ってますね、失礼しました。

以下自分が以前に書いたコードです。
参考になりますでしょうか?

-------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,

Dialogs, StdCtrls, ShellAPI;

type
TForm1 = class(TForm)


ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }

public
{ Public 宣言 }
procedure FileDropHandler(var Msg: TWMDropFiles);
message WM_DROPFILES;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FileDropHandler(var Msg: TWMDropFiles);
var
Num: Word;
P: Integer;


FileName: array [0..255] of Char;

begin
//自分のウィンドゥをアクティブに設定
SetForegroundWindow(Self.Handle);
Self.SetFocus;

//ドロップされたファイルとフォルダを取得
Num := DragQueryFile(Msg.Drop, Cardinal(-1), nil, 0);
for P:= 0 to Num - 1 do
begin
DragQueryFile(Msg.Drop, P, FileName, SizeOf(FileName) - 1);
ListBox1.Items.Add(FileName);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
//メインフォームへのファイルのドラッグを許可
DragAcceptFiles(Self.Handle, LongBool(True));
end;

end.

Teppei Akao

unread,
Feb 16, 2009, 9:34:07 PM2/16/09
to Del...@ml.users.gr.jp
VISTAだと、デバッグモードではこの操作はうまくいかなかったような気がします。
実際に吐き出されたexe本体で確認してみてください。
もしかしたら管理者権限でDelphiを実行すればいくかもです(未確認ですが)
赤尾鉄平


佐々木 義照

unread,
Feb 16, 2009, 10:35:38 PM2/16/09
to Del...@ml.users.gr.jp
> VISTAだと、デバッグモードではこの操作はうまくいかなかったような気がします。
>

はい、解決です。

> 吐き出されたexe本体で

こっちでは正常に動きました。

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


Reply all
Reply to author
Forward
0 new messages