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.
![]()