ListBox1相互拖拽数据Demo

 
unit Unit1;



interface



uses

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

  Dialogs, StdCtrls, ShellApi;



type

  TForm1 = class(TForm)

    ListBox1: TListBox;

    DropFileListBox1: TListBox;

    Label1: TLabel;

    Label2: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure ListBox1Click(Sender: TObject);

    procedure ListBox1DblClick(Sender: TObject);

    procedure DropFileListBox1Click(Sender: TObject);

    procedure DropFileListBox1DblClick(Sender: TObject);

    procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;

      State: TDragState; var Accept: Boolean);

    procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);







  private

    procedure WMDROPFILES(var Msg: TMessage);

    procedure DropFileListBox1DropFiles(Sender: TObject;

      FileNames: TStringList);



    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;

  S: AnsiString;



implementation



{$R *.dfm}



procedure TForm1.WMDROPFILES(var Msg: TMessage);

var

  a : Integer;

  Buffer: Array[0..255] of Char;

begin

  a := DragQueryFile(Msg.wParam, $FFFFFFFF, Buffer, 255);

  for a := 0 to a - 1 do begin    // 处理选择多个文件

     DragQueryFile(Msg.wParam, a, Buffer, 255);  // 文件名就在Buffer里面了

     ListBox1.Items.Append(buffer);   // 将文件名称添加到ListBox1的最后

  end;

  DragFinish(Msg.wParam);

end;









procedure TForm1.FormCreate(Sender: TObject);

begin

  DragAcceptFiles(Handle, True);

  DropFileListBox1.OnDragDrop := listbox1.OnDragDrop;

  DropFileListBox1.OnDragOver := listbox1.OnDragOver;

  DropFileListBox1.MultiSelect := True;

  ListBox1.MultiSelect := True;

  DropFileListBox1.DragMode := dmAutomatic;

  ListBox1.DragMode := dmAutomatic;



end;



procedure TForm1.ListBox1Click(Sender: TObject);

begin

  S := ListBox1.Items.Strings[ListBox1.ItemIndex];   // 取文件路径及名称

end;



procedure TForm1.ListBox1DblClick(Sender: TObject);

begin

  ShellExecute(handle,'Open',PChar(S),nil,nil,SW_SHOWNORMAL);  // 打开文件

end;



procedure TForm1.DropFileListBox1DropFiles(Sender: TObject;

  FileNames: TStringList);

begin

 DropFileListBox1.Items.AddStrings(FileNames);  // 处理文件拖拽

end;



procedure TForm1.DropFileListBox1Click(Sender: TObject);

begin

  S := DropFileListBox1.Items.Strings[DropFileListBox1.ItemIndex];

end;



procedure TForm1.DropFileListBox1DblClick(Sender: TObject);

begin

  ShellExecute(handle,'Open',PChar(S),nil,nil,SW_SHOWNORMAL);  // 打开文件

end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;

  State: TDragState; var Accept: Boolean);

var

  aPoint: TPoint;

begin

  aPoint.x := x;

  aPoint.y := y;



  if (source is Tlistbox) then

    if ((source as Tlistbox).SelCount > 0) and ((sender as Tlistbox).ItemAtPos(apoint, true) <> -1)

      and ((sender as Tlistbox).itematpos(apoint, true) <> (sender as Tlistbox).itemindex) then

   begin

     accept := true;

   end;

end;







procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);

var

 aPoint: TPoint;

 st: string;

 p: integer;

 i, num: integer;

 MYlBox: TStrings;

begin

 aPoint.x := x;

 aPoint.y := y;



 p := (sender as Tlistbox).itematpos(aPoint, true);

 MYlBox := Tstringlist.Create;

 try

   Num := (source as Tlistbox).Items.Count;

   for i := num - 1 downto 0 do

   begin

    if (source as Tlistbox).Selected[i] then

    begin

     st := (source as Tlistbox).Items[i];

     MYlBox.Add(st)

   end;

  end;

   if p > -1 then

   begin

    for i := 0 to Mylbox.Count - 1 do

    begin

     (sender as Tlistbox).Items.Insert(p, mylbox[i])

    end;

   end

   else

   begin

    for i := Mylbox.Count - 1 downto 0 do

    begin

     (sender as Tlistbox).Items.Add(mylbox[i])

    end;

   end;



   (source as Tlistbox).DeleteSelected;

   if P > -1 then

    (sender as Tlistbox).Selected[p] := true;

   finally

     mylbox.Free;

   end;



end;



end.



你可能感兴趣的:(listbox)