Omdat ik nog weleens Drag and Drop gebruik voor mijn applicaties, met name voor bestanden en zelfs directories, en ik het beuh werd om steed in m'n oude code te kijken, ... hier een reminder voor mezelf en misschien een handigheidje voor anderen ...
Wat dit doet: Jouw Form accepteert nu drag and drop van bestanden en directories. Daarnaast werkt dit voor Mac gebruikers ook nog eens voor de Dock icon.
Stap 1 - Definieer toegestane bestand-extensies als een constante:
Ik heb het op dee manier gedaan, zodat ik het later ook nog eens kan gebruiken als een filter voor een Open- of SaveDialog Filter. Als voorbeeld:
const allowedExtensions = '*.mp3;*.m4a;*.mp4;*.m4r';
Stap 2 - Drag and Drop voor jouw Form aanzetten
Zet "AllowDropFiles" van jouw TForm op TRUE in de object inspector.
Stap 3 - Maak een "OnDropFiles" event voor jouw Form
procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
var RowCounter,Counter:integer;
begin
for Counter:=0 to Length(FileNames)-1 do
begin
if DirectoryExists(FileNames[Counter]) then
GetFilesInDirs(FileNames[Counter])
else
AddFile(FileNames[Counter]);
end;
end;
Stap 4 - Maak een functie die door de directories gaat
We willen niet alleen bestanden maar ook directories accepteren, dus moeten we door eventuele directories en sub-directories gaan om de bestanden te vinden.
procedure TForm1.GetFilesInDirs(Dir:string);
var DirInfo:TSearchRec;
begin
if FindFirst(Dir+DirectorySeparator+'*', faAnyFile and faDirectory, DirInfo)=0 then
repeat
if (DirInfo.Attr and faDirectory) = faDirectory then // it's a dir - go get files in dir
begin
if (DirInfo.Name<>'.') and (DirInfo.Name<>'..') then
GetFilesInDirs(Dir+DirectorySeparator+DirInfo.Name);
end
else // It's a file; add it
AddFile(Dir+DirectorySeparator+DirInfo.Name);
until FindNext(DirInfo)<>0;
FindClose(DirInfo);
end;
Stap 5 - Maak een functie om de gevonden bestanden aan een lijst of zo toetevoegen
Ik gebruik hier maar even een simpele TMemo, aan jou om je eigen lijst implementatie toe te voegen.
procedure TForm1.AddFile(Filename:string);
begin
if (FileName<>'') and (Pos(LowerCase(ExtractFileExt(Filename)), allowedExtensions)>0) then
begin
Memo1.lines.add(Filename); // write your own code here, this is just an example
end;
end;
en dat is alles ...