Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus - Drag and Drop van files en directories op een Form voorbeeld

1 Berichten
1 Gebruikers
0 Reactions
1,920 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2869
Topic starter  

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 ... 


   
BeantwoordenCiteren
Deel: