delphi.gif (306 バイト) ドラッグ&ドロップの使い方


toach.gif (917 バイト) Explorerからファイルをドロップするには

ここをクリックしてください。

 

toach.gif (917 バイト) エディットボックスからフォームにドロップするには

  1. フォームのDropTargetプロパティをTrueにします。このプロパティはオブジェクトインスぺクタに表示されないので、コードで記述します。
  2. オブジェクトインスぺクタのイベントタブで、フォームのOnDragOverイベントハンドラを追加します。その中でAcceptパラメータの値をTrueにして返します。
  3. オブジェクトインスぺクタのイベントタブで、フォームのOnDragDropイベントハンドラを追加します。その中でドロップされたときの具体的な処理を記述します。
  4. エディットボックスをクリックしてオブジェクトインスペクタにエディットボックスのプロパティを表示させます。
  5. DragModeプロパティをdmAutomaticに設定します。
  6. イベントタブでOnDragOverイベントハンドラを追加します。その中でAcceptパラメータをTrueにして返します。

上の方法では、エディットボックスの内容を編集できないので、マウスボタンを押したときエディットボックスの内容をドラッグできるようにするには5.以下を次のように変更します。

  1. DragModeプロパティをdmManual(default)にします。
  2. ドラッグしたいエディットボックスにOnMouseDownイベントハンドラを追加します。その中にBeginDrag(True)を追加します。
  3. イベントタブでOnDragOverイベントハンドラを追加します。その中でAcceptパラメータをTrueにして返します。

toach.gif (917 バイト) エディットボックスからエディットボックスへドロップするには

  1. ドラッグ側の処理は上記の通りとします。
  2. ドロップ側のエディットボックスをクリックして、オブジェクトインスペクタでイベントタブを選びます。
  3. OnDragDropイベントハンドラを追加して、ドロップされたときの処理を記述します。
  4. OnEndDragイベントハンドラを追加して、ドロップされたテキストが表示されるようにUpdateメソッドを処理に追加します。

 

delphi1.gif (322 バイト) サンプル

DragDrop.jpg (7719 バイト)

unit DragDrop1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure Edit1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure Edit1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure Edit1EndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure Edit2DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure Edit2EndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  s: string;
begin
  s := 'X = ' + IntToStr(X) + '  Y = ' + IntToStr(Y) + ' Sender = ' +
  Sender.ClassName + ' Source = ' + Source.ClassName;
   MessageDlg(s, mtInformation, [mbOK], 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DropTarget := True;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := True;
end;

procedure TForm1.Edit1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TEdit then
  begin
    Edit1.Text := (Source as TEdit).Text;
  end;
end;

procedure TForm1.Edit1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := True;
end;

procedure TForm1.Edit1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  Edit1.Update;
end;

procedure TForm1.Edit2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TEdit then
  begin
    Edit2.Text := (Source as TEdit).Text;
  end;
end;

procedure TForm1.Edit2EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  Edit2.Update;
end;



procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Edit1.BeginDrag(True);;
end;

end.

-

toach.gif (917 バイト) Explorerからファイルをドロップするには

Explorerやファイルマネージャからファイルをドロップするには、Drag&DropのWin32 APIを使ってドロップする必要があります。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellApi;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); 
var
  FileName: array[0..260] of Char;
  i, n: Integer;
begin
  // ドロップされたファイル数を得る
  n := DragQueryFile(Msg.Drop, $ffffffff, nil, SizeOf(FileName));

  // ファイル名をMemo1に追加
  for i := 0 to n do
  begin
    DragQueryFile(Msg.Drop, i, FileName, SizeOf(FileName));
    Memo1.Lines.Add(FileName);
  end;
  // ドロップの終了
  DragFinish(Msg.Drop);
end;

end.