エクスプローラからのファイルのドラッグ&ドロップに対応するには

解決


TAC  2003-01-08 07:03:18  No: 2517

メモ帳のようにエクスプローラ等からファイルがフォームにドラッグ&ドロップされたらそのファイルを開くようにしたいのですが、どのようにしたらいいのですか?
教えてください。


たかみちえ  URL  2003-01-08 07:16:28  No: 2518

ちょっと面倒ですけど、たいしたことをすることはありません。
他言語ですけど、
http://www.runan.net/
ここのプログラミングTips>C++(SDK)>ファイルドロップを受け取る[簡易編]
を見て取りつけてください。
(どうやら途中にDragAcceptFilesを使うと、うまくいかないことがあるようです、なので、OnCreateでやっておきましょう)


にしの  2003-01-08 07:39:29  No: 2519

Delphian Worldや、Torry's Delphi Pagesなどに、OLE Drag&Dropコンポーネントがあります。

Delphian World
http://home1.infonia.ne.jp/~delphian/delphi/

Torry's Delphi Pages
http://www.torry.net/

コンポーネントの追加さえできれば、あとは貼り付けてイベントを用意するだけですので簡単です。


TAC  2003-01-09 06:17:10  No: 2520

コンポーネントをダウンロードして試してみたんですけど、
普通にドロップしたときに開こうとしたら
「プロジェクト TextEditor.exe が EFOpenError クラスの例外を生成しました。
  'ファイル C\Program Files\Text.txt
  は開けません'
  プロセスは...

みたいなことが表示されます。
何か開く前にしなければいけないことがあるのですか?


にしの  2003-01-09 09:45:27  No: 2521

それだけでは、何をどうしたいのかわかりません。
何というコンポーネントを、どういう風に使ってみたんでしょうか。
ヘルプは添付されていませんか?


風来坊  2003-01-09 10:13:40  No: 2522

コンポーネントを使うようなので、余計なお世話かもしれませんが(^^;
知っていて損はないと思うので…。

type
  TForm1 = class(TForm)
  { 省略 }
  private
    procedure DropFiles(var Msg: TMESSAGE); message WM_DROPFILES;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //ドラッグアンドドロップを許可する
  DragAcceptFiles(Form1.Handle, True);
end;

//D&D処理
procedure TForm1.DropFiles(var Msg: TMESSAGE);
var 
  I, J: Integer;
  Buf: array [0..255] of Char;
begin
  J := DragQueryFile(Msg.WParam, $FFFFFFFF, Buf, 255);
  for I := 0 to J -1 do begin
    DragQueryFile(Msg.WParam, I, Buf, 255);
    ListBox1.Items.Add(Buf);
  end;
  DragFinish(Msg.WParam);
end;

これでフォームにドラッグアンドドロップすると
ListBoxにドロップされたファイルのパスが追加されます。
尚、uses節にShellAPIが必要です。


TAC  2003-01-12 19:27:48  No: 2523

返事が遅くなってすみません。

>それだけでは、何をどうしたいのかわかりません。
>何というコンポーネントを、どういう風に使ってみたんでしょうか。
>ヘルプは添付されていませんか?
OleDnDというコンポーネントを使いました。
readmeファイルはついていますが、具体的な使い方は書いてありませんでした。

あと、風来坊さんの方法を試してみたのですが、
「Shell.dcuがありません」
とエラーになります。


にしの  2003-01-12 21:24:34  No: 2524

Delphi5で試したところ、エラーなくファイルを読み込んでいます。
使い方は簡単ですよ。

1.TFileDropTargetをフォームに貼り付けます。
2.ドロップしたいコンポーネントを、WinControlプロパティに設定します。
3.OnFileDropイベントに、ファイルがドロップされたときの処理を書きます

これだけです。
たとえば、
try
  Memo1.Lines.LoadFromFile(FileDropTarget1.DroppedFiles.Strings[0]);
except
  ;
end;
と書けば、ドロップされたファイルの1つ目がMemo1に読み込まれます。
同じようにやっているのであれば、エラーの原因は別にあると思います。


TAC  2003-01-13 04:10:55  No: 2525

にしのさんの方法でやったら成功しました。
DroppedFiles.Strings[0] を DroppedFiles.Text にしていたのがいけなかったみたいです。
皆さん協力してくださり、ありがとうございました。


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

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






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