Listviewからドラッグ&ドロップするには。

解決


吉田  2009-06-10 21:30:39  No: 34677

環境は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;


monaa  2009-06-10 23:31:25  No: 34678

WM_DROPFILESはトップレベルウィンドウのみ受け取れたはずです。
各ウィンドウでDragDropに対応させたい場合はOLEを使わないとだめだったと思います。
実装は初心者には不可能なのでコンポーネントを探してみてください。
あー初心者には不可能ってのは実装できたらその人はもはや初心者では無いって意味です。


ofZ  2009-06-11 01:07:28  No: 34679

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;


吉田  2009-06-11 04:34:05  No: 34680

monaa さん
ofZさん有り難うございました。
ofZさんの方法でうまくいきました。
あとは、複数のファイルをドロップしたとき出来るように
研究してみます。
またよろしくお願いします。
Listviewを動的に作成しているものですから、手間取りました。
では。


吉田  2009-06-11 04:35:57  No: 34681

自己レスです。
解決マークを忘れました。すみません。


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

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






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