環境はWindows XP Delphi6 Personalです。
メインFormにListboxと
動的に作成するListview(エクスプローラの詳細表示と同じようなファイルリスト)
があります。(作成時にListview.DragMode:=dmAutomatic;)
ListboxへドロップしたときとFormへドロップしたときの処理を分けています。
いろいろ参考サイトを探して下記のようにしています。
自分の能力ではなくコピペです。
エクスプローラからのドラッグ&ドロップは旨く行きます。
しかし、Form上のListviewからファイルリストをドラッグ&ドロップ出来ません。
道路標識の通行止めのようなマークがでます。
参考サイトもエクスプローラからのドロップ例で、解決できません。
Listviewから選択した行(ファイル)をドラッグドロップする方法を教えて頂けないでしょうか。
よろしくお願いいたします。
private
//------------ドラッグドロップのフック関数変数
ListBox3OldProc: TWndMethod;
Form1OldProc: TWndMethod;
//----------------------------------
procedure ListBox3NewProc(var message: TMessage);
procedure Form1NewProc(var message: TMessage);
procedure TForm1.FormCreate(Sender: TObject);
Form1OldProc := Form1.WindowProc;// 以前のプロシージャを保存
Form1.WindowProc := Form1NewProc;// 新しいプロシーシャをセット
DragAcceptFiles(Form1.Handle, True);// ファイル受け取りの登録
ListBox3OldProc := ListBox3.WindowProc;// 以前のプロシージャを保存
ListBox3.WindowProc := ListBox3NewProc;// 新しいプロシーシャをセット
DragAcceptFiles(ListBox3.Handle, True);// ファイル受け取りの登録
end;
//フォームへのドロップを受け取る
procedure TForm1.Form1NewProc(var message: TMessage);
begin
if message.Msg = WM_DROPFILES then
begin // WM_DROPFILES の処理を横取りする
・・省略
end;
//Listboxへのドロップを受け取る
procedure TForm1.ListBox3NewProc(var message: TMessage);
begin
if (message.Msg = WM_DROPFILES) and (ListBox3.Visible=true) then
begin // WM_DROPFILES の処理を横取りする
・・・省略
end;
WM_DROPFILESはトップレベルウィンドウのみ受け取れたはずです。
各ウィンドウでDragDropに対応させたい場合はOLEを使わないとだめだったと思います。
実装は初心者には不可能なのでコンポーネントを探してみてください。
あー初心者には不可能ってのは実装できたらその人はもはや初心者では無いって意味です。
ListboxとListviewが同じフォーム上にあるのであれば、こういうことでしょうかね?
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source = ListView1;
end;
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source = ListView1 then begin
if ListView1.Selected <> nil then begin
ListBox1.Items.Add(ListView1.Selected.Caption);
end;
end;
end;
monaa さん
ofZさん有り難うございました。
ofZさんの方法でうまくいきました。
あとは、複数のファイルをドロップしたとき出来るように
研究してみます。
またよろしくお願いします。
Listviewを動的に作成しているものですから、手間取りました。
では。
自己レスです。
解決マークを忘れました。すみません。
ツイート | ![]() |