function IsDirectory(Dir: WideString): Boolean;
var
F: TWin32FindDataW;
Handle: HWnd;
begin
Handle := FindFirstFileW(PWideChar(Dir), F);
if Handle <> INVALID_HANDLE_VALUE
then
begin
Result := ((f.dwFileAttributes
and faDirectory) = faDirectory);
Windows.FindClose(
Handle);
end else
Result := False;
end;
procedure FindAllFiles(
var FileList: TStrings; RootFolder:
string; Mask:
string =
'
*.*'; Recurse: Boolean = True);
var
SR: TSearchRec;
begin
if AnsiLastChar(RootFolder)^ <> '
\'
then
RootFolder := RootFolder + '
\';
if Recurse
then
if FindFirst(RootFolder + '
*.*', faAnyFile, SR) = 0
then
try
repeat
if SR.Attr
and faDirectory = faDirectory
then
// --> ein Verzeichnis wurde gefunden
// der Verzeichnisname steht in SR.Name
// der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
// RootFolder + SR.Name
if (SR.
Name <> '
.')
and (SR.
Name <> '
..')
then
FindAllFiles(FileList, RootFolder + SR.
Name, Mask, Recurse);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0
then
try
repeat
if SR.Attr
and faDirectory <> faDirectory
then
begin
// --> eine Datei wurde gefunden
// der Dateiname steht in SR.Name
// der vollständige Dateiname (inkl. Pfadangabe) ist
// RootFolder + SR.Name
FileList.Add(RootFolder + SR.
Name);
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
procedure TForm1.WMDROPFILE(
var msg: TMessage);
var LCount, Lanzahl, Lsize: integer;
LDateiname: PChar;
List: TStringList;
i: Integer;
begin
LDateiname := '
';
Lanzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, LDateiname, 255);
for LCount := 0
to (Lanzahl - 1)
do
begin
Lsize := DragQueryFile(Msg.WParam, LCount,
nil, 0) + 1;
LDateiname := StrAlloc(Lsize);
DragQueryFile(Msg.WParam, LCount, LDateiname, Lsize);
List := TStringList.Create;
try
if IsDirectory(
String(LDateiName))
then
FindAllFiles(List,
String(LDateiName))
else
List.Add(
String(LDateiName));
for i := 0
to List.Count-1
do
If (ExtractFileExt(AnsiLowerCase(List[i])) = '
.ico')
or
(ExtractFileExt(AnsiLowerCase(List[i])) = '
.bmp')
or
(ExtractFileExt(AnsiLowerCase(List[i])) = '
.jpg')
or
(ExtractFileExt(AnsiLowerCase(List[i])) = '
.jpeg')
then
Listbox1.Items.add(List[i]);
finally
List.Free;
end;
// do Something with "LDateiname"
StrDispose(LDateiname);
end;
// FDropProc(LFileList);
DragFinish(Msg.WParam);
end;